Wyświtlanie informacji na Oled ?

User avatar
mrlukasz
Posts: 29
Joined: Sun Jun 19, 2016 10:23 am
Location: Wola śląskie

Post

zapomniałem dodać że ma taki mały ten wyświetlacz dokładnie taki jak na aukcji https://allegro.pl/oferta/oled-0-96-i2c ... MGJkMWY%3D
Bernix
Posts: 93
Joined: Tue Jan 03, 2023 10:29 am

Post

Koledzy

Takie oto pytanie. Za pomocą pytań do chatgp udało mi się uzyskać taki oto kod. Wszystko się ładnie kompiluje dla 8266 , jednakże po wygraniu moduł nie łączy się z siecią. Może ktoś zechce się nad tym pochylić i rozwiązać zagadkę.
/* -------------------------------------------------------------

ESP8266 + 0.96" OLED + HC-SR04 + NeoPixels

SuplaDevice (bez SuplaDeviceGUI) – własny, lekki WebServer do konfiguracji

Wersja 1.3‑light | pełna obsługa Wi‑Fi i SUPLA w setup()


---

Funkcje


---

• Pomiar odległości HC‑SR04 (pulseIn)

• OLED: wartość + wykres słupkowy

• NeoPixel: wielokolorowa sygnalizacja (1‑8 diod)

• WebServer (port 80): konfiguracja progów, liczby diod; zapisywane w EEPROM

• SUPLA: GUID + 16‑bajtowy authKey (Access Password) + serwer

Wymagane biblioteki (Arduino Library Manager):

• SuplaDevice ≥ v25.x

• Adafruit SSD1306, Adafruit GFX, Adafruit NeoPixel

• ESP8266 core ≥ 3.1.2 (zawiera ESP8266WebServer)

------------------------------------------------------------- */


#include <Arduino.h> #include <EEPROM.h> #include <ESP8266WiFi.h> #include <ESP8266WebServer.h>

#include <SuplaDevice.h>

#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Adafruit_NeoPixel.h>

// ----------------------------------------------------------------------------- // Ustawienia sieci – UZUPEŁNIJ SWOIMI DANYMI! // ----------------------------------------------------------------------------- const char* WIFI_SSID = "Twoje_SSID"; const char* WIFI_PASSWORD = "TwojeHaslo";

// SUPLA char GUID[SUPLA_GUID_SIZE] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xCA, 0xFE, 0xBA, 0xBE, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; char AUTHKEY[SUPLA_AUTHKEY_SIZE] = { 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }; const char* SUPLA_EMAIL = "[email protected]"; const char* SUPLA_SERVER = "svr3.supla.org"; // dostosuj region const int SUPLA_PORT = 2015;

// ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // Sprzęt – piny // ----------------------------------------------------------------------------- // Jeśli kompilujesz na "Generic ESP8266 Module" (gdzie symbole D0‑D8 nie są // zdefiniowane), poniższe makra wprowadzą odpowiednie aliasy na GPIO. #ifndef D0 #define D0 16 #define D1 5 #define D2 4 #define D3 0 #define D4 2 #define D5 14 #define D6 12 #define D7 13 #define D8 15 #endif

constexpr uint8_t PIN_OLED_SDA = D6; // GPIO12 constexpr uint8_t PIN_OLED_SCL = D5; // GPIO14 constexpr uint8_t PIN_SONAR_TRIG = D1; // GPIO5 constexpr uint8_t PIN_SONAR_ECHO = D2; // GPIO4 constexpr uint8_t PIN_NEOPIXEL = D4; // GPIO2

// OLED constexpr uint8_t OLED_ADDR = 0x3C; constexpr int16_t SCREEN_W = 128; constexpr int16_t SCREEN_H = 64; Adafruit_SSD1306 display(SCREEN_W, SCREEN_H, &Wire, -1);

// NeoPixels constexpr uint8_t MAX_PIXELS = 8; Adafruit_NeoPixel strip(MAX_PIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);

