# Batteriebetrieb mit Deep Sleep ## Übersicht Der ESP32 nutzt Deep Sleep für maximale Batterielaufzeit. Das System: - **Misst alle 5 Minuten** den Füllstand - **Sendet via LoRaWAN** die Daten - **Schläft danach** bis zur nächsten Messung - **Display ist aus** während Deep Sleep ## Stromverbrauch ### Normale Betrieb (ohne Deep Sleep): - **~80-240 mA** kontinuierlich - **Batterielaufzeit**: ~1-3 Tage (mit 2000 mAh Akku) ### Mit Deep Sleep: - **~10 µA** während Sleep (0.01 mA) - **~100 mA** für 10-30 Sekunden während Messung/Senden - **Batterielaufzeit**: ~3-6 Monate (mit 2000 mAh Akku) ## Konfiguration In [src/main.cpp](src/main.cpp) (Zeile 18-20): ```cpp // Deep Sleep Konfiguration (Batteriebetrieb) #define SLEEP_INTERVAL 300 // Sleep-Zeit in Sekunden (300 = 5 Minuten) #define uS_TO_S_FACTOR 1000000 // Umrechnung Mikrosekunden zu Sekunden ``` ### SLEEP_INTERVAL anpassen: | Intervall | Sekunden | Messungen/Tag | Batterielaufzeit (2000mAh) | |-----------|----------|---------------|---------------------------| | 1 Minute | 60 | 1440 | ~1 Monat | | 5 Minuten | 300 | 288 | ~3-6 Monate | | 10 Minuten| 600 | 144 | ~6-12 Monate | | 30 Minuten| 1800 | 48 | ~1-2 Jahre | | 1 Stunde | 3600 | 24 | ~2-3 Jahre | **Beispiele:** ```cpp #define SLEEP_INTERVAL 60 // 1 Minute #define SLEEP_INTERVAL 300 // 5 Minuten (Standard) #define SLEEP_INTERVAL 600 // 10 Minuten #define SLEEP_INTERVAL 1800 // 30 Minuten #define SLEEP_INTERVAL 3600 // 1 Stunde ``` ## Funktionsweise ### Ablauf: ``` 1. ESP32 wacht auf (Timer oder Reset) ↓ 2. Initialisierung (Display, LoRa, Sensor) ↓ 3. LoRaWAN Join (nur beim ersten Mal, ~5-10 Sek) ↓ 4. Sensor-Messung (Distanz → Füllstand) ↓ 5. Display zeigt Werte (1-2 Sekunden) ↓ 6. LoRaWAN Daten senden (5-10 Sekunden) ↓ 7. Display ausschalten ↓ 8. Deep Sleep (5 Minuten) ↓ 9. Zurück zu Schritt 1 ``` **Gesamtdauer pro Zyklus**: ~10-30 Sekunden Wachzeit ## RTC Memory (Persistenter Speicher) Der ESP32 behält folgende Variablen im Deep Sleep: ```cpp RTC_DATA_ATTR int bootCount = 0; // Zählt Aufwach-Zyklen RTC_DATA_ATTR bool joinedNetwork = false; // LoRaWAN Join-Status ``` **Warum wichtig?** - LoRaWAN Join muss nur **einmal** erfolgen (spart Zeit & Energie) - Boot-Zähler zeigt wie oft ESP32 aufgewacht ist ## Serial Monitor Ausgabe ### Beim ersten Start: ``` === ESP32 aufgewacht === Boot-Nummer: 1 Erster Start oder Reset Starte LoRaWAN... Beitritt läuft... Netzwerkbeitritt erfolgreich --- Messung --- Distanz: 135.2 cm Füllhöhe: 38.8 cm Füllstand: 24.2 % LoRa Payload (Hex): 05 48 01 84 00 f2 Nachricht übertragen. Daten gesendet, bereite Deep Sleep vor... === Deep Sleep aktivieren === Schlafdauer: 300 Sekunden (5 Minuten) Gehe in Deep Sleep... ``` ### Nach 5 Minuten (nächster Zyklus): ``` === ESP32 aufgewacht === Boot-Nummer: 2 Aufgewacht durch Timer (5 Minuten vergangen) Starte LoRaWAN... --- Messung --- Distanz: 136.1 cm Füllhöhe: 37.9 cm Füllstand: 23.7 % LoRa Payload (Hex): 05 51 01 7b 00 ed Nachricht übertragen. Daten gesendet, bereite Deep Sleep vor... === Deep Sleep aktivieren === Schlafdauer: 300 Sekunden (5 Minuten) Gehe in Deep Sleep... ``` ## Display-Verhalten ### Während Messung (10-30 Sekunden): - Display zeigt Füllstand in großen Zahlen - Zeigt Füllhöhe und Distanz - iotwave.de Header ### Während Deep Sleep (5 Minuten): - **Display komplett aus** (0 mA Stromverbrauch) - Display-Controller im Standby-Modus ## LoRaWAN-Besonderheiten ### Join-Verhalten: - **Erster Boot**: LoRaWAN OTAA Join (~5-10 Sekunden) - **Weitere Boots**: Join wird übersprungen (Session bleibt erhalten) **WICHTIG bei LoRaWAN:** - Nach jedem Deep Sleep muss das Gerät erneut joinen - LMIC-Bibliothek speichert Session **nicht** im RTC Memory - **Lösung**: Bei jedem Boot wird `LMIC_startJoining()` aufgerufen ## Batterie-Empfehlungen ### Batterietypen: 1. **LiPo Akku (empfohlen)** - 3.7V, 2000-6000 mAh - Mit Schutzschaltung - Wiederaufladbar via USB 2. **18650 Lithium-Zelle** - 3.7V, 2500-3500 mAh - Mit Battery Shield/Holder 3. **Alkaline AA (4× 1.5V = 6V)** - Mit Spannungsregler auf 5V - Nicht wiederaufladbar ### Laufzeit-Rechnung: **Beispiel**: 2000 mAh Akku, 5 Minuten Intervall ``` Wachzeit pro Zyklus: 20 Sekunden Sleep pro Zyklus: 300 Sekunden Stromverbrauch Wach: 100 mA × 20s = 0.56 mAh Stromverbrauch Sleep: 0.01 mA × 300s = 0.0008 mAh Pro Zyklus: ~0.56 mAh Zyklen pro Tag: 288 (alle 5 Min) Verbrauch pro Tag: 288 × 0.56 = ~160 mAh Batterielaufzeit: 2000 mAh / 160 mAh/Tag = 12.5 Tage ``` **Mit niedrigerem Intervall (z.B. 30 Min):** ``` Zyklen pro Tag: 48 Verbrauch pro Tag: 48 × 0.56 = ~27 mAh Batterielaufzeit: 2000 mAh / 27 mAh/Tag = 74 Tage (~2.5 Monate) ``` ## Zusätzliche Optimierungen (Optional) ### 1. Display komplett deaktivieren Falls Display nicht benötigt wird: ```cpp // In setup() auskommentieren: // display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // In do_send() Display-Code auskommentieren ``` **Einsparung**: ~10-20 mAh pro Tag ### 2. Längere Sleep-Intervalle Passen Sie `SLEEP_INTERVAL` an: ```cpp #define SLEEP_INTERVAL 1800 // 30 Minuten statt 5 ``` ### 3. Deaktiviere Debug-Ausgaben Entfernen Sie Serial.print() Aufrufe (spart minimal Strom) ## Troubleshooting ### Problem: ESP32 wacht nicht auf **Lösung 1**: Reset-Button drücken **Lösung 2**: USB neu verbinden **Lösung 3**: Batterie-Spannung prüfen (>3.0V nötig) ### Problem: LoRaWAN sendet nicht mehr **Ursache**: Join-Session verloren nach Deep Sleep **Lösung**: Code joint automatisch bei jedem Boot neu ### Problem: Display bleibt schwarz **Normal**: Display ist im Deep Sleep aus **Falls nach Wakeup noch aus**: Reset drücken ### Problem: Batterie hält nicht so lange **Mögliche Ursachen**: 1. Batterie-Kapazität zu niedrig gewählt 2. SLEEP_INTERVAL zu kurz eingestellt 3. Andere Verbraucher am ESP32 (LEDs, etc.) 4. LoRaWAN Join dauert zu lange (schlechter Empfang) **Lösungen**: - Größeren Akku verwenden - SLEEP_INTERVAL erhöhen - LEDs entfernen/deaktivieren - Gateway näher platzieren ## ChirpStack/TTN Anzeige ChirpStack zeigt: - **Letzte Messung**: Vor X Minuten - **Uplink Interval**: Alle 5 Minuten (bzw. SLEEP_INTERVAL) - **Frame Counter**: Zählt hoch bei jedem Boot ## Wichtige Hinweise ⚠️ **WICHTIG bei Deep Sleep:** 1. **Serial Monitor zeigt nichts** während Sleep - Normal! ESP32 ist aus 2. **USB-Verbindung bleibt aktiv** - ESP32 kann trotzdem mit Batterie laufen 3. **Beim Debuggen** (Serial Monitor): - Nach Upload: ESP32 startet automatisch - Nach Deep Sleep: Kurz aufwachen, dann wieder Sleep 4. **Upload während Sleep nicht möglich** - Drücke Reset-Button vor Upload - Oder warte bis ESP32 aufwacht ## Weitere Optimierungen Wenn noch längere Laufzeit gewünscht: 1. **Sensor Power Management** - HC-SR04 VCC an GPIO schalten - Nur bei Messung einschalten 2. **LoRa Power Amplifier deaktivieren** - TX Power reduzieren (falls Gateway nah) 3. **CPU-Frequenz reduzieren** - 80 MHz statt 240 MHz (in platformio.ini) Benötigen Sie weitere Optimierungen?