Los sensores DHT11 y DHT22 son sensores digitales de Temperatura y Humedad, fáciles de implementar con cualquier microcontrolador. Utiliza un sensor capacitivo de humedad y un termistor para medir el aire circundante y solo un pin para la lectura de los datos. Tal vez la desventaja de estos es la velocidad de las lecturas y el tiempo que hay que esperar para tomar nuevas lecturas (nueva lectura después de 2 segundos), pero esto no es tan importante puesto que la Temperatura y Humedad son variables que no cambian muy rápido en el tiempo.
Sensor DHT11
Este sensor trabaja con un rango de medición de temperatura de 0 a 50 °C con precisión de ±2.0 °C y un rango de humedad de 20% a 90% RH con precisión de 4% RH. Los ciclos de lectura debe ser como mínimo 1 o 2 segundos.
Sensor DHT22
El rango de medición de temperatura es de -40°C a 80 °C con precisión de ±0.5 °C y rango de humedad de 0 a 100% RH con precisión de 2% RH, el tiempo entre lecturas debe ser de 2 segundos.
Como se observa la diferencia entre estos sensores es solo el rango y precisión, otra diferencia es que el DHT11 puede soprtar ciclos mas rapidos de lectura.
Conexiones entre Arduino y el sensor DHT11 o DHT22
La conexión es igual para ambos sensores:
La resisitencia Pull-Up puede ser una valor entre 4.7K y 10K.
Si se desea trabajar con lógica de 3.3v solo hay que cambiar la alimentación a dicho voltaje al igual que la resistencia pull-up debe ir a 3.3V, en nuestro caso vamos a trabajar con el pin digital 2, pero pueden usar otro pin si lo desean.
Librería DHT para Arduino
Usaremos la librería de adafruit, la cual lo pueden descargar desde el siguiente link:
https://github.com/adafruit/DHT-sensor-library
Con esta librería podemos realizar fácilmente la lectura de ambos sensores y no preocuparnos por el protocolo de comunicación entre Arduino y los sensores.
Después de descargar e importar la librería podemos empezar a programar nuestro sketch
1. Lectura de humedad y temperatura con Arduino:
Realizar la lectura del sensor es simple, el siguiente ejemplo muestra como leer la humedad, temperatura en Celsius y en Fahrenheit:
#include "DHT.h" #define DHTPIN 2 // Pin donde está conectado el sensor //#define DHTTYPE DHT11 // Descomentar si se usa el DHT 11 #define DHTTYPE DHT22 // Sensor DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("Iniciando..."); dht.begin(); } void loop() { delay(2000); float h = dht.readHumidity(); //Leemos la Humedad float t = dht.readTemperature(); //Leemos la temperatura en grados Celsius float f = dht.readTemperature(true); //Leemos la temperatura en grados Fahrenheit //--------Enviamos las lecturas por el puerto serial------------- Serial.print("Humedad "); Serial.print(h); Serial.print(" %t"); Serial.print("Temperatura: "); Serial.print(t); Serial.print(" *C "); Serial.print(f); Serial.println(" *F"); }
Expliquemos el Sketch anterior:
Con las siguientes líneas definimos el pin al que está conectado el sensor, tipo de sensor y creamos la variable DHT:
#include "DHT.h" #define DHTPIN 2 // Pin donde está conectado el sensor //#define DHTTYPE DHT11 // Descomentar si se usa el DHT 11 #define DHTTYPE DHT22 // Sensor DHT22 DHT dht(DHTPIN, DHTTYPE);
Dependerá el tipo de sensor con el que están trabajando para definir el DHTTYPE, en nuestro caso es el DHT22, si usan el DHT11, deberán cambiar a #define DHTTYPE DHT11, también pueden cambiar el número del DHTPIN si desean conectar el sensor en otro pin.
Para inicializar el sensor usamos la siguiente función:
dht.begin();
Y para realizar las lecturas correspondientes se usan las siguientes funciones:
float h = dht.readHumidity(); //Humedad float t = dht.readTemperature(); //Temperatura en grados Celsius float f = dht.readTemperature(true); //Temperatura en grados Fahrenheit
Tener en cuenta que solo podemos tomar 1 lectura cada 2 segundos, es por eso que ponemos una pausa de 2 segundos antes de tomar las lecturas para asegurarnos que ya han transcurrido 2 segundos después de la lectura anterior.
EL resultado del ejemplo anterior lo podemos observar al abrir el monitor serial:
2. Incorporando el DHT11/DHT22 en procesos rápidos.
Un problema muy común es que al hora de incluir el ejemplo anterior a nuestro proyecto debido a la pausa de los 2 segundos, todo nuestro proyecto también se vuelve lento, incluso podría afectar algunas funcionalidad de nuestro proyecto. Esto porque cada bucle demoraría 2 segundos, tiempo demasiado grande para algunos procesos.
La solución es usar la función millis() de Arduino, el cual nos da el tiempo en milisegundos desde que empieza a ejecutarse el código.
A continuación se muestra como incorporar el sensor a nuestro proyecto sin necesidad de hacer la pausa de 2 segundos.
#include "DHT.h" #define DHTPIN 2 // Pin donde está conectado el sensor //#define DHTTYPE DHT11 // Descomentar si se usa el DHT 11 #define DHTTYPE DHT22 // Sensor DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("Iniciando..."); dht.begin(); pinMode(13, OUTPUT); } long tiempoUltimaLectura=0;; //Para guardar el tiempo de la última lectura void loop() { //---------Lectura del Sensor-------------------------- if(millis()-tiempoUltimaLectura>2000) { float h = dht.readHumidity(); //Leemos la Humedad float t = dht.readTemperature(); //Leemos la temperatura en grados Celsius float f = dht.readTemperature(true); //Leemos la temperatura en grados Fahrenheit //--------Enviamos las lecturas por el puerto serial------------- Serial.print("Humedad "); Serial.print(h); Serial.print(" %t"); Serial.print("Temperatura: "); Serial.print(t); Serial.print(" *C "); Serial.print(f); Serial.println(" *F"); tiempoUltimaLectura=millis(); //actualizamos el tiempo de la última lectura } //----Fin de la lectura--------------------------- //---------Resto del código del proyecto-------- //... //... //... digitalWrite(13, HIGH); delay(100); digitalWrite(13, LOW); delay(100); //------------------------------- }
De esta forma evitamos la pausa de los 2 segundos, pero no el tiempo que demora en hacer la lectura, que es de aproximadamente 250 milisegundos, el cual lo pueden notar si realizan el ejemplo anterior, en donde se hace parpadear el led interno de la placa (Pin 13) con pausas de 100ms, pero si observan el led, en el momento de hacer la lectura se nota claramente que el led se apaga por más tiempo durante la lectura del sensor.