Internet de les coses amb ESP32 i ESP8266

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

Llegim un sensor de temperatura i humitat

En aquest exemple llegirem un sensor de temperatura i humitat connectat a la pota 2 del microcontrolador. Les lectures del sensor es mostraran a la pàgina web que s'envia a l'usuari. En aquest cas l'usuari no ha d'enviar cap paràmetre.

El programa ens mostrarà, en principi, els valors en format anglès, és a dir fent servir un punt per separar els decimals. Podem, però fer un tractament (afegint les línies que hem marcat en groc) per posar la coma en lloc del punt.

Si en compilar aquest programa us surt un error relacionat amb la biblioteca Adafruit_Sensor.h us recomanem que instal·leu la darrera versió de l'entorn Arduino IDE. Probablement el problema desapareixerà.

// Aquest programa està parcialment basat en els exemples de la pàgina
// https://www.arduino.cc/en/Tutorial/LibraryExamples#wifi1010
#include <SPI.h>    // Carreguem la biblioteca SPI
#include <WiFiNINA.h>    // Carreguem la biblioteca WiFiNINA
#include "DHT.h"
#define DHTPIN 2
#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;
String temperatura, humitat;
bool enviar = false;
int status = WL_IDLE_STATUS;
DHT dht(DHTPIN, DHTTYPE);
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
    dht.begin();
    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();
                        }
                        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) {
            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");
    }
}

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.