// ----------------------------------------------------------------------------- // EEPROM – konfiguracja progów i liczby LED // ----------------------------------------------------------------------------- struct UserConfig { float nearThreshold = 30.0f; // cm float midThreshold = 60.0f; // cm uint8_t ledCount = 1; // 1‑8 uint16_t crc16 = 0; }; UserConfig cfg; constexpr size_t EEPROM_SIZE = sizeof(UserConfig);

uint16_t crc16(const uint8_t* d, size_t len) { uint16_t c = 0xFFFF; while (len--) { c ^= *d++; for (uint8_t i = 0; i < 8; i++) c = (c & 1) ? (c >> 1) ^ 0xA001 : c >> 1; } return c; }

void loadConfig() { EEPROM.begin(EEPROM_SIZE); EEPROM.get(0, cfg); if (cfg.crc16 != crc16((uint8_t*)&cfg, sizeof(UserConfig)-2)) { cfg = UserConfig(); cfg.crc16 = crc16((uint8_t*)&cfg, sizeof(UserConfig)-2); EEPROM.put(0, cfg); EEPROM.commit(); } } void saveConfig() { cfg.crc16 = crc16((uint8_t*)&cfg, sizeof(UserConfig)-2); EEPROM.put(0, cfg); EEPROM.commit(); }

// ----------------------------------------------------------------------------- // WebServer – prosty formularz // ----------------------------------------------------------------------------- ESP8266WebServer server(80);

String htmlPage() { char buf[1024]; snprintf(buf, sizeof(buf), "<html><head><meta charset="utf-8"><title>Konfiguracja</title></head>" "<body><h2>Ustawienia progów</h2>" "<form action='/save' method='POST'>" "Czerwony (cm): <input type='number' step='0.1' name='red' value='%.1f'><br>" "Żółty (cm): <input type='number' step='0.1' name='yellow' value='%.1f'><br>" "Liczba LED (1-8): <input type='number' name='led' min='1' max='8' value='%u'><br><br>" "<input type='submit' value='Zapisz'></form></body></html>", cfg.nearThreshold, cfg.midThreshold, cfg.ledCount); return String(buf); } void handleRoot() { server.send(200, "text/html", htmlPage()); } void handleSave() { if (server.hasArg("red")) cfg.nearThreshold = server.arg("red").toFloat(); if (server.hasArg("yellow")) cfg.midThreshold = server.arg("yellow").toFloat(); if (server.hasArg("led")) cfg.ledCount = constrain(server.arg("led").toInt(), 1, MAX_PIXELS); saveConfig(); server.send(200, "text/html", "<html>Zapisane – restart...</html>"); delay(700); ESP.restart(); }

// ----------------------------------------------------------------------------- // HC‑SR04 – pomiar odległości // ----------------------------------------------------------------------------- float measureDistanceCM() { digitalWrite(PIN_SONAR_TRIG, LOW); delayMicroseconds(2); digitalWrite(PIN_SONAR_TRIG, HIGH); delayMicroseconds(10); digitalWrite(PIN_SONAR_TRIG, LOW); unsigned long duration = pulseIn(PIN_SONAR_ECHO, HIGH, 30000); // 30 ms if (!duration) return NAN; return duration * 0.0343f / 2.0f; // cm }

