From 5fd9615e5f2e8406f52410ac5e6374d484f19230 Mon Sep 17 00:00:00 2001 From: 3020772 <3020772@stud.hs-mannheim.de> Date: Tue, 20 Oct 2026 11:22:51 +0200 Subject: [PATCH] ESP8266 an Hardware-Serial (Pin 0/1) umgestellt, esp_test-Sketch - esp_wifi.h nutzt Serial statt SoftwareSerial (Verkabelung wie Instructables) - Baudrate wird automatisch gesucht, Fehlercode (E1-E3) auf dem LCD - Serial-Debugausgaben entfernt, da Serial nun dem ESP gehoert - Neuer Diagnose-Sketch firmware/esp_test zeigt ESP-Antworten auf dem LCD Co-Authored-By: Claude Sonnet 5.5 --- firmware/dht11_lcd/dht11_lcd.ino | 23 +++++--------- firmware/dht11_lcd/esp_wifi.h | 54 ++++++++++++++------------------ firmware/esp_test/esp_test.ino | 41 ++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 45 deletions(-) create mode 100755 firmware/esp_test/esp_test.ino diff --git a/firmware/dht11_lcd/dht11_lcd.ino b/firmware/dht11_lcd/dht11_lcd.ino index e6cdc1b..af7cc64 100644 --- a/firmware/dht11_lcd/dht11_lcd.ino +++ b/firmware/dht11_lcd/dht11_lcd.ino @@ -48,10 +48,6 @@ void baselineLaden() { EEPROM.get(BASELINE_ADRESSE, b); if (b.magic == BASELINE_MAGIC && b.pruefsumme == baselinePruefsumme(b.baseline)) { ccs.setBaseline(b.baseline); - Serial.print("Baseline geladen: "); - Serial.println(b.baseline); - } else { - Serial.println("Keine gueltige Baseline im EEPROM"); } } @@ -62,16 +58,13 @@ void baselineSpeichern() { b.baseline = ccs.getBaseline(); b.pruefsumme = baselinePruefsumme(b.baseline); EEPROM.put(BASELINE_ADRESSE, b); - Serial.print("Baseline gespeichert: "); - Serial.println(b.baseline); } // Anzeige wechselt zwischen zwei Seiten, da das LCD nur 2 Zeilen hat bool zeigeLuftqualitaet = false; void setup() { - // Serial Monitor (9600 Baud) zur Kontrolle der Messwerte - Serial.begin(9600); + // Serial gehoert dem ESP8266 (wird in wifiVerbinden() gestartet), kein Serial-Monitor moeglich // LCD initialisieren (16 Spalten, 2 Zeilen) lcd.begin(16, 2); @@ -94,7 +87,13 @@ void setup() { lcd.print("WLAN... "); bool verbunden = wifiVerbinden(); lcd.setCursor(0, 1); - lcd.print(verbunden ? "WLAN OK " : "WLAN Fehler "); + if (verbunden) { + lcd.print("WLAN OK "); + } else { + lcd.print("WLAN Fehler E"); + lcd.print(wifiFehler); + lcd.print(" "); + } // Der DHT11 braucht nach dem Start einen Moment delay(2000); @@ -143,12 +142,6 @@ void loop() { lcd.print(ccs.getTVOC()); lcd.print(" ppb"); - Serial.print("eCO2: "); - Serial.print(ccs.geteCO2()); - Serial.print(" ppm TVOC: "); - Serial.print(ccs.getTVOC()); - Serial.println(" ppb"); - // Vollständigen Messwertsatz ans Backend schicken (blockiert ca. 1-2 s) sendeMesswerte(t, h, ccs.geteCO2(), ccs.getTVOC()); diff --git a/firmware/dht11_lcd/esp_wifi.h b/firmware/dht11_lcd/esp_wifi.h index b6ea5df..bb6c70e 100644 --- a/firmware/dht11_lcd/esp_wifi.h +++ b/firmware/dht11_lcd/esp_wifi.h @@ -1,16 +1,13 @@ // ESP8266 (ESP-01) per AT-Befehle am Arduino Uno: sendet die Messwerte als HTTP-POST // an das Backend (POST /api/messwerte, Datenvertrag siehe backend/README.md). -#include #include "wifi_config.h" -// --- ESP-01 Verdrahtung --- -// ESP TX -> Uno Pin 3 (SoftwareSerial-RX) -// ESP RX -> Uno Pin 4 (SoftwareSerial-TX), über Spannungsteiler 5 V -> 3,3 V (z. B. 1 kΩ / 2 kΩ) -// ESP VCC und CH_PD -> 3,3 V (Der ESP braucht bis ~300 mA, der 3,3-V-Pin des Uno liefert nur 50 mA!) -// ESP GND -> GND -const uint8_t ESP_RX_PIN = 3; -const uint8_t ESP_TX_PIN = 4; -SoftwareSerial espSerial(ESP_RX_PIN, ESP_TX_PIN); +// --- ESP-01 Verdrahtung (wie Instructables "Add WiFi to Arduino UNO") --- +// ESP TX -> Uno RX (Pin 0) \ Hardware-Serial! Das Modul teilt sich die Leitung mit dem USB-Anschluss: +// ESP RX -> Uno TX (Pin 1) / Beim Hochladen des Sketches ESP TX/RX kurz abziehen. +// ESP VIN und ENABLE -> 3,3 V, ESP GND -> GND +// Serial.print() darf im Sketch NICHT fuer Debugging genutzt werden, die Ausgabe ginge an das ESP. +#define espSerial Serial bool wifiOk = false; uint8_t sendeFehler = 0; @@ -48,40 +45,39 @@ bool espBefehl(const __FlashStringHelper* befehl, const char* ziel = "OK", unsig return espWarteAuf(ziel, timeoutMs); } -// Findet die Baudrate des Moduls. SoftwareSerial ist bei 115200 unzuverlässig, deshalb -// wird ein Modul mit 115200 (Werkseinstellung) dauerhaft auf 9600 umgestellt. +// Findet die Baudrate des Moduls (Werkseinstellung meist 115200, manchmal 9600) bool espBaudrateFinden() { - espSerial.begin(9600); - if (espBefehl(F("AT"))) { - return true; + const long raten[] = {115200, 9600, 57600, 38400}; + delay(3000); // das ESP braucht nach dem Einschalten ca. 2-3 s zum Booten + for (uint8_t runde = 0; runde < 2; runde++) { + for (uint8_t i = 0; i < 4; i++) { + espSerial.begin(raten[i]); + if (espBefehl(F("AT"), "OK", 1000)) { + return true; + } + } } - - espSerial.begin(115200); - espSerial.println(F("AT+UART_DEF=9600,8,1,0,0")); // neue AT-Firmware - delay(500); - espSerial.println(F("AT+CIOBAUD=9600")); // alte AT-Firmware - delay(500); - - espSerial.begin(9600); - return espBefehl(F("AT")); + return false; } +// Fehlercode der letzten Verbindung fuer das LCD: 0 = OK, 1 = ESP antwortet nicht, +// 2 = CWMODE fehlgeschlagen, 3 = WLAN-Verbindung fehlgeschlagen (SSID/Passwort/2,4 GHz) +uint8_t wifiFehler = 0; + bool wifiVerbinden() { wifiOk = false; if (!espBaudrateFinden()) { - Serial.println(F("ESP8266 antwortet nicht (Pins, Versorgung, Baudrate pruefen)")); + wifiFehler = 1; return false; } espBefehl(F("ATE0")); // Echo aus if (!espBefehl(F("AT+CWMODE=1"))) { // Station-Modus - Serial.println(F("ESP8266: CWMODE fehlgeschlagen")); + wifiFehler = 2; return false; } espBefehl(F("AT+CIPMUX=0")); // eine Verbindung gleichzeitig - Serial.print(F("Verbinde mit WLAN ")); - Serial.println(F(WLAN_SSID)); espLeeren(); espSerial.print(F("AT+CWJAP=\"")); espSerial.print(F(WLAN_SSID)); @@ -90,7 +86,7 @@ bool wifiVerbinden() { espSerial.println(F("\"")); wifiOk = espWarteAuf("OK", 20000); - Serial.println(wifiOk ? F("WLAN verbunden") : F("WLAN-Verbindung fehlgeschlagen (SSID/Passwort?)")); + wifiFehler = wifiOk ? 0 : 3; return wifiOk; } @@ -140,11 +136,9 @@ bool sendeMesswerte(float temperatur, float luftfeuchte, uint16_t eco2, uint16_t if (ok) { sendeFehler = 0; - Serial.println(F("An Server gesendet")); return true; } - Serial.println(F("Senden fehlgeschlagen (Server-IP/Port/Firewall pruefen)")); if (++sendeFehler >= MAX_SENDEFEHLER) { sendeFehler = 0; wifiOk = false; // beim nächsten Senden neu verbinden diff --git a/firmware/esp_test/esp_test.ino b/firmware/esp_test/esp_test.ino new file mode 100755 index 0000000..c6bfd5d --- /dev/null +++ b/firmware/esp_test/esp_test.ino @@ -0,0 +1,41 @@ +// Diagnose: schickt "AT" mit verschiedenen Baudraten an das ESP und zeigt die Antwort auf dem LCD. +// Verkabelung wie im Hauptsketch: ESP TX -> Uno Pin 0, ESP RX -> Uno Pin 1 (beim Upload abziehen!) +#include + +LiquidCrystal lcd(7, 8, 9, 10, 11, 12); + +const long raten[] = {115200, 9600, 74880, 57600, 38400}; + +void setup() { + lcd.begin(16, 2); + lcd.print("ESP Test"); + delay(3000); // ESP booten lassen +} + +void loop() { + for (uint8_t i = 0; i < 5; i++) { + Serial.begin(raten[i]); + while (Serial.available()) Serial.read(); + Serial.print(F("AT\r\n")); + + char antwort[17]; + uint8_t n = 0; + unsigned long start = millis(); + while (millis() - start < 1500 && n < 16) { + if (Serial.available()) { + char c = Serial.read(); + antwort[n++] = (c >= 32 && c < 127) ? c : '.'; // nicht druckbare Zeichen als Punkt + } + } + antwort[n] = 0; + + lcd.clear(); + lcd.print(raten[i]); + lcd.print(" Byte:"); + lcd.print(n); + lcd.setCursor(0, 1); + lcd.print(n ? antwort : "keine Antwort"); + Serial.end(); + delay(2500); + } +}