Internet de les coses amb ESP32 i ESP8266

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

Termòstat

Programa del grup 1

En aquest cas el microcontrolador funciona com a servidor en mode estació i es pot accedir a consultar la temperatura i la humitat des d'un navegador web o des d'una aplicació. El programa del microcontrolador és el següent:

#include <SPI.h>    // Carreguem la biblioteca SPI
#include <WiFiNINA.h>    // Carreguem la biblioteca WiFiNINA
#include "DHT.h"
#define DHTPIN 2
#define LED 6
#define DHTTYPE DHT22
const char idXarxa[] = "xarxa-wifi";    // Nom del punt d'accés 
const char contrasenya[] = "contrasenya-wifi";    // Contrasenya de connexió 
float hum, temp;
bool estat = LOW;    // Variable que recorda l'estat del LED
bool enviar = false;
String temperatura, humitat;
bool enviar1 = false ;
int status = WL_IDLE_STATUS;
DHT dht(DHTPIN, DHTTYPE);
WiFiServer server(80);    // Creem un objecte de comunicació amb el port 80
void setup() {    // Inicialització
    Serial.begin(9600);    // Monitor sèrie
    dht.begin();
    pinMode(LED, OUTPUT);    // La pota del LED és sortida
    digitalWrite(LED, LOW);
    if (WiFi.status() == WL_NO_MODULE) {
        Serial.println("No s'ha trobat el dispositiu Wi-Fi");
        while (true);    // Bloquegem el programa
    }
    String versio = WiFi.firmwareVersion();
    if (versio < "1.0.0") {
        Serial.println("Convindria actualitzar el firmware");
    }
    while (status != WL_CONNECTED) {
        Serial.print("Connectant a la xarxa ");
        Serial.println(idXarxa);
        status = WiFi.begin(idXarxa, contrasenya);
        delay(10000);    // Ho tornarem a intentar passats 10 s
    }
    server.begin();    // Posem en marxa el servidor
    Serial.print("Connectat a "); 
    Serial.println(WiFi.SSID());
    Serial.print("Estat de la connexió: ");
    Serial.println(WiFi.status()); 
    Serial.print("Adreça IP del dispositiu: ");
    Serial.println(WiFi.localIP()); 
    Serial.print("Intensitat del senyal: ");
    Serial.print(WiFi.RSSI()); 
    Serial.println(" dBm");
    Serial.println(); 
    Serial.print("Ja pots fer la teva connexió al dispositiu ");
    Serial.println(WiFi.localIP()); 
}
void loop() {    // Programa que es repeteix indefinidament
    if (status != WiFi.status()) {    // Mirem si ha canviat l'estat de la connexió
        status = WiFi.status();
        if (status == WL_AP_CONNECTED) {
            Serial.println("Dispositiu connectat al punt d'accés");
        } else {
            Serial.println("El dispositiu s'ha desconnectat del punt d'accés");
        }
    }
    WiFiClient client = server.available();    // Mirem si hi ha clients
    if (client) {                             // Si hi ha un client...
        Serial.println("Nou client");
        String peticio = "";                // Aquí guardarem una línia de la petició del client
        while (client.connected()) {            // Mentre el client estigui connectat
            if (client.available()) {             // Si hi ha dades disponibles
                char c = client.read();             // Llegim un byte
                Serial.write(c);
                if (c == '\n') {                    // Mirem si és un salt de línia
                    // Si hem rebut una línia buida vol dir que tenim dos salts de línia seguits
                    // vol dir que ha acabat la petició del client i enviem la resposta:
                    if (peticio.length() == 0) {
                        enviar = true;    // Llestos per enviar la resposta
                        break;    // Sortim del while
                    } else {      // Si hem rebut un salt de línia
                        // Ha acabat una línia de la petició, anem a veure si és la que ens interessa
                        // Rebrem un munt de línies però només hem d'analitzar la que comença per GET
                        if (peticio.indexOf("GET") != -1) {    // Si no ho troba torna -1
                            // Ens han demanat una lectura, anem-la a fer
                            hum = dht.readHumidity();
                            temp = dht.readTemperature();
                            if (peticio.indexOf("LED=1") != -1) {    // Si no ho troba torna -1
                                estat = HIGH;    // Si ho troba encendrem el LED
                                digitalWrite(LED, estat);    // Enviem el nou estat al LED
                            } 
                            if (peticio.indexOf("LED=0") != -1){
                                estat = LOW;    // Si ho troba apagarem el LED
                                digitalWrite(LED, estat);    // Enviem el nou estat al LED
                            }
                        }
                        peticio = "";    // Comencem línia amb una línia buida
                    }
                } else if (c != '\r') {    // Si el caràcter no és un retorn
                    peticio += c;      // Afegim el caràcter rebut
                }
            }
        }
        if (enviar) {
            // 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>");
            // Enllaços per canviar l'estat del LED           
            client.println("<p></p>");
            client.println("<p></p>");
            client.println("<a href='/?LED=1'>Encén</a>");
            client.println("<p></p>");
            client.println("<p></p>");
            client.println("<a href='/?LED=0'>Apaga</a>");
            client.println("</html>"); 
            delay(1);
            enviar = false;
            if (!(isnan(hum) || isnan(temp))) {    // Tenim valors correctes de temperatura i humitat?
                temperatura = String(temp);
                humitat = String(hum);
                temperatura.replace('.', ',');
                humitat.replace('.', ',');
                // 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>");
                client.println("<h1>Temperatura i humitat actuals</h1>");
                client.println("<p></p>");
                client.println("<p></p>");
                client.print("<p>T = ");
                client.print(temperatura);
                client.println(" C</p>");
                client.println("<p></p>");
                client.print("<p>H = ");
                client.print(humitat);
                client.println(" %</p>");
                client.println("</html>"); 
            }
            delay(1);
            enviar = false;
        }
        client.stop();    // Tanquem la connexió
        Serial.println("Fi de la connexió amb el client");
    }
}

Aquest grup va fer una aplicació amb App Inventor que permetia consultar els valors actuals de temperatura i humitat. La disposició d'elements a la pantalla és:

Pantalla

El programa és el següent:

Programa
Programa
Programa
Programa
Programa

 

 

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