- 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
112 lines
4.0 KiB
C++
112 lines
4.0 KiB
C++
/**
|
||
* 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");
|
||
}
|
||
}
|
||
}
|