#include <EEPROM.h>
#include <WiFiManager.h>
#include <ESPAsyncWebServer.h>
AsyncWebServer server(80);
// Struktur für die GPIO-Konfigurationen
struct GPIOConfig {
uint8_t sensorPin;
uint8_t heaterPin;
uint8_t ledPin;
uint8_t potiPin;
bool coolingMode;
};
// Standard-GPIO-Pin-Konfigurationen
GPIOConfig gpioConfig = {2, 4, 15, 19, true};
void saveConfigCallback() {
// Diese Funktion wird aufgerufen, wenn die WiFi-Konfiguration geändert wurde
saveConfig();
}
void setup() {
Serial.begin(115200);
Serial.println("--------------- init esp --------------");
// Initialisiere die WiFi-Manager-Bibliothek
WiFiManager wifiManager;
// Versuche, die gespeicherte Konfiguration zu laden
loadConfig();
Serial.print("gpioConfig.coolingMode: ");
Serial.println(gpioConfig.coolingMode);
gpioConfig.sensorPin =11;
gpioConfig.heaterPin = 5;
// Wenn wir erfolgreich verbunden sind oder neue Konfigurationen gespeichert wurden, speichern wir diese
saveConfig();
loadConfig();
Serial.print("gpioConfig.sensorPin: ");
Serial.println(gpioConfig.sensorPin);
Serial.print("gpioConfig.heaterPin: ");
Serial.println(gpioConfig.heaterPin);
// Verbinde zum WiFi mit den geladenen Konfigurationen oder starte den Konfigurationsmodus
if (!wifiManager.autoConnect("ESP32-Config")) {
Serial.println("Failed to connect and hit timeout");
// Hier könntest du weitere Maßnahmen ergreifen, z.B. einen Neustart des ESP32
}
gpioConfig.sensorPin =11;
// Wenn wir erfolgreich verbunden sind oder neue Konfigurationen gespeichert wurden, speichern wir diese
saveConfig();
// Routen für den Webserver definieren
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/html", configPage());
});
// Route für das Speichern der Konfiguration
server.on("/", HTTP_POST, [](AsyncWebServerRequest *request){
// Verarbeite Formulardaten und speichere die GPIO-Konfigurationen im EEPROM
gpioConfig.sensorPin = request->arg("sensor_pin").toInt();
gpioConfig.heaterPin = request->arg("heater_pin").toInt();
gpioConfig.ledPin = request->arg("led_pin").toInt();
gpioConfig.potiPin = request->arg("poti_pin").toInt();
saveConfig();
// Leite den Benutzer auf die Konfigurationsseite zurück
request->redirect("/");
});
// Starte den Webserver
server.begin();
Serial.println(gpioConfig.sensorPin);
}
void loop() {
// Handle Webserver-Anfragen
//server.handleClient();
}
String configPage() {
// Erzeuge die HTML-Seite mit den aktuellen GPIO-Werten
String page = "<html><body><h1>GPIO-Konfiguration</h1>";
page += "<form action=\"/\" method=\"post\">";
page += "Sensor-Pin: <input type=\"text\" name=\"sensor_pin\" value=\"" + String(gpioConfig.sensorPin) + "\"><br>";
page += "Heater-Pin: <input type=\"text\" name=\"heater_pin\" value=\"" + String(gpioConfig.heaterPin) + "\"><br>";
page += "LED-Pin: <input type=\"text\" name=\"led_pin\" value=\"" + String(gpioConfig.ledPin) + "\"><br>";
page += "Poti-Pin: <input type=\"text\" name=\"poti_pin\" value=\"" + String(gpioConfig.potiPin) + "\"><br>";
page += "<input type=\"submit\" value=\"Speichern\">";
page += "</form></body></html>";
return page;
}
void saveConfig() {
// Speichere die GPIO-Konfigurationen im EEPROM
EEPROM.put(0, gpioConfig);
EEPROM.commit();
Serial.println("saved");
}
void loadConfig() {
// Lade die GPIO-Konfigurationen aus dem EEPROM
EEPROM.get(0, gpioConfig);
Serial.println("loaded");
}