Ciao a tutti,
sto lavorando a un codice che permette al dispositivo ESP8266 di connettersi a una rete WiFi salvata o se non è disponibile di avviare un Access Point per configurare una nuova connessione WiFi tramite un'interfaccia web.
questo è il codice:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
ESP8266WebServer server(80);
const char* apSSID = "ESP8266_AP";
const char* apPassword = "12345678";
void setup() {
Serial.begin(115200);
EEPROM.begin(512);
// Controlla se ci sono credenziali WiFi salvate
char ssid[32];
char password[32];
EEPROM.get(0, ssid);
EEPROM.get(32, password);
if (strlen(ssid) > 0 && strlen(password) > 0) {
WiFi.begin(ssid, password);
unsigned long startAttemptTime = millis();
// Attendi la connessione
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 10000) {
delay(100);
}
if (WiFi.status() != WL_CONNECTED) {
startAPMode();
} else {
Serial.println("Connected to WiFi");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
} else {
startAPMode();
}
server.on("/", handleRoot);
server.on("/network", handleNetwork);
server.on("/connect", handleConnect);
server.begin();
}
void loop() {
server.handleClient();
}
void startAPMode() {
WiFi.softAP(apSSID, apPassword);
Serial.println("AP Mode Started");
Serial.print("IP Address: ");
Serial.println(WiFi.softAPIP());
}
void handleRoot() {
String html = "<html><head><title>ESP8266 Network</title></head><body>";
html += "<h1>ESP8266 Network Configuration</h1>";
html += "<a href=\"/network\">Configure Network</a>";
html += "</body></html>";
server.send(200, "text/html", html);
}
void handleNetwork() {
String html = "<html><head><title>ESP8266 Network</title></head><body>";
html += "<h1>Configure Network</h1>";
html += "<form action=\"/connect\" method=\"POST\">";
html += "<label for=\"ssid\">Select Network:</label>";
html += "<select name=\"ssid\" id=\"ssid\">";
int n = WiFi.scanNetworks();
for (int i = 0; i < n; ++i) {
html += "<option value=\"" + WiFi.SSID(i) + "\">" + WiFi.SSID(i) + "</option>";
}
html += "</select><br>";
html += "<label for=\"password\">Password:</label>";
html += "<input type=\"password\" name=\"password\" id=\"password\"><br>";
html += "<input type=\"submit\" value=\"Connect\">";
html += "</form>";
html += "</body></html>";
server.send(200, "text/html", html);
}
void handleConnect() {
if (server.hasArg("ssid") && server.hasArg("password")) {
String ssid = server.arg("ssid");
String password = server.arg("password");
// Salva le credenziali in EEPROM
EEPROM.put(0, ssid.c_str());
EEPROM.put(32, password.c_str());
EEPROM.commit();
// Connetti alla rete WiFi
WiFi.begin(ssid.c_str(), password.c_str());
unsigned long startAttemptTime = millis();
// Attendi la connessione
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 10000) {
delay(100);
}
if (WiFi.status() == WL_CONNECTED) {
server.send(200, "text/html", "<html><body><h1>Connected!</h1><p>Manual restart required.</p></body></html>");
WiFi.softAPdisconnect(true); // Disattiva la modalità AP
} else {
server.send(200, "text/html", "<html><body><h1>Failed to connect.</h1><p>Manual restart required.</p></body></html>");
}
} else {
server.send(400, "text/html", "<html><body><h1>Missing SSID or Password</h1></body></html>");
}
}
fino al riavvio tutto funziona correttamente, ma appena riavviato ri-abilitra la modalità AP. cosa sbaglio nel codice?
digita o incolla il codice qui