Based on Pflichtenheft v2.2, documents the full system design including daemon, API, frontend, and infrastructure with agreed deviations (Axum 0.8, SQLx 0.8, Vite 6, Tailwind 4). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7.1 KiB
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 (Zeile 18-20):
// 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:
#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:
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:
-
LiPo Akku (empfohlen)
- 3.7V, 2000-6000 mAh
- Mit Schutzschaltung
- Wiederaufladbar via USB
-
18650 Lithium-Zelle
- 3.7V, 2500-3500 mAh
- Mit Battery Shield/Holder
-
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:
// 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:
#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:
- Batterie-Kapazität zu niedrig gewählt
- SLEEP_INTERVAL zu kurz eingestellt
- Andere Verbraucher am ESP32 (LEDs, etc.)
- 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:
-
Serial Monitor zeigt nichts während Sleep
- Normal! ESP32 ist aus
-
USB-Verbindung bleibt aktiv
- ESP32 kann trotzdem mit Batterie laufen
-
Beim Debuggen (Serial Monitor):
- Nach Upload: ESP32 startet automatisch
- Nach Deep Sleep: Kurz aufwachen, dann wieder Sleep
-
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:
-
Sensor Power Management
- HC-SR04 VCC an GPIO schalten
- Nur bei Messung einschalten
-
LoRa Power Amplifier deaktivieren
- TX Power reduzieren (falls Gateway nah)
-
CPU-Frequenz reduzieren
- 80 MHz statt 240 MHz (in platformio.ini)
Benötigen Sie weitere Optimierungen?