Imatge | Descripció |
---|---|
Arduino Uno o compatible amb S4A i amb el firmware per S4A carregat. | |
Una protoboard | |
Cables de connexió | |
Un mòdul KY-015 o sensor DHT11 |
El DHT11 és un sensor digital de temperatura i humitat relativa de baix cost i fàcil ús. Integra un sensor capacitiu d’humitat i un termistor per a mesurar l’aire circumdant, i mostra les dades mitjançant un senyal digital en el pin de dades (no posseeix eixida analògica). Utilitzat en aplicacions acadèmiques relacionades al control automàtic de temperatura, aire condicionat, monitoratge ambiental en agricultura i més.
Utilitzar el sensor DHT11 amb les plataformes Arduino/Raspberry Pi/Nodemcu és molt senzill tant a nivell de programari com maquinari. A nivell de programari es disposa de llibreries per a Arduino amb suport per al protocol “Single bus”. Quant al maquinari, només és necessari connectar el pin VCC d’alimentació a 3-5V, el pin GND a Terra (0V) i el pin de dades a un pin digital en el nostre Arduino. Si es desitja connectar diversos sensors DHT11 a un mateix Arduino, cada sensor ha de tindre el seu propi pin de dades. El protocol de comunicació entre el sensor i el microcontrolador empra un únic fil o cable, la distància màxima recomanable de longitud de cable és de 20m., de preferència utilitzar cable amb malla.
Potser l’únic desavantatge del sensor és que només es pot obtindre noves dades cada 2 segons.
DHT11 | |
---|---|
Alimentació | de 3,5 V a 5 V |
Consum | 2,5 mA |
Senyal d’eixida | Digital |
Temperatura | |
---|---|
Rang | de 0ºC a 50ºC |
Precisió | A 25ºC ± 2ºC |
Resolució | 1ºC (8-bit) |
Humitat relativa | |
---|---|
Rang | de 20% HR a 90% HR |
Precisió | Entre 0ºC y 50ºC ± 5% HR |
Resolució | 1% HR |
Podeu veure la fulla de característiques aquí DHT11-DataSheet (en)
Com tenim dues versions del sensor de temperatura i humitat DHT11, veurem com hauríem de connectar-lo a Arduino en els dos casos. Recorda que treballarem amb un pin digital. En els dos casos , l’alimentació pot ser de 3,5 V o 5 V.
Consideracions prèvies:
Per a connectar el circuit d’una aplicació típica amb un DHT11, necessitarem tindre una resistència pull-up connectada a l’eixida digital. La recomanació és utilitzar una resistència de 5 kΩ. Disposem de 4 pins:
L’esquema elèctric i de muntatge del DHT11 seria el següent:
Al contrari que l’altre model, el DHT11 integrat dins d’un PCB (Printed Circuit Board) ja ve amb la resistència pull-up integrada. Pot resultar molt útil a vegades, però si afegim un cable de més de 20 metres, haurem de tindre en compte aquest factor.
Aquest model de DHT11 disposa de 3 pins, la presa de terra GND, per a les dades DATA i per a l’alimentació VCC (de 3,5V o 5V).
En la següent imatge pots veure l’esquema de connexió amb Arduino.
Tant el sensor DHT11 com el mòdul KY-015 utilitzen el seu propi protocol de comunicació bidireccional mitjançant un únic conductor, emprant senyals temporitzades.
Per a simplificar el procés de lectura de dades tenim a disposició llibreries preparades. Hi ha diverses llibreries que podem utilitzar per a obtindre la informació de temperatura i humitat. En aquest cas utilitzarem la que ens proporciona Adafruit. Aquesta llibreria és molt senzilla d’utilitzar i funciona per als dos models, DHT11 amb PCB i sense PCB.
Amb aquesta llibreria obtindrem tres valors:
#include <DHT.h> // Incluim la llibreria
#define DHTPIN 2 // Definir el pin digital _on_ es connecta el sensor
#define DHTTYPE DHT11 // Definir el tipus de sensor
DHT dht(DHTPIN, DHTTYPE); // _Declarar_ l'objecte DHT amb el nom dht
La primera línia inclou la llibreria DHT.h al nostre programa per que puguem fer ús d’ella.
Després venen dues definicions d’objectes, DHTPIN indica quin pin digital fem servir per comunicar-nos amb el sensor i DHTTYPE indica el tipus de sensor.
Amb aquestes definicions, configurem la instància DHT amb el nom dht i li passem els valors necessaris. Podem dir que la llibreria està en funcionament i li demanarem les dades quan ens interesse.
void setup()
{
Serial.begin(9600); // Inicialitzar comunicació serie
dht.begin(); // Inicialitzar l'objecte DHT
}
En aquesta secció preparem el port sèrie i els sensor per a la comunicació.
void loop()
{
delay(5000); // Esperem 5 segons entre mesures
float h = dht.readHumidity(); // Llegir la humitat relatiava
float t = dht.readTemperature(); // Llegir la temperatura en graus centigrados
float f = dht.readTemperature(true); // Llegir la temperatura en graus Farenheit
...
Dins de la funció loop() que es repetirà contínuament incloem primerament un retard de 5000 ms per donar temps al sensor a replegar la informació a transmetre.
Les següents ordres tenen dues parts. La primera part és una declaració de variable float per replegar la dada requerida (float «nom_variable») i la segon part fa ús de l’ordre reservada per demanar al sensor la informació pertinent.
if (isnan(h) || isnan(t) || isnan(f)) // Comprovar si hi ha error en la lectura
{
Serial.println("Error obtenint les dades del sensor DHT11");
return;
}
...
Comprovació d’errors, la funció «isnan(variable)» en retorna el valor TRUE si la variable no és un número (Is Not A Number).
float hif = dht.computeHeatIndex(f, h); // Calcular l'index de calor en Fahreheit
float hic = dht.computeHeatIndex(t, h, false); // Calcular l'index de calor en graus centígrados
...
Un altra vegada declarem variables float i demanem al sensor que ens retorne la informació «index de calor» amb la crida reservada per a l’objecte dht.
Per finalitzar enviem la informació capturada al monitor serie per mig de la comunicació serie.
Serial.print("Humitat: ");
Serial.print(h);
Serial.print(" %t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F");
Serial.print("Index de calor: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
}
Teniu el codi complet aquí
#include <DHT.h> // Incluim la llibreria
#define DHTPIN 2 // Definir el pin digital on es connecta el sensor
#define DHTTYPE DHT11 // Definir el tipus de sensor
DHT dht(DHTPIN, DHTTYPE); // Inicialitzar l'objecte DHT amb el nom dht
void setup()
{
Serial.begin(9600); // Inicialitzar comunicació serie
dht.begin(); // Inicialitzar el sensor DHT
}
void loop()
{
delay(5000); // Esperem 5 segons entre mesures
float h = dht.readHumidity(); // Llegir la humitat relatiava
float t = dht.readTemperature(); // Llegir la temperatura en graus centigrados (per defecte)
float f = dht.readTemperature(true); // Llegir la temperatura en graus Farenheit
if (isnan(h) || isnan(t) || isnan(f)) // Comprovar si hi ha error en la lectura
{
Serial.println("Error obtenint les dades del sensor DHT11");
return;
}
float hif = dht.computeHeatIndex(f, h); // Calcular l'index de calor en Fahreheit
float hic = dht.computeHeatIndex(t, h, false); // Calcular l'index de calor en graus centígrados
Serial.print("Humitat: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Index de calor: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
}