Strony

poniedziałek, 17 listopada 2025

AI uczy się (szybko) programować Virtuino

 

Będąc (nie)młodym elektronikiem zawsze uważałem programowanie za upierdliwy acz niezbędny dodatek do swoich wspaniałych mikroprocesorowych projektów. Co gorsza aplikacje HMI obsługujące dostęp do tych systemów mikroprocesorowych to już zupełna domena programistów. Trwało to latami aż do momentu pojawienia się zdolnego młodego asystenta zakochanego wręcz w programowaniu ale który nie potrafi przylutować nawet prostego opornika. Czy uda się z sukcesem połączyć moje i jego zdolności? Dziś o tym jak AI może pomóc w tworzeniu projektów dla VIRTUINO

Oczywiście wstępną grafikę tego bloga też przygotował mój asystent. Ale do rzeczy

Na stronie https://virtuino.blogspot.com/2025/10/virtuino-iot-skryty-dowolne.html umieściłem przykład jak AI zaprogramował skrypt dla VIRUINO. Szybko i bezbłędnie i bez konieczności uczenia się całego tego JavaScript. Skrypty to naprawdę potężna broń by móc dowodnie kształtować działanie  aplikacji i całego systemu mikroprocesorowego bez  konieczności przeprogramowywania modułów. Trzeba tylko zmienić filozofię działania systemu (co już powoli się dzieje) by zwiększyć rolę aplikacji w jego funkcjonowaniu. Do tej pory VIRTUINO jako standardowy HMI służył do wizualizacji pracy systemu ewentualnie do zadawania jakiś wartości sterujących. Teraz jest szansa by aktywnie przejąło na siebie część zadań funkcjonalnych do tej pory realizowanych na poziomie mikrokontrolerów. "Zacieśnianie" współpracy między modułami już powoli ma miejsce ale z dużą nieśmiałością. Ciągle pracuję nad tym jak przekształcić system by realizacje funkcji wymagających wspólnych działań więcej niż jednego modułu koordynowane przez aplikację VIRTUINO nie rozsypały totalnie systemu w przypadku "padnięcia" aplikacji. Czyli jakie fragmenty sterowania systemu muszą na zawsze pozostać na poziomie mikrokontrolerów a co można przenieść poziom wyżej do VIRTUINO. Ale to jeszcze przede mną.

Na razie uczę się współpracy z nowym asystentem by maksymalnie wykorzystać jego możliwości w ewentualnym docelowy przekształceniu mojego systemu domowej automatyki.

Prawie dwa lata temu zapytałem AI o kod połączenia Virtuino z mikrokontrolerem za pomocą protokołu Websocket https://100-x-arduino.blogspot.com/2024/01/ai-sztuczna-inteligencja-czyli-o.html.

Wynik nie był powalający a AI mocno tłumaczył się ze swojej niewiedzy.

Obecnie powtórzyłem identyczne pytanie i wynik był zgoła inny

#include <WiFi.h>
#include <WebSocketsServer.h>

const char* ssid     = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";

// Virtuino IoT WebSocket – zalecany port 8000
WebSocketsServer webSocket = WebSocketsServer(8000);

// Przykładowe zmienne (Virtuino może ich używać)
float V0 = 0;  
float V1 = 0;

int ledPin = 2;     // GPIO2 – dioda LED
bool ledState = false;

// ---- Odbiór danych od Virtuino ----
void handleMessage(String msg, uint8_t clientID) {

  Serial.println("Odebrano: " + msg);

  // Format Virtuino IoT:   VAR=VALUE
  // Przykład:              V0=1

  if (msg.startsWith("V0=")) {
    V0 = msg.substring(3).toFloat();

    if (V0 == 1) {
      ledState = true;
      digitalWrite(ledPin, HIGH);
    } else {
      ledState = false;
      digitalWrite(ledPin, LOW);
    }

    // potwierdzenie do Virtuino
    webSocket.sendTXT(clientID, "V0=" + String(V0));
  }

  if (msg.startsWith("V1=")) {
    V1 = msg.substring(3).toFloat();
    webSocket.sendTXT(clientID, "V1=" + String(V1));
  }
}

// ---- Obsługa WebSocket ----
void wsEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {

  switch (type) {

    case WStype_CONNECTED:
      Serial.printf("Virtuino połączone: Client %u\n", num);
      break;

    case WStype_DISCONNECTED:
      Serial.printf("Virtuino rozłączone: Client %u\n", num);
      break;

    case WStype_TEXT:
      handleMessage(String((char*)payload), num);
      break;
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);

  Serial.println("\nŁączenie z WiFi...");
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
    Serial.print(".");
  }

  Serial.println("\nPołączono z WiFi!");
  Serial.print("Adres ESP32-C3: ");
  Serial.println(WiFi.localIP());

  // Start WebSocket server
  webSocket.begin();
  webSocket.onEvent(wsEvent);

  Serial.println("WebSocket server działa na porcie 8000");
}

void loop() {
  webSocket.loop();

  // przykładowe wysyłanie danych do Virtuino co 1 sekundę
  static unsigned long lastSend = 0;
  if (millis() - lastSend > 1000) {
    lastSend = millis();

    // V1 – przykładowa zmienna (np. odczyt czujnika)
    V1 = analogRead(0);
    webSocket.broadcastTXT("V1=" + String(V1));
  }
}

I jakkolwiek kod jeszcze nie będzie działał z aplikacją to już wygląda całkiem nieźle. Trzeba tylko dopytać AI w temacie struktury danych jakie wymieniają między sobą moduł i aplikacja by uzyskać w miarę działający kod


Zabawne są te komentarze generowane przez AI ale wynik jest już całkiem Ok. 




Zachęcony rezultatem dopytywałem asystenta tak by uzyskać efekt maksymalnie zbliżony do oryginału. W wyniku tego otrzymałem kod działający identycznie jak Iliasa ale nie tak zgrabny jak  pierwowzór.

Wnioski

  • AI ewidentnie przyspiesza pracę dla prostych przykładów - odciąża z mozolnego wpisywania kolejnych linii kodu i pozwala uniknąć typowych błędów nowicjusza jak brak średnika czy niedomknięty nawias
  • dla bardziej złożonych funkcji konieczne jest uszczegółowianie pytań by naprowadzić go na oczekiwane rozwiązanie
  • trzeba zmuszać go do maksymalnego upraszczania kodu bo ma tendencję do jego rozwlekania
  • przy szybkich odpowiedziach nie wykorzystuje całej wiedzy ale odpowiada coś by zgadzało się mniej więcej z pytaniem a czasem konfabuluje
czyli asystent TAK ale pod mocną kontrolą profesora. I co ważne system rozwija się tak szybko że warto powtarzać pytania po jakimś czasie bo wynik może być zgoła odmienny od poprzedniego.

Ale tym niech się już martwi nasz ulubiony ciąg dalszy

Brak komentarzy:

Prześlij komentarz