Internet de les coses amb ESP32 i ESP8266

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

Funcions de la llibreria ESP8266WiFi

La llibreria ESP8266WiFi té moltes funcions i possibilitats, aquí només comentarem les que fem servir en aquest web. Podeu trobar la descripció completa a la pàgina ESP8266WiFi library.

Paràmetres generals

Per crear un servidor Wi-Fi fem servir el constructor WiFiServer:

WiFiServer server(80);    // Creem un objecte de comunicació amb el port 80

Per posar en marxa el servidor fem servir la funció begin.

    server.begin();

La funció mode ens permet especificar el mode desitjat.

    WiFi.mode(WIFI_AP);    // El Wi-Fi funcionarà com a punt d'accés

La funció available ens indica si el servidor està preparat. En el cas següent, reiniciem si no és així:

    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
    }

Cal tenir en compte que l'ESP8266 tindrà, en principi, dues adreces MAC, una per quan funciona com a punt d'accés i una altra per quan funciona com a estació.

Configuració com a punt d'accés

La informació completa la podeu trobar a la pàgina Soft Access Point Class.

La funció softAP ens crea un punt d'accés amb l'identificador que indiquem. A més, podem posar-li una contrasenya (entre 8 i 63 caràcters), indicar el canal (1 a 13, 1 si no ho posem) i fer que sigui invisible per als que no saben que existeix. Finalment, podem indicar el màxim nombre de connexions.

const char idXarxa[] = "acces-ESP8266";    // Nom del punt d'accés 
const char contrasenya[] = "etseib00";    // Contrasenya de connexió 
    WiFi.softAP(idXarxa);    // Configura el punt d'accés (obert)
    WiFi.softAP(idXarxa, contrasenya);    // Protegit amb contrasenya
    WiFi.softAP(idXarxa, contrasenya, 2);    // En el canal 2
    WiFi.softAP(idXarxa, contrasenya, 1, 1);    // Invisible en el canal 1
    WiFi.softAP(idXarxa, contrasenya, 1, 0, 4);    // Visible amb quatre connexions com a màxim

Aquesta funció retorna true si s'ha establert el punt d'accés i false en cas que no. Podem, doncs, fer-la servir en un while que esperi fins que el punt d'accés estigui llest.

El punt d'accés es configurarà amb l'adreça 192.168.4.1 i donarà les adreces consecutives a aquesta als elements que s'hi connectin. La funció softAPConfig ens permet configurar unes adreces IP diferents així mom la màscara i la porta d'enllaç. Cal fer servir valors coherents en la configuració. Els paràmetres són del tipus IPAddress que també està definit a la llibreria.

IPAddress ip_PA(192, 168, 1, 1);
IPAddress porta(192, 168, 1, 1);   
IPAddress subxarxa(255, 255, 255, 0);
    WiFi.softAPConfig(ip_PA, porta, subxarxa);

La funció softAPmacAddress ens retorna l'adreça MAC corresponent al nostre sistema en mode punt accés i la funció softAPIP l'adreça IP que s'ha configurat.

    Serial.println(WiFi.softAPmacAddress()); 
    Serial.println(WiFi.softAPIP()); 

Si volem desconnectar el servei de punt d'accés podem fer servir la funció softAPdisconnect.

    WiFi.softAPdisconnect();

Configuració de la connexió com a estació

La informació completa la podeu trobar a la pàgina Station Class.

La funció begin ens permet connectar a un punt d'accés existent si en sabem l'identificador i la contrasenya.

const char idXarxa[] = "xarxa-wifi";    // Nom del punt d'accés 
const char contrasenya[] = "contrasenya-wifi";    // Contrasenya de connexió 
    WiFi.begin(idXarxa, contrasenya);    // Connexió a la xarxa Wi-Fi existent

La funció status ens indica l'estat de la connexió. Les respostes possibles són:

Resposta Significat
WL_CONNECTED Connexió correcta al punt d'accés
WL_NO_SSID_AVAIL No s'ha trobat el punt d'accés desitjat
WL_CONNECT_FAILED S'ha trobat el punt d'accés però no s'ha pogut connectar
Correspon normalment a una contrasenya incorrecta
WL_IDLE_STATUS En aquest moment hi ha un canvi d'estat del Wi-Fi
Convé esperar una mica i tornar-ho a mirar
WL_DISCONNECTED Està desconnectat
Típicament quan el dispositiu no està en mode estació

    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
    }

La funció SSID ens retorna l'identificador de la xarxa i la funció psk la contrasenya. En principi, aquests valors ja els sabem. La funció macAddress ens retorna l'adreça MAC del dispositiu en mode estació i la funció localIP la seva adreça IP. Aquesta adreça és important perquè és la que hem de posar al navegador quan ens connectem. Tenim funcions per connèixer altres paràmetres de la connexió que ha facilitat el punt d'accés, com la màscara de subxarxa (subnetMask), el nom del dispositiu a la xarxa (hostname), la porta d'enllaç (gatewayIP), els servidors de DNS (dnsIP), l'adreça MAC del punt d'accés (BSSIDstr) o la intensitat del senyal Wi-Fi (RSSI).

    Serial.println(WiFi.SSID());
    Serial.println(WiFi.psk()); 
    Serial.println(WiFi.macAddress()); 
    Serial.println(WiFi.localIP()); 
    Serial.println(WiFi.subnetMask()); 
    Serial.println(WiFi.hostname()); 
    Serial.println(WiFi.gatewayIP()); 
    Serial.println(WiFi.dnsIP()); 
    Serial.println(WiFi.dnsIP(1)); 
    Serial.println(WiFi.BSSIDstr()); 
    Serial.println(WiFi.RSSI()); 

Client Wi-Fi

La informació completa la podeu trobar a la pàgina Client Class.

Per crear un receptor de clients fem servir el constructor WiFiClient:

WiFiClient client;

El nom de l'objecte és una variable que val true quan ja està disponible. Podem, doncs, fer-la servir en un while que esperi fins que el receptor estigui llest.

La funció available ens indica que hi ha algun client connectat. En el cas següent, esperem a que així sigui:

    while(!client.available()){
        delay(1);    // Esperem tenir client
    }

La funció flush envia les dades al client.

    client.flush();

També ens pot ser útil la funció softAPgetStationNum ens diu el nombre de clients que hi ha connectats en aquell moment.

    Serial.println(WiFi.softAPgetStationNum()); 

Tractament de la petició get

SI la petició get conté paràmetres o la petició d'una pàgina concreta (vegeu les comandes http) podem fer servir la funció readString per llegir-ho.

    String peticio = client.readString();

Si els paràmetres són fàcils d'avaluar, en tindrem prou amb la funció indexOf que ens torna la posició on comença el text que li hem passat com a paràmetre o -1 si no hi és. Per exemple:

    String peticio = client.readString();
    client.flush();
    if (peticio.indexOf("LED=1") != -1) {
        estat = HIGH;
    } 

Enviament d'una pàgina html al client

Per enviar una pàgina html al client fem servir les funcions client.print i client.println tants cops com calgui.

    client.print("<h1>El LED està ");                 
    client.print("encès");  
    client.println("</h1>");

A l'inici de la transmissió (abans d'enviar la pàgina html) cal enviar les dades següents:

    client.println("HTTP/1.1 200 OK");
    client.println();    // Imprescindible línia en blanc
    client.println("<!DOCTYPE HTML>");
    client.println("<meta charset='UTF-8'>");

 

 

 

 

 

 

 

 

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.