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

7.1 KiB
Raw Permalink Blame History

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:

  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:

// 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:

  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?