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);
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());

View File

@ -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 <SoftwareSerial.h>
#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

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);
}
}