Sono riuscito a risolvere il problema, ora vorrei fare un ulteriore passo in avanti.
Vorrei che il collegamento con la pagina Web avvenisse senza digitare l'indirizzo IP sul browser ma ad esempio la scritta "ESP32" che suppongo vada a mascherare (?) l'indirizzo. Purtroppo non conosco HTML dunque non saprei minimamente come procedere. Vi ringrazio anticipatamente.
Allego codice:
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
// Includiamo la pagina HTML
#include "index2.h"
#include "page2.h"
WebServer server(80); // identifichiamo il server
char ssidAP[] = "ESP32"; // identificatico dell'AP
char passwordAP[] = "12345678"; //Password per la connessione
// definizione degli indirizzi
IPAddress local_ip(192,168,2,1);
IPAddress gateway(192,168,2,1);
IPAddress subnet(255,255,255,0);
String ssid, password, ip;
int Pin_LED = 33; // definizione del pin
int connesso;
int LED = LOW; // default dello stato dei LED
unsigned long timeoutCurrent= millis();
unsigned long timeout = millis();
void setup()
{
Serial.begin(9600);
pinMode(Pin_LED, OUTPUT); // definiamo i pins dei LEDs come output
WiFi.persistent(true);
WiFi.mode(WIFI_STA); // Station mode
WiFi.begin();
Serial.println("Connessione alla rete WiFi in corso");
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
if (millis() - timeout > 10000) {
Serial.println("Connessione fallita. Avvio AP mode");
connesso=0;
break;
}
else
connesso=4;
}
}
void handleRoot() {
// String s = MAIN_page; // completamente inutile questo passaggio
server.send(200, "text/html", MAIN_page);
if(server.hasArg("ssid")) {
ssid = server.arg("ssid");
}
if(server.hasArg("password")) {
password = server.arg("password");
}
if(server.hasArg("ip")) {
ip= server.arg("ip");
}
Serial.println(ssid);
Serial.println(password);
Serial.println(ip);
}
void home() // funzione di default
{ // invio della pagina HTML
server.send(200, "text.html", codice_pagina(LED));
}
void LED_funzione() // funzione del diodo LED verde,
{
LED = !LED; // invio della pagina HTML
digitalWrite(Pin_LED, LED);
server.send(200, "text/html", codice_pagina(LED));
}
void loop()
{
//server.handleClient(); // gestione delle richieste HTTP
switch(connesso){
case 0:
Serial.println("\nAP mode in fase di avvio....");
WiFi.mode(WIFI_AP); // configurazioendel wifi come AP
// inizializzazione del WIFI
WiFi.softAP(ssidAP, passwordAP);
WiFi.softAPConfig(local_ip, gateway , subnet);
delay(40000);
connesso=2;
break;
case 1:
// inizializzazione del server
server.close();
server.begin();
server.on("/", home); // pagina iniziale
server.on("/LEDurl", LED_funzione); // mappiamo l'URLs delle funzioni
Serial.println("pagina Web creata!");
connesso=5;
break;
case 2:
//pagina html credenziali
Serial.println("\nPuoi inserire dati nella pagina Web dedicata 192.168.2.1");
server.close();
server.begin();
server.on("/", handleRoot);
connesso=3;
timeoutCurrent=millis();
break;
case 3:
server.handleClient();// gestione delle richieste HTTP
if (millis()- timeoutCurrent>= 30000) //test whether the period has elapsed
{
timeoutCurrent=millis();
connesso= 4; //IMPORTANT to save the start time of the current LED state.
}
break;
case 4:
if (ssid.length() && password.length()) {
WiFi.begin(ssid.c_str(), password.c_str());
uint32_t timeout = millis();
Serial.println("Connessione alla rete WiFi in corso");
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
if (millis() - timeout > 10000) {
Serial.println("\nImpossibile connettersi alla rete Wifi. Controlla i dati inseriti nella form, ricarica la pagina");
connesso=3;
return;
}
}
Serial.print("\nIndirizzo IP: ");
Serial.println(WiFi.localIP());
connesso=1;
break;
}
else {
Serial.println("Impossibile connettersi alla rete Wifi. I dati inseriti nella form sono incompleti");
connesso=0;
break;
}
break;
case 5:
server.handleClient();
break;
}
}
Allego codice HTML pagina di Configurazione Rete:
const char MAIN_page[] PROGMEM = R"=====(
<!DOCTYPE html>
<html>
<head>
<title>Configurazione Rete</title>
</head>
<body>
<h2>Configurazione Rete</h2>
<form>
<label for="ssid">SSID:</label>
<input type="text" id="ssid" name="ssid" required><br><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required><br><br>
<label for="ip">Indirizzo IP:</label>
<input type="text" id="ip" name="ip" required><br><br>
<input type="submit" value="Salva">
</form>
</body>
</html>
)=====";
Allego codice HTML accensione LED:
String codice_pagina(int LED)
{
String page = "<!DOCTYPE html><html><head>";
page +="<title>Rete WLAN</title>";
page +="<style>";
page +="body {margin-top:50px; font-family:Arial;";
page +="font-size:20px; text-align:center}";
page +=".btn {display:block; width:220px;";
page += "margin:auto; padding:30px}";
page +=".btn {font-size:30px; color:black;";
page += "text-decoration:none}";
page +=".on {background-color:#4CAF50}";
page +=".off {background-color:#008CBA}";
page +="td {font-size:30px; margin-top:50px;";
page += "margin-bottom:5px}";
page +="p {font-size:30px; margin-top:50px;";
page += "margin-bottom:5px}";
page +="</style></head>";
page +="<body>";
page +="<h1>Rete locale con ESP32</h1>";
page +="<table style='width:100%'><tr>";
if(LED>0)
{
page +="<td>Il LED e' acceso ";
page +="<a href='/LEDurl' class='btn on'>";
page +="Premi per segnere il LED </a></td>";
}
else
{
page +="<td>Il LED e' spento ";
page +="<a href='/LEDurl' class='btn off'>";
page +="Premi per accendere il LED </a></td>";
}
page +="</body></html>";
return page;
}