docs(tests): test_sketches/README.md vollstaendig auf Phase-5-Stand

This commit is contained in:
MaPaLo76 2026-02-22 19:17:32 +01:00
parent d5d0085d93
commit f389a7deea

View File

@ -1,121 +1,258 @@
# Test Sketches Hardware-Verdrahtungstests
# Test Sketches - Hardware-Verifikationstests
Diese Verzeichnis enthält eigenständige Test-Sketches zur Verifikation der Hardware-Verdrahtung.
Sie laufen als separate PlatformIO-Environments und berühren `main.cpp` nicht.
Eigenstaendige Test-Sketches zur Verifikation der Hardware und einzelner Subkomponenten.
Jeder Sketch laeuft als separates PlatformIO-Environment und beruehrt `src/main.cpp` nicht.
---
## Physische Modul-Anordnung (GYMAX7219, 4×2)
## Physisches Display-Layout (GYMAX7219, 4x2)
```
DIN ← ESP32 GPIO 23
┌─────────┬─────────┬─────────┬─────────┐
│ Modul 1 │ Modul 2 │ Modul 3 │ Modul 4 │ ← Obere Reihe (Zone 0, 0-idx: 03)
│ links │ │ │ rechts │
├─────────┼─────────┼─────────┼─────────┤
│ Modul 5 │ Modul 6 │ Modul 7 │ Modul 8 │ ← Untere Reihe (Zone 1, 0-idx: 47)
│ links │ │ │ rechts │
└─────────┴─────────┴─────────┴─────────┘
DOUT Modul 4 DIN Modul 5 (Reihen verbinden)
DIN <- ESP32 GPIO 23
|
+----------+----------+----------+----------+
| Modul 1 | Modul 2 | Modul 3 | Modul 4 | <- Obere Reihe (0-idx: 0-3)
| links | | | rechts |
+----------+----------+----------+----------+
| Modul 5 | Modul 6 | Modul 7 | Modul 8 | <- Untere Reihe (0-idx: 4-7)
| links | | | rechts |
+----------+----------+----------+----------+
DOUT Modul 4 -> DIN Modul 5 (Reihen verbinden)
```
SPI-Datenfluss: ESP32 → Modul 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8
SPI-Datenfluss: ESP32 -> Modul 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8
**Hardware-Typ:** `GENERIC_HW` (verifiziert; 90° CCW Software-Rotation aktiv)
**Hardware-Typ:** `GENERIC_HW` (verifiziert; 90 Grad CCW Software-Rotation aktiv per `rotateCCW()`)
### Modul-Belegung im Betrieb
| Modul(e) | 0-Index | Funktion |
|-----------|---------|-------------------------------------------------------|
| Modul 1 | 0 | WiFi-Fehler-Indikator (`E` = kein WLAN, leer = OK) |
| Modul 2-4 | 1-3 | Session-Minuten ganzzahlig (0 bei Neustart, RAM-only) |
| Modul 5 | 4 | MQTT-Fehler-Indikator (`E` = kein Broker, leer = OK) |
| Modul 6-8 | 5-7 | Countdown (Gratiszeit) oder `--` (Idle/Netto) |
---
## Test 1.4 Dot-Matrix-Display (`test_display.cpp`)
## Test 1.4 - Dot-Matrix-Display (`test_display.cpp`)
### Zweck
- Alle 8 Module in korrekter Reihenfolge und Ausrichtung prüfen
- Zonentrennung (Zone 0 = oben, Zone 1 = unten) verifizieren
- Realistische Anzeige (Minuten / Countdown) demonstrieren
### Verdrahtung
| ESP32 GPIO | Modul-Pin | Beschreibung |
|-----------|-----------|---------------------|
| GPIO 23 | DIN | SPI Data (VSPI MOSI)|
| GPIO 18 | CLK | SPI Clock |
| GPIO 5 | CS / LOAD | SPI Chip Select |
| GND | GND | Masse (gemeinsam mit ESP32 GND) |
| **5V extern** | VCC | **Externes Netzteil ≥ 1 A** (USB-Port des ESP32 reicht nicht gemessen 0,5 A / 2,5 W) |
> Alle 8 Module teilen CLK und CS. DIN eines Moduls wird mit DOUT des Vorgängers verbunden.
Verdrahtung und Ausrichtung aller 8 GYMAX7219-Module pruefen.
### Flash & Monitor
```bash
pio run -e test-display --target upload
pio device monitor -e test-display
```
### Ablauf
1. **Alle LEDs EIN** (2 s) → prüfen ob alle 8 Module reagieren
2. **ZONE 0** auf oberer Reihe, `------` auf unterer Reihe
3. **ZONE 1** auf unterer Reihe, `------` auf oberer Reihe
4. **Realistische Anzeige**: `42.5` oben, `20` unten
5. **Laufende Zähler** im Loop: Minuten und Countdown-Sekunden
### Verdrahtung
### Erwartetes Ergebnis
- Obere Reihe (Modul 14): zeigt `ZONE 0` bei Schritt 2
- Untere Reihe (Modul 58): zeigt `ZONE 1` bei Schritt 3
- Text erscheint lesbar von links nach rechts (nicht gespiegelt)
| ESP32 GPIO | Modul-Pin | Beschreibung |
|---------------|-----------|-----------------------------------------------------------|
| GPIO 23 | DIN | SPI Data (VSPI MOSI) |
| GPIO 18 | CLK | SPI Clock |
| GPIO 5 | CS / LOAD | SPI Chip Select |
| GND | GND | Masse (gemeinsam mit ESP32 GND) |
| **5V extern** | VCC | **Externes Netzteil >= 1 A** (USB-Port reicht nicht aus) |
### Erwartetes Verhalten
1. Alle LEDs EIN (2 s) - alle 8 Module leuchten
2. Jedes Modul zeigt seine Nummer einzeln
3. Realistische Anzeige: Minuten oben, Countdown unten
Text erscheint lesbar (nicht gespiegelt oder kopfstehend).
### Ergebnis
- [x] GYMAX7219 mit `GENERIC_HW` + 90 Grad CCW Software-Rotation
- [x] Modul 1 oben-links, Modul 8 unten-rechts
- [x] Externes 5 V-Netzteil notwendig
---
## Test 1.5 Potentialfreier Schalter / Push Button (`test_button.cpp`)
## Test 1.5 - Potentialfreier Schalter (`test_button.cpp`)
### Zweck
- GPIO-Eingang mit INPUT_PULLUP testen
- Pegel bei offenem und geschlossenen Schalter dokumentieren
- Debounce-Verhalten prüfen (50 ms)
- Betätigungsdauer (Basis für Gratiszeit-Logik) messen
### Verdrahtung Phase 1: Push Button
```
ESP32 GPIO 4 ────┤ Button ├──── GND
(NO-Kontakt)
```
Kein externer Widerstand nötig der interne Pull-Up (INPUT_PULLUP) ist aktiv.
### Verdrahtung Phase 2: Optokoppler (Laser-Signal)
```
ESP32 GPIO 4 ──── Kollektor
Optokoppler
GND ──── Emitter
```
Gleiche Logik wie Button Laser aktiv = Optokoppler zieht GPIO auf GND.
GPIO-Eingang (INPUT_PULLUP) testen, Pegel und Entprellzeit verifizieren.
### Flash & Monitor
```bash
pio run -e test-button --target upload
pio device monitor -e test-button
```
### Erwartetes Ergebnis
### Verdrahtung
| Zustand | GPIO-Pegel | Serial-Ausgabe |
|-------------------|-----------|------------------------|
| Button offen | HIGH | `HIGH (inaktiv)` |
| Button gedrückt | LOW | `LOW → LASER AKTIV` |
```
ESP32 GPIO 4 ----| Button |----- GND (kein externer Widerstand noetig)
```
→ Polarität: `LOW_ACTIVE` (Standardwert in `config.h` / NVS)
### Erwartetes Verhalten
Alle 5 Sekunden erscheint ein Heartbeat mit aktuellem Pegel und Betätigungszähler.
| Zustand | GPIO-Pegel | Serial-Ausgabe |
|------------------|------------|----------------------|
| Schalter offen | HIGH | `HIGH (inaktiv)` |
| Schalter geschl. | LOW | `LOW -> LASER AKTIV` |
### Ergebnis
- [x] `LOW_ACTIVE`-Polaritaet bestaetigt
- [x] Debounce 50 ms funktioniert
---
## Testergebnisse
## Test 2.2 - NVS Persistenz (`test_nvs.cpp`)
| Task | Status | Ergebnis |
|------|--------|----------|
| 1.4 Display | ✅ | GYMAX7219 mit `GENERIC_HW` + 90° CCW Software-Rotation; Modul 1 oben-links, Modul 8 unten-rechts; externes 5 V-Netzteil notwendig |
| 1.5 Button | ✅ | `LOW_ACTIVE`; Debounce 50 ms funktioniert |
### Zweck
Schreiben, Lesen und Reset aller NVS-Werte ueber den `SettingsManager` pruefen.
### Flash & Monitor
```bash
pio run -e test-nvs --target upload
pio device monitor -e test-nvs
```
### Testablauf
1. Testwerte in NVS schreiben (MQTT-Config, gratisSeconds, totalMinutes, Polaritaet)
2. NVS-Werte zuruecklesen und pruefen
3. ESP32 neu starten -> Werte muessen erhalten bleiben
4. `settings.reset()` aufrufen -> alle Werte auf Default zurueck
### Erwartetes Verhalten
Alle Pruefungen als `PASS` im Serial Monitor. Nach Neustart bleiben geschriebene Werte erhalten.
### Ergebnis
- [x] NVS Roundtrip fuer alle Felder bestanden
- [x] `reset()` setzt auf Defaults zurueck
- [x] Persistenz ueber Neustart bestaetigt
---
## Test 3.3 - WiFiManager (`test_wifi.cpp`)
### Zweck
WiFiManager Captive Portal und WLAN-Verbindungsaufbau testen.
### Flash & Monitor
```bash
pio run -e test-wifi --target upload
pio device monitor -e test-wifi
```
### Testablauf
1. **Erstes Flash:** ESP32 oeffnet AP `LaserCutter-Setup`
2. Mit Handy/PC mit AP verbinden - Captive Portal oeffnet sich automatisch
3. WLAN-Credentials eingeben und speichern
4. ESP32 verbindet sich mit dem WLAN und gibt IP-Adresse aus
5. **BOOT-Taste (GPIO 0) beim Start 3 s halten** -> gespeicherte Credentials loeschen, AP neu oeffnen
### Erwartetes Verhalten
Nach erfolgreicher Verbindung im Serial Monitor:
```
[WiFi] Verbunden: 192.168.x.x
```
### Ergebnis
- [x] Captive Portal startet korrekt
- [x] Credentials werden in NVS gespeichert
- [x] Reconnect nach Neustart ohne Portal
---
## Test 4.3 - DisplayManager (`test_display_manager.cpp`)
### Zweck
Alle `show*`-Methoden des `DisplayManager` auf korrektes Modul-Mapping und Darstellung pruefen.
### Flash & Monitor
```bash
pio run -e test-display-mgr --target upload
pio device monitor -e test-display-mgr
```
### Testablauf (automatisch, kein Eingriff noetig)
Der Sketch durchlaeuft nacheinander:
| Schritt | Methode | Modul(e) | Erwartete Anzeige |
|---------|---------------------------|----------|----------------------------|
| 1 | `showWifiError(true)` | 0 | `E` |
| 2 | `showWifiError(false)` | 0 | leer |
| 3 | `showLaserTime(0)` | 1-3 | ` 0` |
| 4 | `showLaserTime(42)` | 1-3 | ` 42` |
| 5 | `showLaserTime(999)` | 1-3 | `999` |
| 6 | `showMqttError(true)` | 4 | `E` |
| 7 | `showMqttError(false)` | 4 | leer |
| 8 | `showCountdown(20)` | 5-7 | ` 20` |
| 9 | `showCountdown(1)` | 5-7 | ` 1` |
| 10 | `showIdle()` | 5-7 | ` --` |
### Ergebnis
- [x] Alle Module reagieren auf die korrekten Methoden
- [x] showLaserTime() zeigt ganze Zahlen rechtbuendig
- [x] Fehler-Indikatoren auf Modul 0 und 4 unabhaengig voneinander
---
## Test 5.6 - LaserTracker (`test_laser_tracker.cpp`)
### Zweck
Burst-Zustandsmaschine, Gratiszeit-Countdown, Session-Minuten und NVS-Gesamtzeit pruefen.
### Flash & Monitor
```bash
pio run -e test-laser-tracker --target upload
pio device monitor -e test-laser-tracker
```
### Verdrahtung
GPIO 4: Push-Button gegen GND (simuliert Laser-AN/AUS, LOW_ACTIVE)
### Testablauf
**A) Gratis-Burst (Laser < 20 s):**
1. Schalter schliessen -> Countdown startet auf Modul 6-8
2. Schalter vor Ablauf der 20 s oeffnen
3. Erwartung: Session-Minuten unveraendert (0), NVS erhoehte sich um Burst-Dauer
**B) Netto-Burst (Laser > 20 s):**
1. Schalter schliessen -> Countdown startet
2. Nach 20 s -> Countdown erlischt, Module 6-8 zeigen `--`
3. Schalter nach z.B. 80 Netto-Sekunden oeffnen
4. Erwartung: keine Minutenaenderung (80 s < 60 s ist falsch; 80 s >= 60 s -> +1 Minute auf Modul 2-4)
**C) Neustart-Test:**
1. ESP32 neu starten
2. Erwartung: Session-Minuten = 0 auf Modul 2-4
3. NVS-Gesamtzeit aus vorherigen Bursts bleibt erhalten (im Serial Monitor sichtbar)
**D) Komplett-Reset:**
1. BOOT-Taste (GPIO 0) 3 Sekunden halten
2. Erwartung: `settings.reset()` + `resetTotal()` -> gratisSeconds = 20, totalMinutes = 0
### Erwartetes Display-Verhalten
| Zustand | Module 1-3 (Session) | Module 5-7 (Status) |
|----------------------------|----------------------|-----------------------|
| Idle | ` 0` | ` --` |
| Laser an (0-20 s) | ` 0` | `20` -> `1` Countdown |
| Laser an (> 20 s) | ` 0` | ` --` |
| Laser aus nach 80 Netto-s | ` 1` | ` --` |
| Neustart | ` 0` | ` --` |
### Ergebnis
- [x] GRATIS -> NET_COUNTING Uebergang nach 20 s
- [x] Session-Minuten incrementieren hart bei 60 Netto-Sekunden
- [x] Gratis-Bursts addieren keine Session-Zeit
- [x] NVS zaehlt gesamte Laser-AN-Zeit (inkl. Gratiszeit)
- [x] resetTotal() loescht NVS + Session
---
## Gesamt-Testergebnisse
| Test | Environment | Status | Anmerkung |
|------|----------------------|--------|-------------------------------------------------------------------|
| 1.4 | `test-display` | OK | GENERIC_HW, 90 Grad CCW Rotation, externes 5V-Netzteil |
| 1.5 | `test-button` | OK | LOW_ACTIVE, Debounce 50 ms |
| 2.2 | `test-nvs` | OK | Alle NVS-Felder, Roundtrip, Persistenz, Reset |
| 3.3 | `test-wifi` | OK | Captive Portal, Credentials-Persistenz, Reconnect |
| 4.3 | `test-display-mgr` | OK | Alle show*-Methoden, Modul-Mapping, Fehler-Indikatoren |
| 5.6 | `test-laser-tracker` | OK | Burst-Logik, Gratiszeit, Session/NVS-Trennung, Reset |