ESP32C3-ULP/docs/Info.md
XPS\Micro 2e5001f0d1 Dokumentiere Bootloader-Modus für ESP32-C3 Upload
- 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
2026-04-19 11:28:48 +02:00

390 lines
15 KiB
Markdown
Raw 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.

# 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 <BLEDevice.h>
// 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