MQTT-Display-LaserCutter/test_sketches
2026-02-22 19:17:32 +01:00
..
README.md docs(tests): test_sketches/README.md vollstaendig auf Phase-5-Stand 2026-02-22 19:17:32 +01:00
test_button.cpp feat(phase1): complete hardware setup, display and button test sketches 2026-02-22 13:20:52 +01:00
test_display_manager.cpp fix(display): redesign module layout - integer minutes, dedicated error slots 2026-02-22 14:15:18 +01:00
test_display.cpp feat(phase1): complete hardware setup, display and button test sketches 2026-02-22 13:20:52 +01:00
test_laser_tracker.cpp docs(readme): README auf Phase-5-Stand aktualisiert, Tests-Sektion ergaenzt 2026-02-22 19:14:15 +01:00
test_nvs.cpp feat(settings): implement NVS persistence via Preferences 2026-02-22 13:35:44 +01:00
test_wifi.cpp feat(wifi): implement WiFiManager connection handling 2026-02-22 13:50:07 +01:00

Test Sketches - Hardware-Verifikationstests

Eigenstaendige Test-Sketches zur Verifikation der Hardware und einzelner Subkomponenten. Jeder Sketch laeuft als separates PlatformIO-Environment und beruehrt src/main.cpp nicht.


Physisches Display-Layout (GYMAX7219, 4x2)

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

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)

Zweck

Verdrahtung und Ausrichtung aller 8 GYMAX7219-Module pruefen.

Flash & Monitor

pio run -e test-display --target upload
pio device monitor -e test-display

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 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

  • GYMAX7219 mit GENERIC_HW + 90 Grad CCW Software-Rotation
  • Modul 1 oben-links, Modul 8 unten-rechts
  • Externes 5 V-Netzteil notwendig

Test 1.5 - Potentialfreier Schalter (test_button.cpp)

Zweck

GPIO-Eingang (INPUT_PULLUP) testen, Pegel und Entprellzeit verifizieren.

Flash & Monitor

pio run -e test-button --target upload
pio device monitor -e test-button

Verdrahtung

ESP32 GPIO 4  ----| Button |----- GND   (kein externer Widerstand noetig)

Erwartetes Verhalten

Zustand GPIO-Pegel Serial-Ausgabe
Schalter offen HIGH HIGH (inaktiv)
Schalter geschl. LOW LOW -> LASER AKTIV

Ergebnis

  • LOW_ACTIVE-Polaritaet bestaetigt
  • Debounce 50 ms funktioniert

Test 2.2 - NVS Persistenz (test_nvs.cpp)

Zweck

Schreiben, Lesen und Reset aller NVS-Werte ueber den SettingsManager pruefen.

Flash & Monitor

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

  • NVS Roundtrip fuer alle Felder bestanden
  • reset() setzt auf Defaults zurueck
  • Persistenz ueber Neustart bestaetigt

Test 3.3 - WiFiManager (test_wifi.cpp)

Zweck

WiFiManager Captive Portal und WLAN-Verbindungsaufbau testen.

Flash & Monitor

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

  • Captive Portal startet korrekt
  • Credentials werden in NVS gespeichert
  • 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

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

  • Alle Module reagieren auf die korrekten Methoden
  • showLaserTime() zeigt ganze Zahlen rechtbuendig
  • 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

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

  • GRATIS -> NET_COUNTING Uebergang nach 20 s
  • Session-Minuten incrementieren hart bei 60 Netto-Sekunden
  • Gratis-Bursts addieren keine Session-Zeit
  • NVS zaehlt gesamte Laser-AN-Zeit (inkl. Gratiszeit)
  • 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