Modulo wifi low cost ESP8266 e Arduino

Ciao a tutti!
oggi vi parlerò del modulo wifi ESP8266.

Questo modulo è davvero fantastico infatti ci permette di dotare i nostri progetti di una connessione wifi con un costo ridicolo!
Grazie a questo oggettino possiamo catapultarci nell' Internet of Things,
infatti con un prezzo che va dai 2 ai 5 euro potremo finalmente far twittare la nostra pianta quando ha sete (sto scherzando, ci sono applicazioni molto più utili ma adesso non mi vengono in mente ;) )

Il modulo in questione è questo:





Come vedete è anche molto piccolo, quindi è facilmente collocabile all'interno dei nostri progetti

Quello che faremo adesso è un semplice esempio per fare i primi passi con questo modulo,
in pratica sfrutteremo il modulo ESP8266 per creare una rete wifi e, dopo esserci connessi con un pc alla rete del modulo e aprendo la pagina html che creeremo, potremo inviare comandi all'Arduino premendo i pulsanti direttamente da un browser sul nostro pc.

Ecco il pinout del modulo:



Ecco lo schema di collegamento, il secondo Arduino è opzionale, serve solo per leggere le informazioni provenienti dal modulo ESP8266:



Questo schema presenta 2 criticità:
- la prima il collegamento dell'alimentazione 3.3v per il modulo ESP avviene in parallelo tra i 2 Arduino, in quanto uno solo non sarebbe sufficiente ad alimentare il modulo (il regolatore presente su Arduino eroga tipicamente 150 mA mentre il modulo ne richiede più di 200)
- il secondo problema è che anche la seriale del ESP8266 funziona a 3.3v quindi l'ideale sarebbe l'utilizzo di un level converter anzichè mettere semplicemente una resistenza.
Ecco un articolo dove ne parlo.

Se volete esistono dei moduli adattatori per l'ESP8266 che risolvono entrambi questi problemi:
questo è il link Ebay dove potete trovarli.
In quest'altro link eBay potete trovare i moduli ESP8266, noterete che il prezzo è veramente basso rispetto agli shield o alle schede ufficiali Arduino wifi.


Ed ecco lo sketch da caricare,
è un ottimo esempio che ho trovato su internet,
l'ho tradotto, testato ed ho fatto delle piccole modifiche per adattarlo al mio modulo in quanto alcuni ESP8266 (come il mio) hanno velocità di comunicazione (baud rate) diverse.


  1. #include <SoftwareSerial.h>
  2. #define DEBUG true
  3. SoftwareSerial mySerial(9,10); //creazione di una porta seriale software per il collegamento con l'atra Arduino (facoltativa, serve solo per il debugging)
  4. void setup()
  5. {
  6.   Serial.begin(115200); // inizializza la comunicazione con il modulo ESP8266 (cambiare la velocità se quella del tuo modulo è differente, di solito è 115200 o 57600 o 9600.
  7.   mySerial.begin(9600); // inizializza la comunicazione con l'atra Arduino (facoltativa, serve solo per il debugging)
  8.   pinMode(11,OUTPUT);
  9.   digitalWrite(11,LOW);
  10.   pinMode(12,OUTPUT);
  11.   digitalWrite(12,LOW);
  12.   pinMode(13,OUTPUT);
  13.   digitalWrite(13,LOW);
  14.   sendData("AT+RST\r\n",2000,DEBUG); // resetta modulo
  15.   sendData("AT+CWMODE=2\r\n",1000,DEBUG); // configura come access point
  16.   sendData("AT+CIFSR\r\n",1000,DEBUG); // ottieni un indirizzo ip
  17.   sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // configura per connessioni multiple
  18.   sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // avvia server sulla porta 80
  19. }
  20. void loop()
  21. {
  22.   if(Serial.available()) // controlla se il modulo sta comunicando
  23.   {
  24.     if(Serial.find("+IPD,")) //Cerca nella comunicazione seriale la stringa di testo "+IPD," questa è una stringa che viene inviata quando premi il bottone nella pagina html
  25.     {
  26.       delay(1000);
  27.       int connectionId = Serial.read()-48; //Ottieni il connection id, sottrai 48 perchè nella tabella ASCII lo zero è il 48.
  28.       Serial.find("pin="); // adesso cerca "pin="
  29.       int pinNumber = (Serial.read()-48)*10; //leggi il primo numero e moltiplicalo per 10, es per il pin 13 leggi 1 e moltiplicalo per 10
  30.       pinNumber += (Serial.read()-48); //leggi il secondo numero e sommalo al primo, es per il pin 13 leggi 3 e sommalo a quello che avevamo prima (10)
  31.       digitalWrite(pinNumber, !digitalRead(pinNumber)); //cambia di stato il pin 13 (impostando l'opposto di quello che c'è sul pin 13 stesso)
  32.       // componi il comando di chiusura da inviare al modulo
  33.       String closeCommand = "AT+CIPCLOSE=";
  34.       closeCommand+=connectionId; // attacca il connection id
  35.       closeCommand+="\r\n";
  36.       sendData(closeCommand,1000,DEBUG); // invia il comando di chiusura
  37.     }
  38.   }
  39. }
  40. /*
  41. Funzione usata per inviare i dati al modulo ESP8266
  42. Parametri: command - il dato/comando da inviare
  43.            timeout - il tempo massimo di attesa per una risposta
  44.            debug - attiva o disattiva l'invio di dati per il serial monitor (true = si, false = no)
  45. Returns:   la risposta dell' esp8266 (se c'è una risposta)
  46. */
  47. String sendData(String command, const int timeout, boolean debug)
  48. {
  49.   String response = "";
  50.   Serial.print(command); // invia il comando all' esp8266
  51.   long int time = millis();
  52.   while((time+timeout) > millis())
  53.   {
  54.     while(Serial.available())
  55.     {
  56.       char c = Serial.read(); // componi la risposta coi caratteri ricevuti dal modulo
  57.       response+=c;
  58.     }  
  59.   }
  60.   if(debug)
  61.   {
  62.     mySerial.print(response);
  63.   }
  64.   return response;
  65. }


