ESP32C3-ULP/docs/Info.md
XPS\Micro 2eb7680436 Aktualisiere Timing-Konfiguration: 25s aktiv + 5s Deep Sleep = 30s Periode
- ACTIVE_DURATION_MS: 5000ms → 25000ms (25 Sekunden)
- SLEEP_DURATION_S: 30s → 5s (sichtbare Messung)
- Periode: 30 Sekunden (für bessere Messgenauigkeit)
- Alle Dokumentationen (README, Info.md, config_example.h) aktualisiert
2026-04-19 12:25:37 +02:00

15 KiB
Raw Blame History

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: 25000ms = 25s)   │
        └────────┬───────────────────┘
                 ↓
  ┌──────────────────────────────────────┐
  │  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: 5 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 5           // Deep Sleep Dauer [Sekunden]
#define ACTIVE_DURATION_MS 25000     // 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)
                       = 5 + 25 = 30 Sekunden

Gesamtmessdauer = TOTAL_CYCLES × Gesamtdauer pro Zyklus
                = 10 × 30 = 300 Sekunden = 5 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

  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