Connessione da remoto con il microcontrollore ESP32 con il servizio NO-IP
Nel precedente articolo abbiamo implementato un sistema AP (Access Point) su una WLAN con un ESP32, non connesso ad Internet e quindi l’invio dei comandi HTTP al nostro sistema è limitato ad una distanza dell’ordine di qualche metro, al massimo si può coprire una superficie di un appartamento standard.
Credo che sia molto interessante e forse più utile connettere il nostro dispositivo ad Internet in questo modo possiamo gestire i comandi diretti al microcontrollore ESP32, cioè realizzare un server che può eseguire i nostri comandi da qualsiasi luogo della Terra, con un semplice cellulare connesso ad Internet.
Connetteremo il microcontrollore ESP32 a Internet tramite un modem domestico.
L’indirizzo IP del nostro modem sulla rete è associato all’accensione ed esso cambia dopo ogni nuova riaccensione.
Supponiamo che dovesse mancare l’energia elettrica nella nostra abitazione, per un breve intervallo di tempo, in questo caso alla riaccensione del modem esso avrà un nuovo indirizzo IP a noi sconosciuto e di conseguenza non sarà più possibile comandare il nostro sistema.
Per evitare, l’eventuale problema appena descritto, useremo il servizio NO-IP che associa l’IP della nostra connessione domestica ad un identificativo mnemonico da noi scelto.
Il servizio offerto da NO-IP è di tipo DDNS (Dynamic Domain Name System) pertanto, se l’indirizzo IP del modem dovesse cambiare, per esempio dopo la sua riaccensione, l’identificativo mnemonico verrà associato al nuovo IP, in modo totalmente automatico.
Il modem all’accensione comunica il proprio IP al sito NO-IP per poi associarlo all’indirizzo mnemonico che è stato scelto, e questa operazione si ripete ad ogni riaccensione del modem.
Quando sullo smartphone, digitiamo l’indirizzo mnemonico, esso si collega al sito NO-IP che trasferisce il comando al nostro server connesso alla rete domestica, pertanto, il nostro smartphone si connetterà alla rete domestica passando per i servers di NO-IP.
Creazione di un account su NO-IP
Ovviamente per attivare il servizio bisogna registrarsi al sito NO-IP, ci sono diversi paini disponibili di cui uno gratis, con delle limitazioni.
In questo tutorial, per il momento, useremo la versione gratuita.
Collegatevi al sito NO-IP e registrarsi al sito.
Eseguito il log in bisogna impostare ”hostname” e “Domain” che si desidera associare alla propria rete e poi salve le impostazioni.
A questo punto bisogna modificare alcuni parametri sul proprio modem, il menù delle impostazioni dipende dal modello, in questa descrizione sarò generico e indicherò solo le voci da modificare.
Trova la voce “DNS dinamico” e compila i campi con il nome utente definito nella configurazione dell’account, la password e il nome di dominio. Abilita l’opzione “Abilita DDNS” e fai clic su Salva.
Adesso ritorniamo nel nostro account di NO-IP, e clicca sul menù “Hostnames” e verifica che il tuo router e’ correttamente registrato, affianco al nome del dominio c’è l’indirizzo IP della tua rete.
L’ultimo passaggio consiste nel reindirizzare la porta del router al dispositivo di rete interno. Definiamo l’IP dell’ESP32: 192.168.1.200 (ho impostato questo IP nel codice ), quindi entreremo nella schermata “Inoltro” “Server virtuali” del router e faremo clic su “Aggiungi nuovo”.
Descrizione del Codice
In questo progetto riutilizzeremo il codice di un precedente post, riadattato.
Vi consiglio di leggerlo se non l’aveste già fatto link poiché descriverò solo le differenze in questo post.
#include <WiFi.h> #include <WiFiClient.h> #include <WebServer.h> #include "index.h" //Web page header file WebServer server(80); //Enter your WiFi SSID and PASSWORD const char* ssid = ".........."; const char* password = "........"; int Pin_LEDGiallo = 26; // definizione del pin int Pin_LEDRosso = 27; int LEDR = LOW; // default dello stato dei LED int LEDG = LOW; IPAddress local_IP(192, 168, 1, 200); // Set your Gateway IP address IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 0, 0); //=============================================================== // Setup //=============================================================== void setup(void){ Serial.begin(115200); Serial.println(); Serial.println("Booting Sketch..."); if (!WiFi.config(local_IP, gateway, subnet)) { Serial.println("STA Failed to configure"); } //Comment below code if you are using Access point only //ESP32 connects to your wifi ----------------------------------- WiFi.mode(WIFI_STA); //Connectto your wifi WiFi.begin(ssid, password); Serial.println("Connecting to "); Serial.print(ssid); //Wait for WiFi to connect while(WiFi.waitForConnectResult() != WL_CONNECTED){ Serial.print("."); delay(1000); } //If connection successful show IP address in serial monitor Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); //IP address assigned to your ESP //---------------------------------------------------------------- server.begin(); //Start server server.on("/", home); // pagina iniziale server.on("/LEDGurl", LEDG_funzione); // mappiamo l'URLs delle funzioni server.on("/LEDRurl", LEDR_funzione); // LEDG_funzione, LEDR_funzione pinMode(Pin_LEDGiallo, OUTPUT); // definiamo i pins dei LEDs come output pinMode(Pin_LEDRosso, OUTPUT); Serial.println("HTTP server started"); } void home() // funzione di default { // invio della pagina HTML server.send(200, "text.html", codice_pagina(LEDG, LEDR)); } void LEDG_funzione() // funzione del diodo LED verde, { LEDG = !LEDG; // invio della pagina HTML digitalWrite(Pin_LEDGiallo, LEDG); server.send(200, "text/html", codice_pagina(LEDG, LEDR)); } void LEDR_funzione() /// funzione del diodo LED rosso,, { LEDR = !LEDR; /// invio della pagina HTML digitalWrite(Pin_LEDRosso, LEDR); server.send(200, "text/html", codice_pagina(LEDG, LEDR)); } void loop(void){ server.handleClient(); delay(1); }
Il File index è riportato di seguito:
String codice_pagina(int LEDG, int LEDR) { 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(LEDG>0) { page +="<td>Il LED Verde e' acceso "; page +="<a href='/LEDGurl' class='btn on'>"; page +="Premi per segnere il LED verde</a></td>"; } else { page +="<td>Il LED Verde e' spento "; page +="<a href='/LEDGurl' class='btn off'>"; page +="Premi per accendere il LED verde</a></td>"; } if(LEDR>0) { page +="<td>Il LED Rosso e' acceso"; page +="<a href='/LEDRurl' class='btn on' >"; page +="Premi per spegnere il LED rosso</a></td>"; } else { page +="<td>Il LED Rosso e' spento"; page +="<a href='/LEDRurl' class='btn off'>"; page +="Premi per accendere il LED rosso</a></td>"; } page +="</body></html>"; return page; }
In questa parte di codice imponiamo l’indirizzo IP che deve avere l’ESP32 affinché non si debba reimpostare l’IP sul router. Ho scelto un indirizzo di valore alto per evitare di trovarlo occupato, poiché il router associa gli indirizzi partendo dal numero 1
In questo caso abbiamo impostato il microcontrollore ESP32 come un server.
salve come faccio ad installare la libreria index.h
Ciao e buon anno, devi includere il file nella cartella del tuo progetto e in automatico il compilatore esegue il link.
Salve, dove posso trovare la libreria in questione (index.h)? grazie!
Ciao, Ho aggiunto il file “index.h” all’articolo. Lo puoi copiare e aggiungere al tuo progetto.