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.

Figura 1

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.

Figura 2

In questo tutorial, per il momento, useremo la versione gratuita.

Collegatevi al sito NO-IP e registrarsi al sito.   

Figura 3

Eseguito il log in  bisogna impostare ”hostname” e “Domain” che si desidera associare alla propria rete e poi salve le impostazioni.

Figura 4

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.

Figura 5

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.

4 commenti

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Ti sei iscritto alla newsletter

There was an error while trying to send your request. Please try again.

Quattrodispositivi utilizzerà le informazioni fornite in questo modulo per restare in contatto con te e fornire aggiornamenti del sito