#include #include #include #include // --- I²C-LCD (0x27, 16×2) --- LiquidCrystal_I2C lcd(0x27, 16, 2); // Timestamp des letzten Empfangs unsigned long lastReceive = 0; // Toggle für Kalibrierungs-Animation bool calToggle = false; void onDataRecv(const esp_now_recv_info_t* info, const uint8_t* data, int len) { // Wir erwarten data[0] = 0..3 uint8_t state = data[0]; lastReceive = millis(); lcd.clear(); switch(state) { case 0: { // Kalibrieren // Augen wechseln const char* eyes = calToggle ? "O O" : "- -"; calToggle = !calToggle; lcd.setCursor(0, 0); lcd.print("Luft:"); // Augen rechtsbündig lcd.setCursor(16 - strlen(eyes), 0); lcd.print(eyes); // Text "Kalibriert" links, "..." rechts lcd.setCursor(0, 1); lcd.print("Kalibriert"); lcd.setCursor(14, 1); lcd.print("w"); break; } case 1: { // Gut // Eye = "O O" lcd.setCursor(0, 0); lcd.print("Luft:"); lcd.setCursor(13, 0); lcd.print("O O"); // Rating lcd.setCursor(0, 1); lcd.print("Gut"); // Mouth = "v" lcd.setCursor(14, 1); lcd.print("v"); break; } case 2: { // Okay // Eye = "- -" lcd.setCursor(0, 0); lcd.print("Luft:"); lcd.setCursor(13, 0); lcd.print("- -"); // Rating lcd.setCursor(0, 1); lcd.print("Okay"); // Mouth = "o" lcd.setCursor(14, 1); lcd.print("o"); break; } case 3: { // Schlecht // Eye = "X X" lcd.setCursor(0, 0); lcd.print("Luft:"); lcd.setCursor(13, 0); lcd.print("X X"); // Rating lcd.setCursor(0, 1); lcd.print("Schlecht"); // Mouth = "-" lcd.setCursor(14, 1); lcd.print("-"); break; } default: { // Eye = "? ?" lcd.setCursor(0, 0); lcd.print("Luft:"); lcd.setCursor(13, 0); lcd.print("? ?"); // Rating lcd.setCursor(0, 1); lcd.print("---"); // Mouth = "-" lcd.setCursor(14, 1); lcd.print("_"); } } Serial.printf("Received state=%d\n", state); } void setup() { Serial.begin(115200); // LCD initialisieren Wire.begin(); lcd.init(); lcd.backlight(); // Begrüßung lcd.setCursor(0, 0); lcd.print("Hallo! :)"); lcd.setCursor(0, 1); lcd.print("Warte..."); // WLAN & ESP-NOW WiFi.mode(WIFI_STA); if (esp_now_init() != ESP_OK) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Init FEHLER"); while (true) delay(100); } esp_now_register_recv_cb(onDataRecv); Serial.println("ESP-NOW ready"); } void loop() { // Nach 60 s ohne Empfang Platzhalter if (lastReceive != 0 && millis() - lastReceive > 60000) { lcd.clear(); // Eye = "? ?" lcd.setCursor(0, 0); lcd.print("Luft:"); lcd.setCursor(13, 0); lcd.print("? ?"); // Rating lcd.setCursor(0, 1); lcd.print("---"); // Mouth = "-" lcd.setCursor(14, 1); lcd.print("_"); lastReceive = millis(); } delay(100); }