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>
291 lines
7.1 KiB
Markdown
291 lines
7.1 KiB
Markdown
# 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?
|