From f389a7deea9b36f34a376d86c6fc301698b0d8ea Mon Sep 17 00:00:00 2001 From: MaPaLo76 <72209721+MaPaLo76@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:17:32 +0100 Subject: [PATCH] docs(tests): test_sketches/README.md vollstaendig auf Phase-5-Stand --- test_sketches/README.md | 297 +++++++++++++++++++++++++++++----------- 1 file changed, 217 insertions(+), 80 deletions(-) diff --git a/test_sketches/README.md b/test_sketches/README.md index f70afe1..49c6db6 100644 --- a/test_sketches/README.md +++ b/test_sketches/README.md @@ -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: 0–3) -│ links │ │ │ rechts │ -├─────────┼─────────┼─────────┼─────────┤ -│ Modul 5 │ Modul 6 │ Modul 7 │ Modul 8 │ ← Untere Reihe (Zone 1, 0-idx: 4–7) -│ 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 1–4): zeigt `ZONE 0` bei Schritt 2 -- Untere Reihe (Modul 5–8): 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 | \ No newline at end of file