Sketch da caricare nel secondo Arduino (opzionale, serve solo per il leggere le informazioni provenienti dal modulo per vedere che non ci siano errori)


  1. void setup ()
  2. {
  3.   Serial.begin(9600);
  4. }
  5. void loop ()
  6. {
  7.   if (Serial.available())
  8.     Serial.write(Serial.read());
  9. }


Questo invece è il codice Html per creare la pagina da dove controllare l'Arduino,
quello che dovete fare è:

- creare una nuova cartella
- creare all'interno della cartella un nuovo documento di testo
- copiare le righe di codice che vedete qui sotto nel documento e salvarlo
- rinominare il file e modificarne l'estensione in ".html" (ad esempio "myesp8266control.html")
- andare in questa pagina e cliccare col tasto destro, poi "salva con nome" e salvate il file nella cartella creata prima


  1. <html>
  2.         <head>
  3.                 <title>ESP8266 LED Control</title>
  4.         </head>
  5.         <body>
  6.        
  7.         <!-- in the <button> tags below the ID attribute is the value sent to the arduino -->
  8.        
  9.         <button id="11" class="led">Toggle Pin 11</button> <!-- button for pin 11 -->
  10.         <button id="12" class="led">Toggle Pin 12</button> <!-- button for pin 12 -->
  11.         <button id="13" class="led">Toggle Pin 13</button> <!-- button for pin 13 -->
  12.                
  13.         <script src="jquery.min.js"></script>
  14.         <script type="text/javascript">
  15.                 $(document).ready(function(){
  16.                         $(".led").click(function(){
  17.                                 var p = $(this).attr('id'); // get id value (i.e. pin13, pin12, or pin11)
  18.                                 // send HTTP GET request to the IP address with the parameter "pin" and value "p", then execute the function
  19.                                 $.get("http://192.168.4.1:80/", {pin:p}); // execute get request
  20.                         });
  21.                 });
  22.         </script>
  23.         </body>
  24. </html>

Adesso dovrete cercare il modulo tra le connessioni wifi disponibili, connettervi, e aprire la pagina html che avete creato, premendo il pulsante relativo al pin 13 il led presente sul vostro Arduino dovrà cambiare di stato, quindi si accenderà o spegnerà.

Questo articolo è solo una bozza, comunque l'ho testato personalmente e funziona, se avete dubbi o curiosità vi rimando all'articolo originale in inglese,
al cui creatore faccio nuovamente i miei complimenti!
Se invece cercate un modulo più semplice per fare cose simili a queste vi consiglio di leggere questo articolo!

Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!


9 commenti:

  1. Grazie mille per questi tutorial, sono veramente molto utili.
    Una domanda da neofita: non avrei potuto usare una SoftwareSerial per comunicare con l'ESP8266, lasciando così libera Serial per il log da USB?

    RispondiElimina
  2. Salve complimenti per la guida. una volta inviato il comando di avvio del server su arduino-esp8266 si legge tutto quello che viene trasmesso sulla porta 80 semplicemente tramite il comando Serial.read()?. il Codice Js sembra riferirsi al framework Jquery ma non vedo la libreria caricata nell'header della pagina html.

    RispondiElimina
    Risposte
    1. Si, direi che c'e' anche se, in effetti, e' in un posto non proprio bellissimo :)
      (tolgo il minore iniziale e il maggiore finale perche' non me li fa postare)
      script src="jquery.min.js"></script

      Elimina
  3. Ciao come faccio per fare una richiesta http con questo modulo tramite arduino ???7
    grazie

    RispondiElimina
    Risposte
    1. Ciao,
      se può interesarti c'è una shield su Ebay basata con questo hardware ed un firmware che ti permette di pilotare il tuo progetto arduino tramite smarphone Ios e Android è semplice da usare con le librerie a corredo

      Se ti può interessare basta che scrivi su Ebay:

      arduino 5 minuti

      e la trovi

      Elimina
  4. Se non ho il secondo arduino, e collego il modulo direttamente ai 3.3V che succede? Non arriva la corrente sufficiente anche se il voltaggio lo è, e crea problemi oppure può funzionare?

    RispondiElimina
  5. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  6. Buongiorno complimenti per la guida. Ho seguito passo passo le sue istruzioni in merito a come collegare esp8266, però in fase di caricamento del modulo. Mi da il seguente errore:
    warning: espcomm_sync failed
    error: espcomm_open failed
    error: espcomm_upload_mem failed
    error: espcomm_upload_mem failed
    Saprebbe indicarmi dove sbaglio?

    Gazie mille

    RispondiElimina
  7. Allora ho configurato le due schede ESP8266 e connesse alla wifi adesso devo far in modo di inviare i dati dal arduino trasmettitore nel locale caldaia e farli ricevere dall'arduino ricevitore al piano di sopra. Consigli su come fare?

    RispondiElimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post