- Tasten-Sequenz: BOOT halten → RESET → BOOT loslassen - Erforderlich für erfolgreichen Firmware-Upload - LED-Indikator für Bootloader-Modus (grünes Blinken) - Pin-Positionen auf DevKit dokumentiert
15 KiB
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:
// 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
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).
# 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
if (wifiEnabled) {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
// Stromaufnahme während WiFi-Verbindung messen
}
2. BLE statt WiFi
#include <BLEDevice.h>
// BLE-Beacon oder Scan für höhere Stromaufnahme als WiFi
3. GPIO-Trigger für genaue Timing
// 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
- Setup: PowerProfiler Kit II liefert Strom, nRF App erfasst Stromkurve
- Firmware-Laden: Enthält Konfiguration (Sleep-/Wakeup-Parameter, WiFi-Flags)
- Boot-Zyklus: Jeder Boot inkrementiert
bootCount, wartetACTIVE_DURATION_MS, schläft dannSLEEP_DURATION_S - RTC-Memory: Erhält
bootCountüber Sleep-Phasen - Messdaten: Stromkurve vom PowerProfiler + Serial-Milestones vom ESP32 → Korrelation = genaues Profil
- 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