Internet de les coses amb ESP32 i ESP8266

Exemples Referència Plaques   Recursos CITCEA
Projectes Programació Perifèrics   Inici

Controlem l'encesa d'un LED amb l'ESP8266 com a estació

En aquest cas el nostre microcontrolador es connectarà a una xarxa existent, com un dispositiu més. En qualsevol dispositiu connectat a la mateixa subxarxa podrem posar l'adreça IP del microcontrolador i veure la pàgina web que ens permet controlar el LED. En aquest programa considerem que el LED està connectat a la pota 15, tal com mostra la figura següent:

Connexió del LED

La pàgina que veurà l'usuari tindrà el següent contingut (vegeu les etiquetes del llenguatge html).

<!DOCTYPE HTML>
<meta charset='UTF-8'>
<html>
<h1>El LED està apagat</h1>
<p></p>
<button type='button' onClick=location.href='/?LED=1'>Encén</button>
<p></p>
<button type='button' onClick=location.href='/?LED=0'>Apaga</button>
</html>

Que ens donarà una pàgina similar a aquesta:

Pàgina web

El programa connecta el microcontrolador a un punt d'accés existent (del que hem de saber l'identificador i la contrasenya), escriu al monitor sèrie la seva adreça IP i es queda a l'espera que algun usuari s'hi connecti. Quan ho fa, li envia la pàgina html en la que l'estat del LED es personalitza segons com estigui en aquell moment. Quan es prem un botó es torna a carregar la pàgina afegint el paràmetre corresponent. A continuació hi ha les tres versions possibles de l'adreça: consulta, encendre i apagar (vegeu les comandes http). Atès que ara no sabem l'adreça IP fins que s'ha fet la connexió, hem posat lletres per representar els quatre nombres (aaa.bbb.ccc.ddd). Podeu consultar també les funcions de la biblioteca ESP8266WiFi que fem servir.

aaa.bbb.ccc.ddd/
aaa.bbb.ccc.ddd/?LED=0
aaa.bbb.ccc.ddd/?LED=1

El programa que fem servir per provar-ho és el següent:

// Exemple basat en un tutorial de Dani No www.esploradores.com
#include <ESP8266WiFi.h>    // Carreguem la biblioteca ESP8266WiFi
#define LED 15    // pota on hem connectat el LED
const char idXarxa[] = "xarxa-wifi";    // Nom del punt d'accés 
const char contrasenya[] = "contrasenya-wifi";    // Contrasenya de connexió 
bool estat = LOW;    // Variable que recorda l'estat del LED
WiFiServer server(80);    // Creem un objecte de comunicació amb el port 80
                          // El port 80 és el de defecte per a http
void setup() {    // Inicialització
    Serial.begin(9600);    // Monitor sèrie
    pinMode(LED, OUTPUT);    // La pota del LED és sortida
    digitalWrite(LED, LOW);    // Comencem amb el LED apagat
    WiFi.begin(idXarxa, contrasenya);    // Connexió a la xarxa Wi-Fi existent
    Serial.println("Connectant a la xarxa");
    while (WiFi.status() != WL_CONNECTED) {   // Mira si s'ha connectat cada 0,5 s 
        delay(500);
        Serial.print(".");    // Cada 0,5 s posa un puntet
    }
    Serial.print("Connectat a "); 
    Serial.println(WiFi.SSID());
    server.begin();    // Posem en marxa el servidor
    Serial.print("Estat de la connexió: ");
    Serial.println(WiFi.status()); 
    Serial.print("Contrasenya: ");
    Serial.println(WiFi.psk()); 
    Serial.print("Adreça MAC del dispositiu: ");
    Serial.println(WiFi.macAddress()); 
    Serial.print("Adreça IP del dispositiu: ");
    Serial.println(WiFi.localIP()); 
    Serial.print("Màscara de subxarxa: ");
    Serial.println(WiFi.subnetMask()); 
    Serial.print("Nom del dispositiu a la xarxa: ");
    Serial.println(WiFi.hostname()); 
    Serial.print("Porta d'enllaç: ");
    Serial.println(WiFi.gatewayIP()); 
    Serial.print("Servidors DNS: ");
    Serial.print(WiFi.dnsIP()); 
    Serial.print(" i ");
    Serial.println(WiFi.dnsIP(1)); 
    Serial.print("Adreça MAC del punt d'accés: ");
    Serial.println(WiFi.BSSIDstr()); 
    Serial.print("Intensitat del senyal: ");
    Serial.println(WiFi.RSSI()); 
    Serial.println(); 
    Serial.print("Ja pots fer la teva connexió al dispositiu ");
    Serial.println(WiFi.localIP()); 
}
void loop() {    // Programa que es repeteix indefinidament
    WiFiClient client = server.available();    // Obrim un client per al servidor
    if (!client) {    // Mirem si està disponible
        return;    // Si no ho està, torna a començar
    }
	// Connexió del client
    Serial.println("Nou client");
    while(!client.available()){
        delay(1);    // Esperem tenir client
    }
    String peticio = client.readString();
    Serial.print("Petició: ");
    Serial.println(peticio);    // Quina petició ha fet el client?
    client.flush();
    // Petició del client
    if (peticio.indexOf("LED=1") != -1) {    // Si no ho troba torna -1
        estat = HIGH;    // Si ho troba encendrem el LED
    } 
    if (peticio.indexOf("LED=0") != -1){
        estat = LOW;    // Si ho troba apagarem el LED
    }
    digitalWrite(LED, estat);    // Enviem el nou estat al LED
    // Resposta al client
    client.println("HTTP/1.1 200 OK");
    client.println();    // Imprescindible línia en blanc
    client.println("<!DOCTYPE HTML>");
    client.println("<meta charset='UTF-8'>");
    client.println("<html>");
        // En el títol l'estat del LED
    client.print("<h1>El LED està ");                 
    if(estat == HIGH) {
        client.print("encès");  
    } else {
        client.print("apagat");
    }
    client.println("</h1>");
	// Botons per canviar l'estat del LED           
    client.println("<p></p>");
    client.println("<button type='button' onClick=location.href='/?LED=1'>Encén</button>");
    client.println("<p></p>");
    client.println("<button type='button' onClick=location.href='/?LED=0'>Apaga</button>");
    client.println("</html>"); 
    delay(1);
    Serial.println("Fi de la petició");
}

Per provar-ho, cal editar el programa per posar-hi l'identificador de xarxa i la contrasenya per fer la connexió i enviar el programa al microcontrolador. Tingueu present que la xarxa eduroam que fem servir habitualment a la UPC no serveix, ja que té un sistema de connexió diferent. Un cop connectat el microcontrolador a la xarxa podrem veure la seva adreça IP consultant el monitor sèrie de l'entorn de programació. Llavors, podem agafar un dispositiu mòbil i connectar-nos a la mateixa xarxa Wi-Fi. Un cop connectats a la xarxa podem obrir un navegador i posar l'adreça IP del microcontrolador a la barra d'adreces. Llavors ens hauria de mostrar la pàgina que em vist més amunt i picant els botons podem encendre i apagar el LED.

El nostre programa de prova escriu unes quantes coses al monitor sèrie (instruccions Serial.print i Serial.println). Quan ja tinguem clar que el programa funciona, les podem eliminar quasi totes i probablement anirà una mica més ràpid.

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.