MQTT-Display-LaserCutter/test_sketches/test_wifi.cpp
MaPaLo76 c63cace1ae feat(wifi): implement WiFiManager connection handling
- include/wifi_connector.h: WifiConnector class with WifiStatus enum,
  onStatusChange callback, begin/loop/reset methods
- src/wifi_connector.cpp: autoConnect with AP timeout and restart,
  reconnect logic on connection loss, printToSerial diagnostics
- src/main.cpp: call wifiConnector.begin() and loop()
- test_sketches/test_wifi.cpp: first-connect via captive portal,
  auto-reconnect after reboot, BOOT-button (3s) resets credentials
- platformio.ini: add test-wifi environment
- Implementation-Plan.md: mark tasks 3.1-3.3 complete
2026-02-22 13:50:07 +01:00

112 lines
4.0 KiB
C++
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.

/**
* TEST SKETCH 3.3 WiFiManager Verbindungstest
*
* Testet:
* - Erstverbindung: Öffnet AP "LaserCutter-Setup" falls keine Credentials gespeichert
* - Auto-Reconnect: Nach Neustart verbindet sich der ESP32 automatisch
* - Status-Callback: jede Statusänderung wird auf Serial ausgegeben
* - Reconnect nach Verbindungsabbruch (Simulation: WLAN kurz abschalten)
*
* Ablauf:
* 1. Erstes Flash: AP "LaserCutter-Setup" erscheint → mit Handy/PC verbinden
* → http://192.168.4.1 öffnet sich automatisch → SSID + Passwort eingeben
* 2. ESP32 verbindet sich, zeigt IP auf Serial
* 3. ESP32 neu starten → verbindet sich automatisch ohne Portal
* 4. Optional: WLAN-Router kurz ausschalten → Reconnect-Meldung beobachten
*
* Flash: pio run -e test-wifi --target upload
* Monitor: pio device monitor -e test-wifi
*
* Credentials löschen (Portal erzwingen):
* Im Serial Monitor erscheint nach 30s die Meldung mit Reset-Hinweis.
* Alternativ: GPIO 0 (BOOT-Taste) beim Start 3s gedrückt halten.
*/
#include <Arduino.h>
#include "wifi_connector.h"
// BOOT-Taste (GPIO 0) für 3 Sekunden → Credentials löschen + Neustart
#define RESET_BUTTON_PIN 0
#define RESET_HOLD_MS 3000
// ---------------------------------------------------------------------------
// Status-Callback wird von WifiConnector aufgerufen
// ---------------------------------------------------------------------------
static void onWifiStatus(WifiStatus s) {
switch (s) {
case WifiStatus::DISCONNECTED:
Serial.println("[WIFI-CB] Status: DISCONNECTED");
break;
case WifiStatus::CONNECTING:
Serial.println("[WIFI-CB] Status: CONNECTING ...");
break;
case WifiStatus::AP_ACTIVE:
Serial.println("[WIFI-CB] Status: AP aktiv oeffne http://192.168.4.1");
Serial.println("[WIFI-CB] SSID: " WIFI_AP_NAME);
break;
case WifiStatus::CONNECTED:
Serial.println("[WIFI-CB] Status: CONNECTED ✓");
break;
}
}
// ---------------------------------------------------------------------------
void setup() {
Serial.begin(115200);
delay(500);
pinMode(RESET_BUTTON_PIN, INPUT_PULLUP);
Serial.println("\n========================================");
Serial.println(" TEST 3.3 WiFiManager");
Serial.println("========================================");
Serial.println(" BOOT-Taste 3s halten → Credentials loeschen");
Serial.println("========================================\n");
// BOOT-Taste beim Start prüfen → Credentials löschen
uint32_t holdStart = millis();
bool resetTriggered = false;
while (digitalRead(RESET_BUTTON_PIN) == LOW) {
if (millis() - holdStart >= RESET_HOLD_MS) {
resetTriggered = true;
break;
}
delay(50);
}
if (resetTriggered) {
Serial.println("[RESET] BOOT-Taste erkannt WiFi-Credentials werden geloescht!");
wifiConnector.resetCredentials();
delay(500);
ESP.restart();
}
// Status-Callback registrieren
wifiConnector.onStatusChange(onWifiStatus);
// WiFi starten (blockiert bis verbunden oder Timeout → Neustart)
wifiConnector.begin();
// Verbindungsdetails ausgeben
wifiConnector.printToSerial();
}
// ---------------------------------------------------------------------------
void loop() {
// Verbindung überwachen bei Abbruch automatischer Reconnect
wifiConnector.loop();
// Alle 10 s Heartbeat mit aktuellem Status
static uint32_t lastPrint = 0;
if (millis() - lastPrint >= 10000) {
lastPrint = millis();
if (wifiConnector.isConnected()) {
Serial.printf("[LIVE] Verbunden mit %s | IP: %s | RSSI: %d dBm\n",
wifiConnector.getSSID().c_str(),
wifiConnector.getIP().toString().c_str(),
wifiConnector.getRSSI());
} else {
Serial.println("[LIVE] Nicht verbunden");
}
}
}