Christian Mueller e706b22f31 Add design specification for LoRaWAN Web Portal
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>
2026-03-19 22:27:49 +01:00

291 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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?