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
parent
7cb0bb66d0
commit
5fd9615e5f
|
|
@ -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());
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue