# ESP32-C3 Power Measurement Projekt – Dokumentation ## Projektübersicht Dieses Projekt misst die **Stromaufnahme eines ESP32-C3** in verschiedenen Betriebszuständen mithilfe des **PowerProfiler Kit II** von Nordic Semiconductor. Das Ziel ist es, das Stromverbrauchsprofil des Mikrocontrollers unter verschiedenen Bedingungen (Deep Sleep, aktiv, mit/ohne WLAN) zu charakterisieren. --- ## 1. Systemarchitektur ``` ┌─────────────────────────────────────────────────────┐ │ PowerProfiler Kit II (extern) │ │ ┌─────────────────┬─────────────────┐ │ │ │ Stromquelle │ Strommessung │ │ │ │ (VDD) │ (Datenerfassung│ │ │ └────────┬────────┴────────┬────────┘ │ └──────────────┼────────────────┼───────────────────────┘ │ │ ↓ ↓ ┌─────────────────────────────┐ │ ESP32-C3 DevKit │ │ │ │ ┌───────────────────────┐ │ │ │ Firmware (Arduino) │ │ │ │ │ │ │ │ • RTC-Memory │ │ │ │ • Deep Sleep Timer │ │ │ │ • GPIO/LED Control │ │ │ │ • Serial Debug │ │ │ └───────────────────────┘ │ │ │ └─────────────────────────────┘ ↓ ┌─────────────────────────────┐ │ nRF Power Profiler App │ │ (Windows/macOS/Linux) │ │ → Grafische Messdaten │ └─────────────────────────────┘ ``` --- ## 2. Hardware-Verbindungen ### PowerProfiler Kit II ↔ ESP32-C3 | PowerProfiler Signal | ESP32-C3 Pin | Funktion | |:---|:---|:---| | **GND** | GND | Masse | | **VDD** | 5V / 3V3 | Stromversorgung | | **USB (zur Host-PC)** | — | Datenübertragung & Kalibrierung | ### ESP32-C3 GPIO (Optional) | GPIO | Funktion | Status | |:---|:---|:---| | **GPIO 2 (LED_BUILTIN)** | Status-LED | High = aktiv, Low = deep sleep | | **GPIO 9 (RX)** | Externe Wakeup (optional) | Konfigurierbar in main.cpp | | **GPIO 20 (TX) / GPIO 21 (RX)** | Serial Monitor (UART) | 115200 Baud | **Aktuelle Konfiguration**: Deep Sleep wird nur per Timer ausgelöst, GPIO-Wakeup ist optional. --- ## 3. Firmware-Ausführungsfluss ### Übersicht: Boot-Zyklus ``` ┌─────────────────────────────────────────────────────┐ │ Power-On Reset │ │ oder RTC-Timer Wakeup │ └────────────────────┬────────────────────────────────┘ ↓ ┌────────────────────────────┐ │ setup() wird ausgeführt │ │ (loop() läuft nie!) │ └────────┬───────────────────┘ ↓ ┌─────────────────────────────────┐ │ 1. Serial initialisieren │ │ 2. bootCount++ (RTC-Speicher) │ │ 3. Boot-Information ausgeben: │ │ • Boot-Nummer │ │ • Reset-Grund │ │ • Aktuelle Cycle-Nr. │ │ • WiFi-Status │ └────────────┬────────────────────┘ ↓ ┌────────────────────────────┐ │ LED einschalten (HIGH) │ │ ACTIVE_DURATION_MS warten │ │ (Standard: 5000ms = 5s) │ └────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 4. Cycle-Status ausgeben │ │ 5. Sleep-Dauer ankündigen │ │ 6. Serial-Buffer leeren (flush) │ └──────────┬───────────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ esp_sleep_enable_timer_wakeup() │ │ (SLEEP_DURATION_S * 1.000.000 µs) │ │ Standard: 30 Sekunden │ └──────────┬───────────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ LED ausschalten (LOW) │ │ esp_deep_sleep_start() │ │ → CPU-Halt, nur RTC läuft │ └──────────┬───────────────────────────┘ ↓ [DEEP SLEEP] Dauer: SLEEP_DURATION_S Stromaufnahme: µA-Bereich ↓ ┌──────────────────────────────────────┐ │ RTC-Timer läuft ab → Wakeup │ │ Reset-Grund: DEEPSLEEP_RESET (Code) │ │ bootCount bleibt erhalten │ └──────────┬───────────────────────────┘ ↓ [Rückkehr zu setup()] ← Der Zyklus beginnt von vorne ``` ### Reset-Ursachen (esp_reset_cause) | Code | Bedeutung | Häufigkeit | |:---|:---|:---| | **1** | Power-On Reset | Einmalig beim Start | | **5** | Deep Sleep Reset | Jeder Wakeup aus Timer | | **6** | GPIO Reset (ext. Wakeup) | Nur mit GPIO-Konfiguration | **Wichtig**: Die Firmware prüft die Reset-Ursache, um zwischen erstem Boot und regelmäßigen Wakeups zu unterscheiden. --- ## 4. Konfigurationsparameter Alle Einstellungen befinden sich in `include/config.h`: ```c // Zyklusparameter #define SLEEP_DURATION_S 30 // Deep Sleep Dauer [Sekunden] #define ACTIVE_DURATION_MS 5000 // Aktive Zeit [Millisekunden] #define TOTAL_CYCLES 10 // Anzahl Messzyklen // WLAN-Parameter #define WIFI_SSID "YOUR_SSID" #define WIFI_PASSWORD "YOUR_PASSWORD" #define WIFI_ENABLED_CYCLE_1 true // A/B-Test: Erste Messung MIT WLAN #define WIFI_ENABLED_CYCLE_2 false // A/B-Test: Zweite Messung OHNE WLAN // Debug #define SERIAL_DEBUG 1 // Serial-Output aktivieren ``` ### Berechnete Werte ``` Gesamtdauer pro Zyklus = SLEEP_DURATION_S + (ACTIVE_DURATION_MS / 1000) = 30 + 5 = 35 Sekunden (Beispiel) Gesamtmessdauer = TOTAL_CYCLES × Gesamtdauer pro Zyklus = 10 × 35 = 350 Sekunden ≈ 5,8 Minuten ``` --- ## 5. RTC-Memory (Datenpersistierung über Sleep) ### Was ist RTC-Memory? RTC = **Real Time Clock**. Während Deep Sleep sind fast alle Komponenten des ESP32-C3 ausgeschaltet, aber der RTC-Timer läuft mit minimalem Stromverbrauch weiter. RTC-Memory behält seinen Zustand. ### Verwendung im Projekt ```cpp RTC_DATA_ATTR uint32_t bootCount = 0; ``` - **RTC_DATA_ATTR**: Speichert die Variable in RTC-Memory - **bootCount**: Wird bei jedem Boot inkrementiert, bleibt über Deep Sleep erhalten - **Nutzen**: Tracking der Messvorgänge ohne externe Speicherung ### Ablauf ``` Boot #1: bootCount=1, Deep Sleep 30s Boot #2: bootCount=2 (erhalten!), Deep Sleep 30s Boot #3: bootCount=3 (erhalten!), Deep Sleep 30s ... Boot #10: bootCount=10, fertig ``` --- ## 6. Serial-Debug-Output ### Beispiel-Ausgabe ``` === ESP32-C3 Power Measurement === Boot #1 Reset Reason: 5 Cycle: 1/20 | WiFi: ON Going to sleep for 30 seconds... === ESP32-C3 Power Measurement === Boot #2 Reset Reason: 5 Cycle: 2/20 | WiFi: OFF Going to sleep for 30 seconds... [weitere Zyklen...] ``` ### Ausgabe-Bedeutung | Feld | Erklärung | |:---|:---| | **Boot #X** | Seitwert seit Erstes Einschalten | | **Reset Reason: 5** | DEEPSLEEP_RESET = regulärer Wakeup | | **Cycle: X/20** | Aktuelle Messposition / Gesamtanzahl | | **WiFi: ON/OFF** | A/B-Test-Status: Ist WLAN aktiviert? | ### Serial-Monitoring **Voraussetzung**: ESP32-C3 per USB mit Computer verbunden (bleibt angesteckt während der Messung). ```bash # Terminal-Verbindung starten (115200 Baud) pio device monitor -b 115200 # ESP32-spezifische Exception-Dekodierung pio device monitor -b 115200 --filter=esp32_exception_decoder ``` Mit `Ctrl+C` beenden. --- ## 7. Power-Measurement-Prozess ### Physikalischer Ablauf ``` ┌──────────────────────────────────────────┐ │ nRF Power Profiler App öffnen (Host-PC) │ └────────────┬─────────────────────────────┘ ↓ ┌──────────────────────────────────────────┐ │ PowerProfiler Kit II via USB anschließen│ │ → Firmware kalibrieren & starten │ └────────────┬─────────────────────────────┘ ↓ ┌──────────────────────────────────────────┐ │ ESP32-C3 per Micro-USB anschließen │ │ (bleibt während Messung angesteckt) │ └────────────┬─────────────────────────────┘ ↓ ┌──────────────────────────────────────────┐ │ Recording starten (PowerProfiler App) │ │ → Profiler erfasst Stromkurve │ └────────────┬─────────────────────────────┘ ↓ ┌──────────────────────────────────────────┐ │ Firmware hochladen (pio run -t upload) │ │ → Firmware startet automatisch │ └────────────┬─────────────────────────────┘ ↓ ┌──────────────────────────────────────────┐ │ Firmware läuft Zyklen (Stromzustandsändr.│ │ → Power Profiler erfasst Daten │ │ → Serial Monitor zeigt Milestones │ └────────────┬─────────────────────────────┘ ↓ ┌──────────────────────────────────────────┐ │ Nach TOTAL_CYCLES: Gerät bleibt im │ │ Deep Sleep (RTC Timer wartet) │ │ → Recording stoppen │ │ → Messungen exportieren/analysieren │ └──────────────────────────────────────────┘ ``` ### Messgröße und Genauigkeit - **PowerProfiler Kit II Genauigkeit**: µA-Bereich (Mikro-Ampere) - **Samplingrate**: App-abhängig (typisch: 1 kHz oder mehr) - **Zeitsynchronisation**: Serial-Output (Boot/Sleep-Ankündigung) korreliert mit Stromkurve - **A/B-Test**: Vergleich Cycle 1 (WiFi-ON) vs. Cycle 2 (WiFi-OFF) zeigt WiFi-Stromverbrauch --- ## 8. Erweiterungsmöglichkeiten ### 1. WiFi-Aktivierung ```cpp if (wifiEnabled) { WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // Stromaufnahme während WiFi-Verbindung messen } ``` ### 2. BLE statt WiFi ```cpp #include // BLE-Beacon oder Scan für höhere Stromaufnahme als WiFi ``` ### 3. GPIO-Trigger für genaue Timing ```cpp // Pin 9 als Wakeup-Quelle statt nur Timer esp_sleep_enable_ext0_wakeup(GPIO_NUM_9, 0); ``` ### 4. Längere Messserien Erhöhen Sie `TOTAL_CYCLES` für längere Messzeiten (z. B. 100 Zyklen = ~58 min bei 35s Periode). --- ## 9. Troubleshooting | Problem | Ursache | Lösung | |:---|:---|:---| | Gerät startet nicht | Zu viel Strom beim Upload | PowerProfiler ausschalten, dann erneut hochladen | | Keine Serial-Ausgabe | Falsche Baud-Rate | Auf 115200 Baud stellen | | bootCount setzt sich zurück | Stromunterversorgung | PowerProfiler-Verbindung prüfen | | Unerwartetes Wakeup | GPIO-Interferenz | GPIO-Wakeup deaktivieren | | Stromzustandssprünge | WiFi-Activity | WIFI_ENABLED_CYCLE Flags prüfen | --- ## 10. Zusammenfassung: Messprinzip 1. **Setup**: PowerProfiler Kit II liefert Strom, nRF App erfasst Stromkurve 2. **Firmware-Laden**: Enthält Konfiguration (Sleep-/Wakeup-Parameter, WiFi-Flags) 3. **Boot-Zyklus**: Jeder Boot inkrementiert `bootCount`, wartet `ACTIVE_DURATION_MS`, schläft dann `SLEEP_DURATION_S` 4. **RTC-Memory**: Erhält `bootCount` über Sleep-Phasen 5. **Messdaten**: Stromkurve vom PowerProfiler + Serial-Milestones vom ESP32 → Korrelation = genaues Profil 6. **A/B-Test**: Erste Messung (WiFi-ON) vs. zweite Messung (WiFi-OFF) direkt vergleichbar --- ## Bootloader-Modus (für Upload) Der ESP32-C3 muss sich im Bootloader-Modus befinden, um neue Firmware zu akzeptieren: ### Aktivierung ``` 1. BOOT-Taste drücken + halten 2. RESET-Taste drücken + loslassen 3. BOOT-Taste auch loslassen 4. LED blinkt grün → Bootloader aktiv ``` ### Pins auf dem ESP32-C3-DevKitM-1 - **BOOT**: GPIO0 (links neben USB) - **RESET**: Oben rechts (neben BOOT) Beide Tasten sind Druck-Schalter. Sequenz muss genau eingehalten werden. --- ## Dateien & Verzeichnisse ``` ESP32C3-ULP/ ├── src/ │ └── main.cpp ← Hauptfirmware ├── include/ │ └── config.h ← Alle Konfigurationsparameter ├── platformio.ini ← PlatformIO-Konfiguration ├── README.md ← Kurze Anleitung ├── CLAUDE.md ← Hinweise für Claude Code └── docs/ └── Info.md ← Diese Datei ``` --- **Version**: 1.1 **Letztes Update**: 19.04.2026 **Autor**: Projekt-Dokumentation