arduino-tutorial

10 - Sensor de temperatura i humitat DHT11

Finalitat

Material

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

Descripció

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.

Característiques bàsiques

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)

Muntatge

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:

DHT11 sense pcb

sensor-dht11

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:

esquema-muntatge esquema-electric

DHT11 amb pcb (KY-015)

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.

esquema-muntatge-ky015 esquema-electric-ky015

Programació

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:

Anàlisi del codi

Declaracions prèvies


#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.

Funció setup()


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ó.

Funció loop()


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");

}

Codi complet

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");

}

Conceptes importants

Veure també