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 <noreply@anthropic.com>
Phase1Deliverables
Matias Mas Viehl 2026-10-20 11:22:51 +02:00
parent 7cb0bb66d0
commit 5fd9615e5f
3 changed files with 73 additions and 45 deletions

View File

@ -48,10 +48,6 @@ void baselineLaden() {
EEPROM.get(BASELINE_ADRESSE, b); EEPROM.get(BASELINE_ADRESSE, b);
if (b.magic == BASELINE_MAGIC && b.pruefsumme == baselinePruefsumme(b.baseline)) { if (b.magic == BASELINE_MAGIC && b.pruefsumme == baselinePruefsumme(b.baseline)) {
ccs.setBaseline(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.baseline = ccs.getBaseline();
b.pruefsumme = baselinePruefsumme(b.baseline); b.pruefsumme = baselinePruefsumme(b.baseline);
EEPROM.put(BASELINE_ADRESSE, b); 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 // Anzeige wechselt zwischen zwei Seiten, da das LCD nur 2 Zeilen hat
bool zeigeLuftqualitaet = false; bool zeigeLuftqualitaet = false;
void setup() { void setup() {
// Serial Monitor (9600 Baud) zur Kontrolle der Messwerte // Serial gehoert dem ESP8266 (wird in wifiVerbinden() gestartet), kein Serial-Monitor moeglich
Serial.begin(9600);
// LCD initialisieren (16 Spalten, 2 Zeilen) // LCD initialisieren (16 Spalten, 2 Zeilen)
lcd.begin(16, 2); lcd.begin(16, 2);
@ -94,7 +87,13 @@ void setup() {
lcd.print("WLAN... "); lcd.print("WLAN... ");
bool verbunden = wifiVerbinden(); bool verbunden = wifiVerbinden();
lcd.setCursor(0, 1); 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 // Der DHT11 braucht nach dem Start einen Moment
delay(2000); delay(2000);
@ -143,12 +142,6 @@ void loop() {
lcd.print(ccs.getTVOC()); lcd.print(ccs.getTVOC());
lcd.print(" ppb"); 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) // Vollständigen Messwertsatz ans Backend schicken (blockiert ca. 1-2 s)
sendeMesswerte(t, h, ccs.geteCO2(), ccs.getTVOC()); sendeMesswerte(t, h, ccs.geteCO2(), ccs.getTVOC());

View File

@ -1,16 +1,13 @@
// ESP8266 (ESP-01) per AT-Befehle am Arduino Uno: sendet die Messwerte als HTTP-POST // 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). // an das Backend (POST /api/messwerte, Datenvertrag siehe backend/README.md).
#include <SoftwareSerial.h>
#include "wifi_config.h" #include "wifi_config.h"
// --- ESP-01 Verdrahtung --- // --- ESP-01 Verdrahtung (wie Instructables "Add WiFi to Arduino UNO") ---
// ESP TX -> Uno Pin 3 (SoftwareSerial-RX) // ESP TX -> Uno RX (Pin 0) \ Hardware-Serial! Das Modul teilt sich die Leitung mit dem USB-Anschluss:
// ESP RX -> Uno Pin 4 (SoftwareSerial-TX), über Spannungsteiler 5 V -> 3,3 V (z. B. 1 kΩ / 2 kΩ) // ESP RX -> Uno TX (Pin 1) / Beim Hochladen des Sketches ESP TX/RX kurz abziehen.
// 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 VIN und ENABLE -> 3,3 V, ESP GND -> GND
// ESP GND -> GND // Serial.print() darf im Sketch NICHT fuer Debugging genutzt werden, die Ausgabe ginge an das ESP.
const uint8_t ESP_RX_PIN = 3; #define espSerial Serial
const uint8_t ESP_TX_PIN = 4;
SoftwareSerial espSerial(ESP_RX_PIN, ESP_TX_PIN);
bool wifiOk = false; bool wifiOk = false;
uint8_t sendeFehler = 0; uint8_t sendeFehler = 0;
@ -48,40 +45,39 @@ bool espBefehl(const __FlashStringHelper* befehl, const char* ziel = "OK", unsig
return espWarteAuf(ziel, timeoutMs); return espWarteAuf(ziel, timeoutMs);
} }
// Findet die Baudrate des Moduls. SoftwareSerial ist bei 115200 unzuverlässig, deshalb // Findet die Baudrate des Moduls (Werkseinstellung meist 115200, manchmal 9600)
// wird ein Modul mit 115200 (Werkseinstellung) dauerhaft auf 9600 umgestellt.
bool espBaudrateFinden() { bool espBaudrateFinden() {
espSerial.begin(9600); const long raten[] = {115200, 9600, 57600, 38400};
if (espBefehl(F("AT"))) { 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; 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() { bool wifiVerbinden() {
wifiOk = false; wifiOk = false;
if (!espBaudrateFinden()) { if (!espBaudrateFinden()) {
Serial.println(F("ESP8266 antwortet nicht (Pins, Versorgung, Baudrate pruefen)")); wifiFehler = 1;
return false; return false;
} }
espBefehl(F("ATE0")); // Echo aus espBefehl(F("ATE0")); // Echo aus
if (!espBefehl(F("AT+CWMODE=1"))) { // Station-Modus if (!espBefehl(F("AT+CWMODE=1"))) { // Station-Modus
Serial.println(F("ESP8266: CWMODE fehlgeschlagen")); wifiFehler = 2;
return false; return false;
} }
espBefehl(F("AT+CIPMUX=0")); // eine Verbindung gleichzeitig espBefehl(F("AT+CIPMUX=0")); // eine Verbindung gleichzeitig
Serial.print(F("Verbinde mit WLAN "));
Serial.println(F(WLAN_SSID));
espLeeren(); espLeeren();
espSerial.print(F("AT+CWJAP=\"")); espSerial.print(F("AT+CWJAP=\""));
espSerial.print(F(WLAN_SSID)); espSerial.print(F(WLAN_SSID));
@ -90,7 +86,7 @@ bool wifiVerbinden() {
espSerial.println(F("\"")); espSerial.println(F("\""));
wifiOk = espWarteAuf("OK", 20000); wifiOk = espWarteAuf("OK", 20000);
Serial.println(wifiOk ? F("WLAN verbunden") : F("WLAN-Verbindung fehlgeschlagen (SSID/Passwort?)")); wifiFehler = wifiOk ? 0 : 3;
return wifiOk; return wifiOk;
} }
@ -140,11 +136,9 @@ bool sendeMesswerte(float temperatur, float luftfeuchte, uint16_t eco2, uint16_t
if (ok) { if (ok) {
sendeFehler = 0; sendeFehler = 0;
Serial.println(F("An Server gesendet"));
return true; return true;
} }
Serial.println(F("Senden fehlgeschlagen (Server-IP/Port/Firewall pruefen)"));
if (++sendeFehler >= MAX_SENDEFEHLER) { if (++sendeFehler >= MAX_SENDEFEHLER) {
sendeFehler = 0; sendeFehler = 0;
wifiOk = false; // beim nächsten Senden neu verbinden wifiOk = false; // beim nächsten Senden neu verbinden

View File

@ -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.h>
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);
}
}