niedziela, 12 października 2025

AI na dobry początek


Zachwyty nad możliwościami jakie daje AI nie milkną. I ja spróbowałem co mogę wyciągnąć z niego w temacie programowania. Dziś pierwsze testy. 






Pierwsze polecenie dotyczyło uproszczenia  fragmentów kodu nieśmiertelnego programu obsługi pompy CUW. Układ nieco się rozrósł i oprócz sterowania pompą monitoruje zewnętrzne i pokojowe parametry powietrza (temperaturę, wilgotność Co2 TVOC) i wyświetla to na miniaturowym TFT zamontowanym bezpośrednio na płytce ESP32 

Kolor wyświetlanych napisów zależy od poziomu natężenia TVOC 

U mnie wyglądało to tak


a dostałem


Bez wątpienia krócej i ładniej. Mam nadzieję, że przy kolejnym kodowaniu tego typu zastosuję powyższy schemat

Jeszcze ładniej wyszło z takim fragmentem kodu


dostałem to z i jak zawsze z pełnym komentarzem i wyjaśnieniami


Tu juz nie było tak prosto. Trzeba podać właściwe typy zmiennych by AI wiedział jaki znacznik typu ma wstawić. Ale i tak wyszło bardzo ładnie. 

Ostatnie zadanie nieco trudniejsze. Przy zmianie wielkości TVOC postanowiłem nie zmieniać koloru czcionki ale narysować duży kwadrat (lepiej widoczny z daleka) i zmieniać jego kolor w takt zmian TVOC 


i dostałem coś takiego


 Rewelacja. Za 4 sekundy dostałem wynik nad którym musiałbym popracować dobry kawałek czasu by znaleźć właściwe rozwiązanie.

Ale  efekt finalny propozycji AI (zmieniłem rozmiar kwadratu na 100 x 100 piksele) okazał się niewłaściwy. Napisy na wyświetlaczu zostały przesunięte o wysokość kwadratu do góry

Zapytałem nieco inaczej


Na odpowiedz czekałem 9 sek ale było warto

  drawBottomRightSquare(8, TFT_RED);


/* Rysuje wypełniony kwadrat o boku `size` w prawym-dolnym rogu
   color - kolor zdefiniowany przez TFT_eSPI (np. TFT_RED). */
void drawBottomRightSquare(int size, uint16_t color) {
  // zachowaj pozycję kursora i kolor tekstu (kursora przywrócimy)
  int curX = tft.getCursorX();
  int curY = tft.getCursorY();

  // współrzędne lewego górnego rogu kwadratu
  int x = tft.width()  - size;
  int y = tft.height() - size;

  // upewnij się, że nie wychodzimy poza ekran
  if (x < 0) x = 0;
  if (y < 0) y = 0;

  tft.fillRect(x, y, size, size, color);

  // przywróć kursor (żeby dalsze wypisywanie poszło tam, gdzie było)
  tft.setCursor(curX, curY);
}
To już pełen kosmos.
Drążyłem więc dalej. Kolory w ciemności są słabo rozróżnialne szczególnie pink i magenta. zmieniłem więc sposób wyświetlania kolorów. Kolejne zadanie dla AI wyglądało tak:


i otrzymałem 

// Funkcja pomocnicza — rysuje kwadrat w dolnym prawym rogu ekranu
void drawBottomRightSquare(int size, uint16_t color, uint16_t bgColor = TFT_BLACK) {
  int x = tft.width() - 100;  // lewy górny róg obszaru 100x100
  int y = tft.height() - 100;

  // Wyczyść tło tylko w tym obszarze (bez naruszania reszty ekranu)
  tft.fillRect(x, y, 100, 100, bgColor);

  // Rysuj kwadrat na środku tego obszaru
  int offset = (100 - size) / 2;
  tft.fillRect(x + offset, y + offset, size, size, color);
}



  // warunki kolorów i wielkości
  if (tvoctft > 2000)
    drawBottomRightSquare(100, TFT_BLUE);
  else if (tvoctft > 1500)
    drawBottomRightSquare(100, TFT_MAGENTA);
  else if (tvoctft > 1000)
    drawBottomRightSquare(50, TFT_MAGENTA, TFT_BLACK);
  else if (tvoctft > 500)
    drawBottomRightSquare(50, TFT_BLACK, TFT_GREEN);
  else if (tvoctft > 100)
    drawBottomRightSquare(100, TFT_GREEN);
  else
    drawBottomRightSquare(100, TFT_BLACK);
Super. Ale utrudniłem mu jeszcze bardziej

Ubawiły mnie jego komentarze ale  wynik był bez zarzutu

int lastZone = -1;      // ostatni przedział, aby nie rysować ponownie

// Funkcja pomocnicza — rysuje kwadrat w dolnym prawym rogu ekranu
void drawBottomRightSquare(int size, uint16_t color, uint16_t bgColor = TFT_BLACK) {
  int x = tft.width() - 100;  // lewy górny róg obszaru 100x100
  int y = tft.height() - 100;

  // Wyczyść tło tylko w obrębie 100x100
  tft.fillRect(x, y, 100, 100, bgColor);

  // Narysuj kwadrat na środku obszaru
  int offset = (100 - size) / 2;
  tft.fillRect(x + offset, y + offset, size, size, color);
}

// Funkcja aktualizująca kwadrat tylko przy zmianie przedziału
void updateSquare(int value) {
  int zone = 0;

  if (value > 2000) zone = 6;
  else if (value > 1500) zone = 5;
  else if (value > 1000) zone = 4;
  else if (value > 500)  zone = 3;
  else if (value > 100)  zone = 2;
  else                   zone = 1;

  if (zone != lastZone) {  // rysuj tylko, jeśli zmienił się zakres
    lastZone = zone;

    switch (zone) {
      case 6: drawBottomRightSquare(100, TFT_BLUE); break;
      case 5: drawBottomRightSquare(100, TFT_MAGENTA); break;
      case 4: drawBottomRightSquare(50, TFT_MAGENTA, TFT_BLACK); break;
      case 3: drawBottomRightSquare(50, TFT_BLACK, TFT_GREEN); break;
      case 2: drawBottomRightSquare(100, TFT_GREEN); break;
      default: drawBottomRightSquare(100, TFT_BLACK); break;
    }
  }
}


  updateSquare(tvoctft);  // aktualizuj tylko przy zmianie strefy
Wkleiłem toto do programu i wynik był dokładnie taki jakiego oczekiwałem. Nie chce mi się nawet kombinować ile czasu zajęłoby mi dojście takiego finału - o ile wogóle chciałby tak się bawić. Piękne jest również to ( a może przede wszystkim) że pracując na tym samy wątku AI wie domyślnie czego dotyczy temat i nie trzeba powtarzać szczegółów podanych wcześniej. No i te komentarze - bezcenne


Na mój gust AI zdał egzamin choć próba ulepszania całych modułów nie jest wygodna gdyż zbyt wiele danych należy wstępnie dostarczyć AI w odniesieniu do wielkości i funkcji zdefiniowanych w innych modułach. Natomiast do rozwiązywania konkretnie postawionych i sprecyzowanych zadań jest ZNAKOMITY.
Może przeanalizuję dotychczasowe projekty pod kątem dopracowania tych fragmentów kodu, które wydawały mi się zbyt trudne lub żmudne do zmiany dla osiągnięcia finalnego efektu. 
Ale o tym zadecyduje nasz ulubiony ciąg dalszy.













Brak komentarzy:

Prześlij komentarz