// ----------------------------------------------------------------------------- // LED + OLED // ----------------------------------------------------------------------------- static inline uint8_t clampLed(uint8_t n){ return n<1?1:(n>MAX_PIXELS?MAX_PIXELS:n);} void updateLed(float cm){ uint32_t col; if (isnan(cm)) col=strip.Color(0,0,0); else if(cm<=cfg.nearThreshold) col=strip.Color(255,0,0); else if(cm<=cfg.midThreshold) col=strip.Color(255,255,0); else col=strip.Color(0,255,0); uint8_t active=clampLed(cfg.ledCount); for(uint8_t i=0;i<MAX_PIXELS;i++) strip.setPixelColor(i,i<active?col:0); strip.show(); } void displayDistance(float cm){ display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.print(F("Odległość:")); display.setTextSize(2); display.setCursor(0,16); if(isnan(cm)) display.print("--- cm"); else display.printf("%.1f cm",cm); const float MAX_CM=100.0f; int barY=48,barH=12,barW=SCREEN_W-1; int fillW=isnan(cm)?0:(int)(min(cm,MAX_CM)/MAX_CM*barW); display.drawRect(0,barY,barW,barH,WHITE); display.fillRect(1,barY+1,fillW,barH-2,WHITE); display.display(); }

// ----------------------------------------------------------------------------- // Zmienne czasu // ----------------------------------------------------------------------------- unsigned long lastMeasure=0; const unsigned long MEAS_MS=600;

// ----------------------------------------------------------------------------- // Pomocnik do połączenia Wi‑Fi // ----------------------------------------------------------------------------- void connectWiFi(){ WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print("Łączenie z Wi‑Fi"); int retries=0; while (WiFi.status()!=WL_CONNECTED && retries<40){ // ~20 s delay(500); Serial.print('.'); retries++; } if (WiFi.status()==WL_CONNECTED){ Serial.println("\nWi‑Fi OK – IP: " + WiFi.localIP().toString()); } else { Serial.println("\nBłąd Wi‑Fi – przechodzę w tryb AP 'ESP_RESCUE'"); WiFi.softAP("ESP_RESCUE"); } }

// ----------------------------------------------------------------------------- // SETUP // ----------------------------------------------------------------------------- void setup(){ Serial.begin(115200); pinMode(PIN_SONAR_TRIG,OUTPUT); pinMode(PIN_SONAR_ECHO,INPUT);

Wire.begin(PIN_OLED_SDA,PIN_OLED_SCL); display.begin(SSD1306_SWITCHCAPVCC,OLED_ADDR); strip.begin(); strip.show();

loadConfig();

connectWiFi();

server.on("/",handleRoot); server.on("/save",handleSave); server.begin(); Serial.println("WebServer start na porcie 80");

// --- SUPLA --- SuplaDevice.setName("ESP8266 Distance OLED"); SuplaDevice.begin(GUID, SUPLA_EMAIL, AUTHKEY, SUPLA_SERVER, SUPLA_PORT); }

// ----------------------------------------------------------------------------- // LOOP // ----------------------------------------------------------------------------- void loop(){ unsigned long now=millis(); if(now-lastMeasure>MEAS_MS){ float cm=measureDistanceCM(); updateLed(cm); displayDistance(cm); lastMeasure=now; } server.handleClient(); SuplaDevice.iterate(); }
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Bernix wrote: Thu Jul 03, 2025 7:19 pm
Odpowiedzią na zagadkę jest: chat nie umie w Suple.

Używanie ai do generowania kodu nadal wymaga umiejętności programowania i zrozumienia środowiska,w którym się pracuje.
Najlepsze suple dla Twojego domu :mrgreen:
Bernix
Posts: 93
Joined: Tue Jan 03, 2023 10:29 am

Post

klew wrote: Thu Jul 03, 2025 7:31 pm
Bernix wrote: Thu Jul 03, 2025 7:19 pm
Odpowiedzią na zagadkę jest: chat nie umie w Suple.

Używanie ai do generowania kodu nadal wymaga umiejętności programowania i zrozumienia środowiska,w którym się pracuje.
Zgadzam się całkowicie. Jednakże dla laika to jakaś ścieżka. Dlatego zadałem pytanie.
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Bernix wrote: Thu Jul 03, 2025 7:35 pm Zgadzam się całkowicie. Jednakże dla laika to jakaś ścieżka. Dlatego zadałem pytanie.
No to odpowiem na pytanie: Supla sama zarządza wifi i nie możesz tego inicjalizować tak jak to normalne w Arduino się robi. Wrzuć to co dotyczy wifi i dodaj obsługę wifi jak w dowolnym przykładzie Supli pod Arduino
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
klew
Posts: 13907
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

