ESP8266 Web Server

Questo articolo è superato

Si consiglia di utilizzare l’Arduino-IDE per ESP

 

Io e Carlo abbiamo sviluppato un primo esempio per Arduino Uno (ARD1) di Web Server utilizzando i moduli Wifi ESP8266 (ESP).

La connessione tra ARD1 e ESP avviene tramite SoftwareSerial a 9600baud.
Il codice è disponibile su Gist

/*ESP8266_arduino_Gio_08.ino
*
* ====== ESP8266 Demo ======
* Print out analog values
* ==========================
*
* Change SSID and PASS to match your WiFi settings.
* The IP address is displayed to soft serial upon successful connection.
*
/*ESP8266_arduino_Gio_02.ino
*
* ====== ESP8266 Demo ======
* Print out time from start
* ==========================
*
* Change SSID and PASS to match your WiFi settings.
* The IP address is displayed to soft serial upon successful connection.
*
* Ray Wang @ Rayshobby LLC
* http://rayshobby.net/?p=9734
* Modificato da Carlo e Giorgio
* Versione per Arduino Uno con SoftSerial
*/
#include <SoftwareSerial.h>
SoftwareSerial ESP(9,10); // RX,TX collegati a ESP8266
enum {WIFI_ERROR_NONE=0, WIFI_ERROR_AT, WIFI_ERROR_RST, WIFI_ERROR_SSIDPWD, WIFI_ERROR_SERVER, WIFI_ERROR_UNKNOWN};
#define BUFFER_SIZE 128
#define SSID "xxx_Network" // change this to match your WiFi SSID
#define PASS "xxxxxx" // change this to match your WiFi password
#define PORT "8080" // using port 8080 by default
char buffer[BUFFER_SIZE];
unsigned long time;
int led = 13; // Led Webserver ON
//----------------------------
void setup() {
digitalWrite(led, LOW);
ESP.begin(9600);
ESP.setTimeout(15000);
Serial.begin(9600);
Serial.println("ESP8266_arduino_Gio_02.ino");
Serial.println("begin...");
pinMode(led, OUTPUT);
while(1){
byte err = setupWiFi();
if(err){
// error, print error code
Serial.print("setup error:");
Serial.println((int)err);
}else{
// success, print IP
Serial.print("ip addr:");
char *ip = getIP();
if (ip) {
Serial.println(ip);
digitalWrite(led, HIGH);
break;
}
else {
Serial.println("none");
}
maxTimeout();
}
}
}
//------------------------------
bool maxTimeout(){
// send AT command
ESP.println("AT+CIPSTO=0");
if(ESP.find("OK")){
return true;
}else{
return false;
}
}
//-----------------------------
char* getIP(){
// send AT command
ESP.println("AT+CIFSR");
// the response from the module is:
// AT+CIFSR\n\n
// 192.168.x.x\n
// so read util \n three times
ESP.readBytesUntil('\n', buffer, BUFFER_SIZE);
ESP.readBytesUntil('\n', buffer, BUFFER_SIZE);
ESP.readBytesUntil('\n', buffer, BUFFER_SIZE);
buffer[strlen(buffer)-1]=0;
return buffer;
}
//----------------------------
void loop() {
int ch_id, packet_len;
char *pb;
ESP.readBytesUntil('\n', buffer, BUFFER_SIZE);
if(strncmp(buffer, "+IPD,", 5)==0) { //Compara.
// request: +IPD,ch,len:data
sscanf(buffer+5, "%d,%d", &ch_id, &packet_len);
if(packet_len > 0){
// read serial until packet_len character received
// start from :
pb = buffer+5;
while(*pb!=':') pb++;
pb++;
if (strncmp(pb, "GET /", 5) == 0) {
serve_homepage(ch_id);
}
}
}
delay(1000);
}
//----------------------------
void serve_homepage(int ch_id) {
//String header = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n";
String header = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\nRefresh: 20\r\n";
String content="Hello ESP!!!: Sono attivo da: ";
time = millis()/1000;
content += time;
content += "secondi!!!";
/*
// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 2; analogChannel++) {
int sensorReading = analogRead(analogChannel);
content += "analog input ";
content += analogChannel;
content += " is ";
content += sensorReading;
content += "<br />\n";
} */
header += "Content-Length:";
header += (int)(content.length());
header += "\r\n\r\n";
ESP.print("AT+CIPSEND=");
ESP.print(ch_id);
ESP.print(",");
ESP.println(header.length()+content.length());
if (ESP.find(">")) {
ESP.print(header);
ESP.print(content);
delay(20);
}
/*Serial.print("AT+CIPCLOSE=");
Serial.println(ch_id);*/
}
//-------------------------------
byte setupWiFi() {
ESP.println("AT");
delay(500);
if(!ESP.find("OK")) {
delay(300);
return WIFI_ERROR_AT;
}
//delay(1500);
// reset WiFi module
ESP.println("AT+RST");
delay(500);
if(!ESP.find("ready")) {
delay(300);
return WIFI_ERROR_RST;
}
delay(500);
// set mode 3
ESP.print("AT+CWJAP=\"");
ESP.print(SSID);
ESP.print("\",\"");
ESP.print(PASS);
ESP.println("\"");
delay(2000);
if(!ESP.find("OK")) {
delay(300);
return WIFI_ERROR_SSIDPWD;
}
delay(500);
// start server
ESP.println("AT+CIPMUX=1");
delay(500);
if(!ESP.find("OK")){
delay(200);
return WIFI_ERROR_SERVER;
}
delay(500);
ESP.print("AT+CIPSERVER=1,"); // turn on TCP service
delay(500);
ESP.println(PORT);
delay(500);
if(!ESP.find("OK")){
delay(200);
return WIFI_ERROR_SERVER;
}
return WIFI_ERROR_NONE;
}
Ho utilizzato gli ESP8266 con il firmware > 0.9.2 che comunicano a 9600 baud .
Ho connesso ESP8266 attraverso un Level Converter Bidirezionale ad Arduino per avere le tensioni a 3.3 V.
Alimento ESP8266 con un alimentatore esterno a 3.3V.
ESP8266 comunica attraverso la SoftwareSerial sui pin 9 (Rx Arduino) e 10 (Tx Arduino) di Arduino.
Per il debug posso quindi usare la comunicazione USB di Arduino, come caricare gli sketch senza problemi, come di norma faccio con i moduli BT.L’esempio di codice allegato crea un web server (WS) con una pagina dinamica che ogni 20 secondi si connette al WS e riceve i secondi dall’accensione del WS.Commentato c’è anche il codice per visualizzare 2 segnali analogici.Questo codice è frutto dell’elaborazione dell’esempio di http://rayshobby.net/?p=9734
Consiglio di visitare il sito di Ray per maggiori dettagli. Ray ha inoltre sviluppato un nuovo sketch che dovrebbe gestire meglio gli ESP. La mia versione non è stata ancora aggiornata.
ATTENZIONE:
L’esempio di Ray è stato sviluppato per Arduino Mega che dispone di due seriali Hardware.
Per un esempio più complesso consiglio invece di consultare il Blog di Peter
E’ sempre in costante aggiornamento:
Peter usa un Arduino Mega per avere due seriali Hardware

11 pensieri su “ESP8266 Web Server

  1. Ciao e complimenti per il tutorial,
    sto provando il tuo codice, utilizzando anche io un Arduino Uno, un level converter ed il modulo esp8266, però non riesco a farlo funzionare, mi riporta sempre error:2 e poi error:1, sul modulo esp mi si accende anche il led blu quando tenta di comunicare, ma evidentemente poi non va a buon fine, da cosa pensi possa dipendere?
    Grazie

    P.S.: Provando invece il nuovo sketch di Ray non mi riconosce la Serial1 già in fase di compilazione… mah

    "Mi piace"

    Rispondi
    • Lo sketch di Ray utilizza un Arduino Mega quindi ha a disposizione la Serial1 Hardware.
      Per usare Arduino Uno dovresti usare la Software Serial per il debug utilizzando un convertitore USB/TTL esterno tipo i CP2102 e i pin D0 e D1 di Arduino per la seriale Hardware. Questo complica le cose perchè devi scollegare l’ESP quando carichi lo sketch.

      Gli errori hanno questa codifica:
      WIFI_ERROR_AT => 1
      WIFI_ERROR_RST => 2

      Secondo me ESP non comunica con Arduino.

      Ti consiglio di fare prima delle prove usando https://gist.github.com/roboticboyer/c123b8d7035f6c9bc568#file-esp_echo-ino

      Dal terminale Arduino (settato a 9600 bit/sec e con CR e LF come terminatori) dai i comandi:
      AT
      AT+RST
      e vedi se ti risponde.
      O c’è un collegamento errato o il tuo ESP non comunica a 9600 bit/s ( vecchie versioni funzionavano a 115200 come esempio di Ray)

      Per ulteriori aiuti scrivi anche sul Forum Arduino – ESP8266

      Tra tutti ti possiamo aiutare di più.

      "Mi piace"

      Rispondi
      • Grazie per la velocissima risposta 🙂
        Ho fatto una prova veloce impostando il baudrate 115200, ma così facendo non mi si accende neanche il led blu, quando tenta di comunicare e mi riporta sempre error 1, quindi credo che per il mio esp sia corretto a 9600.
        Una cosa che avevo dimenticato di scrivere è che dal pc ho notato che l’esp crea anche una sua rete wireless (ESP_9E3878), è normale? Creandone una sua come fa ad accedere poi anche a quella che gli ho impostato nello sketch?
        Ora faccio le prove che mi hai suggerito con i comandi AT.
        Grazie ancora

        "Mi piace"

      • ESP può funzionare sia come Access Point (AP) che come scheda di rete wifi standard (STA) le due funzionalità possono essere attive simultaneamente.

        La rete wifi ESP_9E3878 è quella dell’AP (192.168.4.1).

        AT+CWMODE? =>ti dice in che configurazione sei
        AT+CWMODE=1 => STA
        AT+CWMODE=2 => AP
        AT+CWMODE=3 => STA + AP

        Qui trovi l’elenco completo dei comandi AT
        http://woodsgood.ca/projects/wp-content/uploads/ESP8266ATCommandsSet.pdf

        Per esperienza vissuta, prima di fare gli sketch complessi per l’ESP verifica se funziona inviandogli solo i comandi AT a mano.

        Io per esempio ho collegato l’ESP direttamente al convertitore USB/TTL CP2102 (Tx e Rx sono a 3.3V) o un FTDI ( non so i voltaggi Tx e Rx) è fatto tutte le prove. Solo dopo mi sono cimentato con Arduino.

        "Mi piace"

  2. Complimenti, ottimo, avete fatto un ottimo lavoro. Provato e funziona. Ora vorrei aggiungere un’altra pagina web però non riesco. Mi spiegato cosa fa esattamente questo pezzo di codice?

    if(strncmp(buffer, “+IPD,”, 5)==0) { //Compara.
    // request: +IPD,ch,len:data
    sscanf(buffer+5, “%d,%d”, &ch_id, &packet_len);
    if(packet_len > 0){
    // read serial until packet_len character received
    // start from :
    pb = buffer+5;
    while(*pb!=’:’) pb++;
    pb++;
    if (strncmp(pb, “GET /”, 5) == 0) {
    serve_homepage(ch_id);
    }
    }
    }

    GRAZIE

    "Mi piace"

    Rispondi
  3. ciao ragazzi sono 3 giorni che mi è arrivato l’ESP8266 ma non riesco a comunicare con questo dispositivo non ricevo nessuna risposta quando scrivo nel serial monitor o roba del genere, AIUTATEMI conttatemi anche in privato

    "Mi piace"

    Rispondi
  4. ho collegato il mio modulo direttamente ad arduino uno ho utilizzato questo codice sostituendo il baudrate a 115200 perchè a 9600 non andava.
    :
    #include
    SoftwareSerial esp8266(9, 10); // RX, TX

    void setup()
    {
    // Open serial communications and wait for port to open:
    Serial.begin(9600);
    esp8266.begin(9600);
    }

    void loop() // run over and over
    {
    while (esp8266.available()>0 )
    Serial.write(esp8266.read());

    while (Serial.available()>0 ){
    esp8266.write(Serial.read());
    delay(100);
    }
    }

    con i comandi AT il modulo risponde, ma molti dei i caratteri che appaiono sono diversi.

    come mai? sembra che non comunica alla perfezione, da cosa puo dipendere?

    "Mi piace"

    Rispondi
  5. ho collegato il mio modulo direttamente ad arduino uno ho utilizzato questo codice sostituendo il baudrate a 115200 perchè a 9600 non andava.a
    :
    #include
    SoftwareSerial esp8266(9, 10); // RX, TX

    void setup()
    {
    // Open serial communications and wait for port to open:
    Serial.begin(9600);
    esp8266.begin(9600);
    }

    void loop() // run over and over
    {
    while (esp8266.available()>0 )
    Serial.write(esp8266.read());

    while (Serial.available()>0 ){
    esp8266.write(Serial.read());
    delay(100);
    }
    }

    con i comandi AT il modulo risponde, ma molti dei i caratteri che appaiono sono diversi.

    come mai? sembra che non comunica alla perfezione, da cosa puo dipendere?

    "Mi piace"

    Rispondi
  6. ciao ho visto il tutorial ed è fatto veramente bene volevo chiederti se c’è la possibilità di far dialogare un modulo di sviluppo LoLin NodeMcu v3 con una scheda a 8 relè e di far accendere e spegnere i relè tramite la rete e anche di fornirmi la temperatura e umidità tramite un sensore DHT che ogni tipo 30 minuti mi manda i dati di cronologia di accensione e spegnimento dei relè e della temperatura e umidità da un server cloud dove accedo e vedo la cronologia?
    se hai qualche idea su come farlo te ne sarei grato che volevo capire se una cosa del genere si possa fare o no tramite il modulo che possiedo io purtroppo non sono un grande esperto di programmazione ma solitamente facevo dei piccoli progettini con arduino
    ti lascio la mia email

    grazie in anticipo e complimenti per i tutorial sono ben fatti

    "Mi piace"

    Rispondi

Lascia un commento