I podziel sobie ten projekt na różne drobne kroki i każdy z tych kroków uruchamiaj jako odrębny program. Np zrób obsługę wyświetlacza bez Supli i innych bajerów.

Potem zrób odczyt jakiegoś czujnika (choć do HC Sr jest gotowy przykład w Supli).

Jak już wszystko będziesz miał działające to poskładaj wszystko razem.

Te AI mają strasznie krótką pamięć i im większy robisz kontekst, tym bardziej się gubią i robią bzdury.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Zibi_007
Posts: 3985
Joined: Tue Oct 31, 2023 10:06 pm
Has thanked: 10 times
Been thanked: 31 times

Post

Bernix wrote: Thu Jul 03, 2025 7:35 pm
klew wrote: Thu Jul 03, 2025 7:31 pm
Bernix wrote: Thu Jul 03, 2025 7:19 pm
Odpowiedzią na zagadkę jest: chat nie umie w Suple.

Używanie ai do generowania kodu nadal wymaga umiejętności programowania i zrozumienia środowiska,w którym się pracuje.
Zgadzam się całkowicie. Jednakże dla laika to jakaś ścieżka. Dlatego zadałem pytanie.
Jak będziesz kolejny raz wklejał kod, to użyj tego "</>" znacznika. Będzie to bardziej czytelne.

A teraz do rzeczy.
Na tym co wkleiłeś czujnik odległości nie zadziała. W przykładzie SD masz gotowy. Po porostu wklej kod. Piszę z telefonu, ale ja już wcześniej zamieszczałem kod do pomiaru odległości na SR04 (i to każdym - tym w obudowie też, bo z GG nie działa). Poszukaj.
Biblioteka NeoPixel też jest tutaj mocno nad wyraz. Użyj gotowego przykładu z SD (do SSD1306) i do tego webserwer. Powinno zadziałać. SI potrafi napisać kod pod Suplę, ale musi mieć przykłady i ciężko to zrobić akurat pod ChatGPT w darmowej wersji...
Image Wiesz, że Supla obsługuje Zigbee? Wstąp do Klubu Promila: https://forum.supla.org/viewtopic.php?t=18018
Image Szukasz nowego GG? Jest tutaj: https://forum.supla.org/viewtopic.php?t=18036
Bernix
Posts: 93
Joined: Tue Jan 03, 2023 10:29 am

Post

Zibi_007 wrote: Thu Jul 03, 2025 8:08 pm
Bernix wrote: Thu Jul 03, 2025 7:35 pm
klew wrote: Thu Jul 03, 2025 7:31 pm

Odpowiedzią na zagadkę jest: chat nie umie w Suple.

Używanie ai do generowania kodu nadal wymaga umiejętności programowania i zrozumienia środowiska,w którym się pracuje.
Zgadzam się całkowicie. Jednakże dla laika to jakaś ścieżka. Dlatego zadałem pytanie.
Jak będziesz kolejny raz wklejał kod, to użyj tego "</>" znacznika. Będzie to bardziej czytelne.

A teraz do rzeczy.
Na tym co wkleiłeś czujnik odległości nie zadziała. W przykładzie SD masz gotowy. Po porostu wklej kod. Piszę z telefonu, ale ja już wcześniej zamieszczałem kod do pomiaru odległości na SR04 (i to każdym - tym w obudowie też, bo z GG nie działa). Poszukaj.
Biblioteka NeoPixel też jest tutaj mocno nad wyraz. Użyj gotowego przykładu z SD (do SSD1306) i do tego webserwer. Powinno zadziałać. SI potrafi napisać kod pod Suplę, ale musi mieć przykłady i ciężko to zrobić akurat pod ChatGPT w darmowej wersji...
Jak to mówią: do dzieła

Return to “Pomoc”