En esta nueva entrada vamos a ver como hacer funcionar este sensor DHT11 que nos va a servir para medir tanto la humedad relativa como la temperatura. Lo malo de este sensor es que solo nos va a dar medidas enteras, es decir sin decimales, ya que la resolución que presenta es de 1% para la humedad relativa y de 1ºC para la temperatura. Pero compensa ya que presenta un valor muy económico para pequeños proyectos y que nos permite obtener medidas tanto para humedad como para temperatura.
Este sensor se caracteriza por tener la señal digital calibrada por lo que asegura una alta calidad y una fiabilidad a lo largo del tiempo, ya que contiene un microcontrolador de 8 bits integrado. Está constituido por dos sensores resistivos (NTC y humedad). Tiene una excelente calidad y una respuesta rápida en las medidas.Puede medir la humedad entre el rango 20% – aprox. 95% y la temperatura entre el rango 0ºC – 50ºC.
Cada sensor DHT11 está estrictamente calibrado en laboratorio, presentando una extrema precisión en la calibración. Los coeficientes de calibración se almacenan como programas en la memoria OTP, que son empleados por el proceso de detección de señal interna del sensor.
El protocolo de comunicación es a través de un único hilo (protocolo 1-wire), por lo tanto hace que la integración de este sensor en nuestros proyectos sea rápida y sencilla. Además presenta un tamaño reducido, un bajo consumo y la capacidad de transmitir la señal hasta 20 metros de distancia.
Os dejo las características de dicho sensor:
Aquí podéis descargar los archivos de esta entrada (un pdf explicativo, esquema fritzing, sketchs arduino): http://www.mediafire.com/?vvofjfvuu6fttf4
Os pongo el esquema para la conexión del sensor a Arduino (sensor solo sin módulo):
Yo he usado un módulo que adquirí a un precio muy económico y que me ahorra estar poniendo la resistencia de pull-up. Os pongo una imagen del módulo:
Ahora os pongo dos tipos de programa para arduino, uno que no emplea librería para la programación del sensor (programación a través de funciones) y otro que si emplea una librería hecha por ladyada y que va adjunta en los archivos indicados arriba.
Programa sin librería:
//Programa test para sensor DHT11 de humedad y temperatura //cleaned by sucotronic //Modificado por Regata para tallerarduino.wordpress.com #define DHTPIN 2 // Indicamos el pin del arduino donde conectamos el sensor byte bGlobalErr; //para pasar el codigo de error de vuelta de las funciones byte DHTDAT[5]; //Array para almacenar los bytes enviados por el sensor int maxh=0,minh=100,maxt=0,mint=100,t,h; //variables para ir guardando las maximas de // humedad y temperatura y las minimas de humedad y temperatura void setup() { InitDHT(); // Inicializamos el pin empleado para leer el sensor Serial.begin(9600); //Iniciamos comunicacion serie con el pc para ver los datos leidos Serial.println("Test sensor DHT11:"); delay(1000); //Este delay es para esperar el tiempo recomendado para acceder al sensor (1 segundo) } void loop() { ReadDHT(); // Leemos el sensor y almacenamos el resultados en variables globales switch (bGlobalErr) { case 0: //Como en este sensor la humedad y la temperatura no nos sale con decimales, //podemos desechar los bytes 1 y 3 de la lectura del sensor h=DHTDAT[0]; t=DHTDAT[2]; Serial.print("Humedad relativa: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperatura: "); Serial.print(t); Serial.println("*C"); //Comprobacion de maximos y minimos de humedad y temperatura if (maxh<h) maxh=h; if (h<minh) minh=h; if (maxt<t) maxt=t; if (t<mint) mint=t; Serial.print("Max: "); Serial.print(maxh); Serial.print(" % "); Serial.print("Min: "); Serial.print(minh); Serial.print(" %\t"); Serial.print("Max: "); Serial.print(maxt); Serial.print(" *C "); Serial.print("Min: "); Serial.print(mint); Serial.println(" *C\n"); break; case 1: Serial.println("Error 1: Condicion de start 1 no conocida."); break; case 2: Serial.println("Error 2: Condicion de start 2 no conocida."); break; case 3: Serial.println("Error 3: DHT checksum error."); break; default: Serial.println("Error: Encontrado codigo irreconocible."); break; } delay(1000);// Esperamos 1 segundo para la siguiente lectura } // Initilize pin for reading void InitDHT(){ pinMode(DHTPIN,OUTPUT); digitalWrite(DHTPIN,HIGH); } void ReadDHT(){ bGlobalErr=0; byte dht_in; byte i; // Enviamos el comando "start read and report" al sensor // Primero: ponemos a "0" el pin durante 18ms digitalWrite(DHTPIN,LOW); delay(18); delay(5);//TKB, frm Quine at Arduino forum //Segundo: ponemos a "1" el pin durante 40us,enviamos el comando de "start read" al sensor digitalWrite(DHTPIN,HIGH); delayMicroseconds(40); //Tercero: Cambiamos el pin de Arduino a entrada de datos pinMode(DHTPIN,INPUT); delayMicroseconds(40); //Esperamos 40 us dht_in=digitalRead(DHTPIN); //si hay un 1 en la lectura del pin, indicamos que hay error de tipo 1 if(dht_in) { bGlobalErr=1; return; } delayMicroseconds(80); //Esperamos 80us dht_in=digitalRead(DHTPIN); //si no hay un 1 en la lectura del pin, indicamos que hay error de tipo 2 if(!dht_in){ bGlobalErr=2; return; } /*Despues de 40us a nivel bajo, el pin deberia de estar durante 80us a nivel alto. Despues de esto comienza el envio del primer bit hasta alcanzar los 40 bits enviados. The routine "read_dht_dat()" expects to be called with the system already into this low.*/ delayMicroseconds(80); //Esperamos 80us //Ahora comienza la recepcion de datos, son 5 bytes de datos, es decir 40 bits, almacenamos en un array de 5 bytes for (i=0; i<5; i++) DHTDAT[i] = read_dht_dat(); //Cuarto: Volvemos a configurar el pin del arduino como salida pinMode(DHTPIN,OUTPUT); //Quinto:Ponemos a "1" el pin de salida digitalWrite(DHTPIN,HIGH); //Comprobamos si los datos recibidos coinciden con el checksum recibido byte DHTCHECKSUM = DHTDAT[0]+DHTDAT[1]+DHTDAT[2]+DHTDAT[3]; //Si no coincide el byte recibido de checksum con la suma de los 4 primeros bytes enviamos error tipo 3 if(DHTDAT[4]!= DHTCHECKSUM) bGlobalErr=3; }; byte read_dht_dat() { //Cogemos 8 de los bits recibidos y los devolvemos como un byte. //Si por ejemplo recibimos 00000100 , devolvemos en decimal 4 byte i = 0; byte result=0; for(i=0; i< 8; i++) { //Entramos mientras dura el primer bit de start (a nivel bajo durante 50us) del byte //Esperamos hasta que el pin se pone a nivel alto señalizando fin del la transmision del bit de start while(digitalRead(DHTPIN)==LOW); //La linea de datos debera estar ahora a nivel alto durante 27 o 70us, //dependiendo si un "0" o un "1" esta siendo enviado respectivamente delayMicroseconds(30); //Esperamos 30 us if (digitalRead(DHTPIN)==HIGH) result |=(1<<(7-i)); //Si despues de los 30us el pin permanece a "1" añadimos un 1 al byte, sino queda un "0" //Esperamos hasta que el pin se vuelve a poner a nivel bajo, // el cual indica la señal de start del siguiente bit de la transmision while (digitalRead(DHTPIN)==HIGH); } return result; //devolvemos el resultado }
Y este es el programa con librería:
// Sketch de ejemplo para testear el famoso sensor DHT de humedad y temperatura // Escrito por ladyada, de dominio público // Modificado por Regata para www.tallerarduino.wordpress.com #include "DHT.h" //Añadimos la libreria con la cual trabaja nuestro sensor #define DHTPIN 2 // Indicamos el pin donde conectaremos la patilla data de nuestro sensor // Descomenta el tipo de sensor que vas a emplear. En este caso usamos el DHT11 #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Conecta el pin 1 (el de la izquierda) del sensor a +5V // Conecta el pin 2 del sensor al pin que has elegido para DHTPIN // Conecta el pin 4 (el de la derecha) del sensor a GROUND // Conecta una resistencia de 10K del pin 2 (data) al pin 1 (+5V) del sensor DHT dht(DHTPIN, DHTTYPE); //Indica el pin con el que trabajamos y el tipo de sensor int maxh=0, minh=100, maxt=0, mint=100; //Variables para ir comprobando maximos y minimos void setup() { //Inicio comunicacion serie para ver los datos en el ordenador Serial.begin(9600); //Mensaje de inicio Serial.println("Comprobacion sensor DHTxx:"); //Iniciamos el sensor dht.begin(); } void loop() { // La lectura de la temperatura o de la humedad lleva sobre 250 milisegundos // La lectura del sensor tambien puede estar sobre los 2 segundos (es un sensor muy lento) int h = dht.readHumidity(); //Guarda la lectura de la humedad en la variable float h int t = dht.readTemperature(); //Guarda la lectura de la temperatura en la variable float t // Comprobamos si lo que devuelve el sensor es valido, si no son numeros algo esta fallando if (isnan(t) || isnan(h)) // funcion que comprueba si son numeros las variables indicadas { Serial.println("Fallo al leer del sensor DHT"); //Mostramos mensaje de fallo si no son numeros } else { //Mostramos mensaje con valores actuales de humedad y temperatura, asi como maximos y minimos de cada uno de ellos Serial.print("Humedad relativa: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperatura: "); Serial.print(t); Serial.println(" *C"); //Comprobacion de maximos y minimos de humedad y temperatura if (maxh<h) maxh=h; if (h<minh) minh=h; if (maxt<t) maxt=t; if (t<mint) mint=t; Serial.print("Max: "); Serial.print(maxh); Serial.print(" % "); Serial.print("Min: "); Serial.print(minh); Serial.print(" %\t"); Serial.print("Max: "); Serial.print(maxt); Serial.print(" *C "); Serial.print("Min: "); Serial.print(mint); Serial.println(" *C\n"); } delay(1000); }
La salida que obtenemos a través de la consola serie del IDE de Arduino es la misma para ambos códigos, os dejo una imagen:
Espero que os sirva de ayuda para vuestros proyectos!! Felices fiestas a todos!!
Si te ha servido de ayuda esta entrada, puedes realizar un donativo para agradecer el tiempo que dedico al blog y ayudar a hacer más entradas.
Saludo !!! primero que todo gracias por transmitir su conocimientos.
Ahora estoy tratando de modificar el código para que la lectura del sensor se vea en un display LCD 16 x 2 pues estoy en el proyecto de hacer una mini estación meteorológica ;). la idea es que muestre los valores asi:
Humedad Rel.61%
Max:61% Min:61%
Temperatura:26 C
Max:26C Min:26C
Con el fin que de que se vea las lectura de la humedad en un pantallazo y los de la temperatura en otro
con un retardo de 5 segundos. llevo varios días tratando de hacerlo pero la verdad no he podido,
Quería saber si me podrían dar una mano.
Gracias !!!
Andrés Botero H.
Saludo !!! primero que todo gracias por transmitir su conocimientos.
Ahora estoy tratando de modificar el código para que la lectura del sensor se vea en un display
LCD 16 x 2 pues estoy en el proyecto de hacer una mini estación meteorológica ;).
la idea es que muestre los valores asi:
Humedad Rel.:58%
Max:58% Min:58%
Temperatura:26ºC
Max:26C Min:26C
Que cada pantallazo (2 lineas de 16 caracteres) muestre la Humedad Relativa y su Max y Min.
lo mismo para la Temperatura.
Bueno el problema es que no he podido le he dado miles de vueltas y la verdad no logro hacer que se muestren los valores en una forma ordenada, quisiera saber si es posible que me dieran una ayuda.
Gracias !!!
Solucionado !!!
Gracias de todos modos.
Me alegro de que lo solucionases, la verdad es que mostrarlo por la lcd no es una cosa muy complicada, en comparación con el monitor serie. Un saludo!!
Cuando todo estaba solucionado y me trabajaba perfectamente sobre arduino uno; pase el código que no incluye la libreria a un attiny85 y ya no funciono, me arroja el siguiente error («Error 1: Condicion de start 1 no conocida.»). y cuando trato de pasar el codigo que contiene la libreria DHT.h me arroja un error de compilado:
/usr/share/arduino/libraries/DHT11/DHT.cpp: In member function ‘float DHT::readTemperature(bool)’:
/usr/share/arduino/libraries/DHT11/DHT.cpp:48: error: ‘Serial’ was not declared in this scope
/usr/share/arduino/libraries/DHT11/DHT.cpp: In member function ‘float DHT::readHumidity()’:
/usr/share/arduino/libraries/DHT11/DHT.cpp:72: error: ‘Serial’ was not declared in this scope.
La verdad no se que mas hacer busco por todos lados y no encuentro solución y lo que no quiero es mal gastar un atmega328 para usar solo 4 pines.
Hola arduinoyyo!!
Pues supongo que la librería para el Arduino Uno es distinta que para el ATtiny85, tendrás que modificar la libreria para poder trabajar con ella en el ATtiny85, mirando los registros y demás puertos que cambiar en la del Arduino Uno para poder adaptarla al Attiny.
Un saludo!!
Hola. Muy bueno tu trabajo!!!!!!!!!!
Tengo una duda: ¿que valores de resistor pull-up puedo usar aparte del de 5K?
Saludos.
Hola Fabricio!! He estado viendo montajes parecidos por ahí y bueno casi puedes montar resistencias entre 4k7 y 10k, debería de funcionar correctamente.
Tengo una duda de electronica basica con las resistencias de pull-up y pull-down, mi pregunta es porque esa resistencia a VCC en la salida del pin DATA OUT? Si me puedes ayudar con un comentario de cuando debo utilizar una u otra mejor!
Gracias y saludos
Hola Juan, te comento: como este es un sensor que se comunica a través de un protocolo 1-wire, necesitamos una resistencia de pull-up que nos proporciona un ‘1’ lógico cuando el bus de comunicación se encuentra libre. Con una resistencia de pull-down obtendríamos un valor de ‘0’ lógico. Los valores de estas resistencias pueden ser de entre 1k y 10k.
Espero que te sirva de ayuda. Un saludo!!!
Muchas gracias por tu respuesta!! Saludos
Hola.. Mira Tengo Una Gran Pregunta, Lo Que Pasa Es Que Soy Estudiante Y Quiero Hacer Este Sensor, Encontre Ese Proyecto Y Decidi Hacerlo, Tengo Una Profesora Que Es De Esas Que Quiere Que Uno Busque Todo Y Nos Dijo Que Este Sensor Tiene Un Programa, Y No Se Que Hacer Porque No Encuentro algo Que Me Diga Eso..
Gracias Por Tu Atenciom.
hola una consulta como obtienes la ultima temperatura que es tan precisa… necesito saber como se origina esa temperatura porque necesito la precisión…
Hola Lucas!!!
Pues la última lectura de temperatura no está realizada con el sensor usado en el post, es otro sensor que he usado para comprobar que las lecturas de ambos sensores eran parecidas. El sensor en cuestión es un sensor de temperatura TMP36 de Analog Devices (de tres patillas). Te dejo el datasheet del mismo para que puedas echarle un vistazo por si te interesa (es parecido a un LM35):
Haz clic para acceder a TMP35_36_37.pdf
Si te interesa saber algo más del código avísame!! Un saludo!!
Hola Ivan!!
No entiendo muy bien lo que me dices, ¿quieres montarte tu mismo un sensor de humedad/temperatura? ¿o quieres montar un circuito que lleve incluido dicho sensor?.
En este post está explicado el uso a través de un microcontrolador ATMEGA328P (En una placa Arduino) como trabajar con un sensor comercial (el DHT11), pero no como construir dicho sensor.
Un saludo!!
Hola, con lo que le respondes a lucas el 16-04, cual conviene usar para obtener mayor precision?? el TMP36 o el DHT11? si solo quisieras captar la temperatura.
Saludos
Yo usaría si solo quieres medir temperatura el TMP36, aunque quizás miraría dependiendo de la resolución que quieres obtener algún otro sensor, yo hasta ahora he usado el TMP36, el LM35 y el DS18B20 (que tiene un post en el blog). Un saludo!!
HOLA INTENTE HACER ESTE PROGRAMA Y LA VERDAD ME SALEN VARIOS ERRORES UNO DE ELLOS ES QUE NO ESTA DECLARADO DHT,H LO PUSE TAL Y COMO ESTA AKI YA SEA CON LIBRERIA Y SIN LIBRERIA NO ME APARECE NINGUN ERROR PERO AL MOMENTO DE DAR CLIN EN MONITOR SERIAL SOLO ME APARECE LA PANTALLA PERO NO ME SALE NINGUN RESULTADO K PUEDO HACER?. GRACIAS
Hola Lily!!
Te comento, para realizar el ejemplo del programa con la librería, tienes que copiar al directorio del IDE de Arduino donde tienes las demás librerías la librería que he puesto en el post, subida a un archivo de mediafire, ya que sin esta librería claro que no te va a reconocer el #include «DHT.h». Para ello descargas el archivo, buscar la librería dentro del archivo comprimido (en este archivo encontrarás unos documentos que explican el funcionamiento del sensor, así como los códigos en formato .ino para arduino (para versiones de Arduino superiores al 1.0), el esquema de conexión en Fritzing y el datasheet del sensor), que se encuentra dentro de la carpeta librería Arduino, y la copias al directorio libraries de la carpeta donde tienes el IDE de Ardunio, una vez hecho esto debería de cargarte el ejemplo perfectamente.
Otra cosa es saber si estás usando un módulo como el que he usado yo, o un sensor sin módulo? ¿qué versión de IDE de Arduino usas? ¿a que pin tienes conectado el sensor (ya que para el ejemplo está conectado en el Pin 2 digital del Arduino)?
En cuanto al programa sin librería debería de funcionarte correctamente sin tener la librería del sensor copiada en la carpeta libraries del directorio del IDE de Arduino. ¿Tienes correctamente seleccionado el puerto COM (supongo que sí ya que has podido cargar el sketch al Arduino)? Deberías comprobar el pin al que tienes conectado el sensor, aunque me parece raro que no te muestre ningún mensaje de error, al no realizar la comunicación el Arduino con el sensor como los que se muestran en el case 1, case 2 y case 3 que se encuentran dentro de la función loop.
Prueba a meter la librería en la carpeta y descarga una versión reciente del IDE de Arduino. Si sigues teniendo problemas no dudes en comentar. Un saludo!!
utilizo el arduino 1.0.4 que es el mas reciente y los errores k me salieron son estos, pero voy a intentar con lo que me acabas de decir sale, sabes ahorita hice la conexion en el protoboard pero cuadno conecto el pin 4 a gnd se me calienta la tarjeta demaciado por k es me puedes ayudar. ha estos son los errores k me salieron al conectarlo. Gracias
disculpa eso de la tarjeta k se calentaba ya lo solucione gracias jejeje , pero ahora he estado haciendo el circuito tal y como esta aki pero no me sale. ha estoy utilizando una resistencia de 10 kohms, pues es lo que menciona el programa agregue el archivo k descarge de medifire no me sale ningun error solo me aparece esto:
cannot run program»c:/users/mi amor/Desktop/Documentos Lily /arduino-1.0.4/hardware/tools/avr/bin/avr-g++»:createprocess error=193,%1 no es una aplicacionWin32valida
me puedes ayudar gracias
muchas gracias muy buen aporte. hoy aprendí algo nuevo. me funciono con las librerias y también bien el codigo sin libreria. Excelente…!!!
Hola Lily!!
¿Has probado a cargar cualquier otro programa en el arduino? Eso es un error que no es debido al programa que he realizado, es decir, debes de tener algo mal en el IDE de Arduino que tiene que ver con esa línea que te pone ahi, intenta descargandote de nuevo el IDE de Arduino e intenta cargar de nuevo el programa. Un saludo!!
Hola Regata
He intentado usar el codigo sin libreria en un pinguino y no ha funcionado, lo podrias portar? parece que el error es al declarar unas variables, pero yo no se solucionarlo.
Gracias y muy bien trabajo
Genial. Funciona a la perfección.
Intentaré presentar los datos en un LCD por I2c. Si te animas a dar un saltito…
Mi intención es montar una estación meteorológica para mi Instituto y publicar los datos embebidos a pratir de Pachube.com
Enharabuena. Recopilé información portodas partes y la tuya acertada.
Un saludo
Hola, muy buen post y buena informacion; muchas gracias.
Solo una preguntita: Sabes si este sensor puede utilizarse directamente en contacto con un medio acuoso?
Es decir, puedo meterlo en una maceta para saber si se esta secando la tierra o algo asi?
gracias.
Hola Daniel!! Me alegro que te haya servido este tuto!! Un saludo
Hola Mirasu!! En cuanto pueda y tenga algo de tiempo libre intentaré portarlo para poder trabajar con este sensor en Pinguino, pero hasta que pasen los examenes no creo que me ponga a ello.
Si tú lo das portado con exito, te agradecería que lo compartieras con la gente del blog, para ir haciendo un poco más grande la comunidad Pinguino.
Un saludo!!
Gracias Luis!!
Dentro de poco explicaré el uso de placas I2C para las pantallas LCD en el blog, la verdad es que te ahorran mucho trabajo (evitas poner cables de más) y funcionan perfectamente, si te hace falta la librería para trabajar con ella yo tengo una que funciona muy bien.
Lo de la estación metereológica es un proyecto que me gustaría realizar (pero hasta que pasen los exámenes lo tengo chungo), lo de pachube.com no lo controlo, a ver si le hecho un ojo para ver como va. ¿Que sensores te interesaría meter en la estación?
Un saludo!!
Hola Martin!! No creo que sea muy recomendable emplearlo en un medio acuoso, pero hay otros tipos de sensores (que además quería probar y que he visto por ebay) que creo que realizan la función que comentas de meterlos en una maceta para comprobar si se está secando la tierra de la maceta, te dejo el enlace del sensor a ver si te sirve de ayuda:
http://www.ebay.es/itm/Soil-Moisture-Sensor-Soil-Hygrometer-Detection-Module-For-Arduino-NEW-/251256313918?pt=LH_DefaultDomain_0&hash=item3a800b183e#ht_4477wt_1019
Espero que sea esto lo que buscas. Un saludo!!
Hola, genial tu taller. He estado tratando de hacer lo mismo pero no me ha ido muy bien. Siempre me entrega el error 1 o el error 2 dependiendo de como lo alimente.
He usado el mismo codigo, los mismos elementos ( arduino uno, dht11)pero nada. Si tienes alguna idea…te lo agradecería.
Saludos Alejandro
Hola Alejandro!! ¿Has probado el código con la librería? (Esto es para ir descartando fallos). Por los errores que dices es que el programa no detecta la condición de start para poder leer la infomación que va a recibir del sensor de dht11. ¿Has puesto la resistencia de pull-up? Si puedes indicame como tienes conectado el sensor a tu placa arduino UNO, ya que ambos códigos aquí puesto funcionan correctamente. Dame algo más de información y sobretodo descargate la librería y prueba el código con la librería a ver si realiza alguna lectura. Un saludo!!
me podrias ayudar a conectarlo a un display 16×2?
Hola Rodrigo!! ¿Lo que quieres es saber como se conectaría un display 16*2 al arduino para poder ver los datos proporcionados por el sensor? Explícame algo más de lo que quieres hacer y te echaré una mano en lo que pueda. Un saludo!!
Debes conectar el display según sea tu caso y el valor de la variable que almacena la temperatura lo visualizas en el display. Si ya sabes usar bien este sensor entonces empieza a practicar con display y así te darás cuenta como puedes mostrar el valor de la variable en pantalla
Hola que tal, oye soy amigo de rodrigo, nuestra duda es si nos podrias ayudar a conectar el sensor junto con un display de 16×2 que diga la temperatura y la humedad, todo en un arduino uno, saludos!
Espero que os sirva esto, he modificado el código, pero es bastante sencillo (muestra humedad en una línea del lcd y en la otra la temperatura), os paso también la conexión en una imagen y en un archivo de fritzing para que veáis como conectar todo. Un saludo!!
El link: http://www.mediafire.com/?qb6s5x674m3rv94
Nota: Este código emplea la librería del sensor DHT11 que podéis descargar en esta entrada!!
Hola,
quiero conectar el sensor de temperatura y humedad SEN11301P con un arduino Mega, sin embargo, a la hora de hacer la detección de estos valores no logra hacerlo. Hemos probado con un potenciómetro para averiguar si la tensión dada no llega en algún punto, pero si que llega. También hemos modificado el código para obtener la lectura de «0´s» y «1`s» en cada instante, pero a partir de un tercer instante la lectura recibida es 1, es decir, que se empieza a repetir este valor en vez de la conversión 0-1-0-1-0,… ¿A alguien le ha pasado algo parecido?
Gracias.
Hola!. Tengo dos sensores DHT11, en concreto los Grove – Temp&Humi Sensor (SEN11301P) que se puede ver en la dirección:
http://www.seeedstudio.com/depot/grove-temphumi-sensor-p-745.html
También dispongo de un Arduino MEGA 2560.
Hago las siguientes conexiones:
MEGA Sensor
===== ======
GND ———- GND
5V ———- VCC
PWM 2 ———- SIG
He hecho la prueba de compilar y cargar los programas ejemplo que vienen en esta página y me siempre me da el mensaje de error:
Error 1: Condicion de start 1 no conocida.
He comprobado las conexiones y el código, y no veo porqué no funciona con ninguno de los dos sensores que tengo.
Gracias. Un saludo
Hola patriol!!
Por lo que veo estás usando el código que no emplea la librería para la lectura del sensor DHT11, te recomiendo que te descargues la librería que adjunto y pruebes el segundo código, yo es el que normalmente utilizo y funciona perfectamente, ahora mismo estoy haciendo un programa con un Arduino MEGA 2560 y en el que empleo dicho sensor y te puedo decir que va perfecto. Prueba con este otro código y me comentas (Nota: puedes conectar el sensor a cualquier otro pin, solo tienes que modificar el pin asociado al sensor en el programa).
Un saludo!!
Hola Luis!!
Veo que has probado el primer código también, te recomiendo que intentes usar el segundo código que realiza la comunicación con el sensor a través de una librería, y que puedes encontrar dentro del archivo que aparece en este post, el cual trae el datasheet del sensor, los códigos de ejemplo, las librerías y el esquema de conexionado en Fritzing. Para añadir la librería del sensor al IDE de Arduino solo tienes que copiar dicha carpeta a la carpeta libraries donde tengas la carpeta del IDE de Arduino, cerrar el IDE y abrirlo para que la reconozca. Además como he comentado en el anterior comentario, puedes conectar ambos sensores a pines diferentes, solo tienes que añadir una nueva instancia para el segundo sensor:
#include «DHT.h» //Añadimos la libreria con la cual trabaja nuestro sensor
#define DHTPIN 2 // Indicamos el pin donde conectaremos la patilla data del primer sensor
#define DHT2PIN 3 // Indicamos el pin donde conectaremos la patilla data del primer sensor
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE); //Indica el pin con el que trabajamos y el tipo de sensor; primer sensor
DHT dht2(DHT2PIN, DHTTYPE); //Indicamos el pin con el que trabajamos y el tipo de sensor; segundo sensor
Prueba a cargar la librería y el segundo código y te debería funcionar sin ningún problema, yo estoy usando ese código tanto para un DHT11 como para un DHT22 y funciona de maravilla.
Si tienes alguna duda al respecto sobre donde copiar la librería dímelo, tampoco está de más saber que versión del IDE de Arduino empleas para saber si se tiene que modificar algo o no.
Un saludo!!
Muchas gracias por la respuesta!!
Con el segundo código (con librería) funciona perfectamente, pero con el primero no consigo que funcione.
Un saludo
Hola, excelente los conocimientos que transmitís. Muchas gracias.
Ya encargué estos sensores, y también unos ds18b20 sumergibles para otro proyecto. Como bien decís son todos de protocolo oneWire. Lo que estuve investigando es que este protocolo te permite poner varios sensores en el mismo cable (por eso oneWire) porque cada componente tiene su propia dirección. Pero veo que en tu proyecto no direccionaste nada (claro era solo un sensor) , la pregunta es se puede usar este sensor el DHT11 con la librería oneWire? O sea, es direccionable?
Michas gracias por tu paciencia y tiempo.
Hola PatoPato!!
Los sensores DS18B20 como se puede ver al final de este post, si que se pueden conectar varios al mismo pin y comunicarse con ellos a través del protocolo 1-Wire y a través de la dirección de cada dispositivo. En cuanto a los sensores de humedad DHT11 o DHT22(recomiendo este ya que presenta más resolución que el DHT11, en breve haré un post con él, aunque su uso es idéntico al otro) deberás conectar cada uno a un pin del arduino, por ejemplo, si tienes 3 sensores DHT11 tendrás que conectarlos de la siguiente manera:
#define Sensor1_Pin 2 // Indicamos el pin donde conectaremos la patilla data de nuestro
#define Sensor1_Tipo DHT11 // DHT 11
#define Sensor2_Pin 3 // Indicamos el pin donde conectaremos la patilla data de nuestro
#define Sensor2_Tipo DHT11 // DHT 11
#define Sensor3_Pin 4 // Indicamos el pin donde conectaremos la patilla data de nuestro
#define Sensor3_Tipo DHT22 // DHT 22
DHT dht1(Sensor1_Pin, Sensor1_Tipo); //Indica el pin con el que trabajamos y el tipo de sensor
DHT dht2(Sensor2_Pin, Sensor2_Tipo); //Indica el pin con el que trabajamos y el tipo de sensor
DHT dht3(Sensor3_Pin, Sensor3_Tipo); //Indica el pin con el que trabajamos y el tipo de sensor
Así puedes trabajar con cada sensor independientemente, y leer su humedad y temperatura en el instante que tu desees. Un saludo, si no entiendes algo ya sabes, pregúntame!!
Gracias Regata por la pronta respuesta. O sea que los DHT11 o DHT22 no son oneWire.
Gracias y saludos
Exacto, no son oneWire, por tanto tendrás que usar un pin por cada sensor de este tipo que quieras meter en tu proyecto. Pero bueno con un único sensor puedes medir temperatura y humedad, así que es un sensor bastante recomendado. Un saludo!!!
hola disculpa es que tengo un problema y me gustaría saber si me puedes ayudar, lo que pasa es que quiero programar en visual studio 2010 los resultados que me arroja el sensor dht11, vi un video pero esta en inglés y me pide una librería en c++, yo estoy utilizando el programa sin librería que tienes, ya conecte mi puerto serial en visual pero no se que códigos poner para que los resultado me lleguen directamente a visual studio. tu tienes alguna idea de que código poner vi un ejemplo similar este es el link. http://www.youtube.com/watch?v=ngnJ-81gVFo
pero como te digo sale una libreria en c++
por tu atención, gracias
Hola liliana!
No entiendo muy bien lo que te gustaría hacer, por lo que veo en el vídeo, el visual studio 2010 tiene un plugin para poder programar arduino, es decir, hace de IDE, en lugar de emplear el propio IDE que suministra Arduino. Luego lo que hace es un simple programa para establecer comunicación vía serie entre el programa que cargas en el Arduino (en este caso el programa para la lectura de la temperatura y la humedad del sensor DHT22) y la aplicación desarrollada en el visual studio 2010. Como no estoy familiarizado con la programación en este último programa no te puedo ayudar con los comandos que necesitas emplear para la recepción de los datos a través de la comunicación serie. En visual basic 6.0 no es muy complicado y supongo que en visual studio 2010 será también sencillo. Tienes que investigar acerca de como recibir datos a través del puerto serie en visual studio 2010. Mi ordenador no es muy potente y alguna vez he instalado este software para empezar a aprender, pero he tenido que desistir ya que me iba muy lento. Un saludo y espero que puedas progresar con tu proyecto!!
Para conectar una PC con arduino una vez utilicé Processing. La interfaz de desarrollo es muy similar a la de arduino. El lenguaje es más Java que C++ (para mi es más fácil). El proyecto es opensource, con lo cual es gratuito http://processing.org/
Suerte
Si PatoPato, ya conecemos Processing y sus enormes cualidades, la verdad es que es un lenguaje muy parecido al de arduino, en el blog tenemos una sección de videotutoriales sobre este programa, te dejo el enlace por si no la has visto: https://tallerarduino.com/category/videotutoriales/processing-tutorials/
Un saludo!!
quisiera saber si puedo con este sensor y haciendo un circuito electronico me pudiera sensar rangos de humedad para de esta forma poder hacer un sensor de lluvias para autos
¿Porque razón todas mi medidas tiene un valor de 0?
Hola jose!!
Has conseguido otras medidas con el sensor??, puede ser que no esté haciendo buen contacto. Si puedes indicarme como lo tienes conectado al arduino y si lo tienes en una protoboard. A mi en ocasiones me pasa eso, pero es debido a un mal contacto físico con los pines metálicos de la protoboard, moviendo un poco el sensor ya empieza a medir correctamente.
Un saludo!!!
Hola mereises!!
Lo siento por la tardanza en contestarte, pero me ha sido imposible antes, prácticamente no tenía nada de tiempo. Aunque he buscado algo de información acerca de lo que me comentas y he encontrado algún sensor que creo que puede funcionar de una manera más eficaz para realizar las mediciones que tu necesitas. Ya que creo que puede ser díficil hacer lo que quieres con este tipo de sensor (el DHT11), ya que a veces algún lugar puede presentar una humedad más elevada que otro y no estar lloviendo, por lo que el sistema no funcionaría de la manera deseada. Te pongo un enlace con el sensor que he encontrado y a ver si este te puede valer:
http://www.ebay.es/itm/Water-Sensor-Water-Level-Sensor-Liquid-Water-Surface-Height-Sensor-for-Arduino-/370855716297?pt=LH_DefaultDomain_0&hash=item5658b925c9&_uhb=1
Un saludo y disculpa como he dicho por tardar en contestar!!
Buenas, muchas gracias por la información, está muy completa. Hemos estado usando el mismo sensor con librerías y todo está muy bien, los datos de temperatura se compararon con un medidor y son muy precisos, el problema está con la medición de la humedad, siempre da un valor muy alejado del correcto y ni siquiera es como un rango de error fijo. Cuál considera usted que puede ser el error? Será que es el propio sensor el que está fallando o es la progra? De antemano gracias 🙂
hola tengo un problema al instalar la libreria, mira lo que hize fue lo siguiente, copie la carpeta DHT11( despues le cambie a nombre DHT) donde viene la libreria, en la siguiente direccion C:\Users\TOSHIBA\Desktop\arduino-0023\libraries , despues ya quise cargar el programa que viene de ejemplo pero me arroja este error DHT does not name a type, DHTtester.cpp:4:17: error: DHT.h: No such file or directory
DHTtester:17: error: ‘DHT’ does not name a type
DHTtester.cpp: In function ‘void setup()’:
DHTtester:23: error: ‘dht’ was not declared in this scope
DHTtester.cpp: In function ‘void loop()’:
DHTtester:29: error: ‘dht’ was not declared in this scope
He corregido eso, es que habia olvidado reiniciar el arduino, cerre y volvi a abrir el programa y ya ahora si cargo el programa, ahora el detalle fue esto «Read failFailed to read from DHT
Humidity: 0.00 % Temperature: 0.00 *C
Humidity: 0.00 % Temperature: 0.00 *C
Humidity: 0.00 % Temperature: 0.00 *C
Read failFailed to read from DHT»
Hola, soy nuevo en esto y me gustaría preguntar si alguien me puede explicar porque en mi «Monitori Serial» solamente aparecen dos medidas y se queda parado y no vuelve a mostrar nada. Algo como esto:
Test sensor DHT11:
Humedad relativa: 42 % Temperatura: 23*C
Max: 42 % Min: 42 % Max: 23 *C Min: 23 *C
Humedad relativa: 39 % Temperatura: 22*C
Max: 42 % Min: 39 % Max: 23 *C Min: 22 *C
Y a partir de ahí no vuelve a mostrar más información.
Gracias.
Hola Camila!
No te sabría decir, la verdad es que no tengo un dispositivo con el que comparar la medida de la humedad (este sensor es bastante impreciso, suelo usar el DHT22), puedes decir el margen de error que suele aparecer en las medidas que realizas con él. Igual haciendo algún sistema de calibrado mediante componentes electrónicos para ir acercando más el valor a la medida real que debería de dar. También puedes probar a realizar la lectura de la temperatura sin la utilización de la librería y siguiendo la información que te proporciona el datasheet para poder conseguir la medida de humedad. Siento no poder darte más ayuda. Un saludo!!
Hola Alejandro!! A mi a veces me tiene pasado eso y era por que para los montajes usaba protoboards para realizar las pruebas, y a veces no sé porque el sensor no hacia buen contacto con los contactos metálicos de la misma y daba el mismo fallo que comentas. Te ha seguido dando problemas la lectura del sensor, si puedes comentar más sobre como lo tienes conectado (si es un módulo, el sensor solo,…), así podemos ir descartando posibles fallos. Un saludo!!
Hola Miguel!! El código que usas es el que he puesto en esta entrada o has modificado algo? Puede deberse a algún mal contacto del sensor (si puedes indicar como lo tienes conectado al arduino), me parece raro que solo realice dos medidas y que pare inmediatamente de medir. Un saludo!!
Hola,
he estado provando el programa com libreria para el sensor DHT11 sin modulo, con resistència de pull-up. Tengo la ultima version de IDE, he estado mirando un poco los comentarios que hace la gente aquí, però no me muestra ningun dato por el monitor série. No he modificado nada de nada, simplememte lo he cargado. Tienes alguna idea porquè no monitoriza los datos?
Hola lots!!
Puedes decirme que valor de resistencia de pullup le tienes puesta al sensor? En esta entrada aparece una resistencia de 5k, he estado haciendo un proyecto sobre una estación meteorológica básica y he usado una resistencia de 10k para la resistencia de pull-up, prueba a cambiarla a ver si se visualiza algún valor. Si tienes puesto el sensor en una protoboard puede que los pines del sensor no hagan buen contacto (me tiene pasado esto mismo en alguna prueba con este sensor). Por último como tienes configurado el monitor serie en el IDE de Arduino?No te muestra ningún mensaje por él? Quiero decir por mensajes por ejemplo, lo de prueba del sensor DHT11 o el de fallo de lectura del sensor.
Un saludo!!
estoy trabajando con sht11 de 3 pines, he conectado el pin de datos al pin 2 digital del arduino uno, pero no me arroja lectura alguna… ayuda
Error 1: Condicion de start 1 no conocida.» esto es lo que aparece en el promt
Hola buenas noches,
Hay alguna posibilidad de usar el dht11 sin el comando «delay()» y/o «delayMicroseconds()» es que en el proyecto que estoy desarrollando el arduino tiene otras actividades que son disparadas por tiempo y medir asi lo retrasa 1 seg por cada 3 seg que pasan, he visto otros codigos y todos usan el retraso del micro. Gracias de antemano
Hola manu!!
Creo que el sht11 puede trabajar de distinta manera al sensor DHT11, tienes que revisar el datasheet si presenta la misma trama de comunicación el sensor que estas usando tú y el sensor DHT11. Más tarde puedo mirar a ver si coincide y te comento. Un saludo!!
Hola sanchezcl!!
Pues no te sabría decir, pero creo que esos delay() y delayMicroseconds() se usan en la librería para poder realizar la comunicación de manera satisfactoria con el sensor DHT11. Puedes echar un vistazo al datasheet del sensor y verás que se necesitan unos tiempos concretos para la comunicación con el sensor. Siento no poder ayudarte más, si averiguo algo sobre esto, te lo haré saber. De igual forma si averiguas algo me gustaría que nos comentaras si lo has logrado realizar sin las funciones delay() o delayMicroseconds().
Un saludo!!
Saludos tengo unas dudas tengo este mismo sensor de humedad pero es de dos pins como lo puedo conectar y tambien tengo un sensor de temperatura pero de dos pins tipo ntc 10k y no se como we conecta me podrian ayudar x favor
Hola regata, te cuento que pude sustituir la mayoria de los retardos con una especie de FSM, el que no pude cambiar fue el que esta dentro de la funcion read_dht_dat() pero son 240 microsegundos por cada medicion, ese retardo tan pequeño no afecta las otras actividades, con gusto compartiria el codigo pero no se por que medio hacerlo. Saludos
hola qtal spero me puedas ayudar cuando compilo el programa me aparece erro en las llaves del void seup
Hola! Mi problema es que pruebo tu programa sin librería en una placa arduino mega 2560, pero no funciona, pone Iniciando DHT pero hay se queda. Si quitas el último while del programa en la funcion read_dht_dat, si que funciona pero no recoge bien los datos, se queda perdido. Tengo que decir que está todo correctamente conectado, ya que, he probado con otro programa con librería y funciona perfectamente. Mi intención era hacer funcionar el DHT11 sin librería a base de funciones como tu tienes. He querido, basándome en tu programa sin librería hacerme el mio propio, pero no consigo recoger bien los bits. No se que hacer si pudieses ayudarme te lo agradecería. Gracias.
BUENAS ESTOY HACIENDO UN PROYECTO QUE ME MIDA TEMPERATURA Y HUMEDAD UTILIZANDO EL SENSOR AM2301 Y EL ARDUINO Y QUE ESOS VALORES SE VEAN EN UNA PANTALLA DE 16X2 COMO HACE R GRACIAS YA QUE LOS CODIGO EN C QUE COMPILO ME DAN ERROR, ME ESTOY APOYANDO CON EL CODIGO QUE REGATA COLOCO EN ESTE POST PERO NO SE PÒRQUE NO M,E FUNCIONA NECESITO SU AYUDA
Copio tu codigo correcto todo como has indicado y no me da lecturas, se me queda en test sensor DHT11, alguna idea de que estoy haciendo mal? muchas gracias y un saludo
Hola daniel!!
Ese error puede ser debido a un mal fallo de conexión por hardware del sensor. ¿Como lo tienes conectado? ¿A través de una protoboard? ¿Es un módulo o tienes el sensor de manera independiente?
Hola JOSMAN!!
¿Que versión del IDE de Arduino usas? Puede ser debido a que la librería no está actualizada para una versión del IDE de Arduino nueva. Un saludo!!
Hola David!! Creo que el programa para leer el sensor DHT11 lo había usado con la versión del IDE de Arduino 022, en nuevas versiones han cambiado algunas funciones del lenguaje y por eso puede dar errores. Prueba con esa versión de IDE que te comento y nos cuentas. Un saludo!
Hola jesus!!
Me parece muy raro que te de error al compilar¿estas usando el código que he puesto en esta entrada? Si es que sí ¿puedes indicar que versión del IDE de Arduino usas para programar el Arduino? Los códigos que pongo aquí funcionan perfectamente y han sido probados antes de publicar la entrada. Un saludo!!
Hola sanchezcl!!
Siento la tardanza en contestar, pero es que ando muy liado y casi no tengo tiempo para dedicarle al blog. La verdad es que creo que sería interesante compartir las mejoras que vayamos haciendo la comunidad de usuarios de Arduino, así como librerías, ejemplos, proyectos, etc… Si quieres puedes poner un enlace de los archivos que tengas para compartir. Un saludo!!!
Hola hector manuel!!
No he visto nunca ningún sensor de este tipo con 2 pines, puedes poner un enlace de donde lo compraste para ver como es, y que clase de conexión habría que hacer para poder leer los datos del mismo. En cuanto al sensor de temperatura es un sensor de tipo resistivo, de momento no he probado a hacer ninguna prueba con sensores de este tipo, pero más adelante tengo pensado hacer algún tipo de prueba y subirla al blog. Un saludo!!
estoy utilizando el atmega 1280
Hola Regata…
Primero quiero felicitarte por la dedicacion que pones en este blog
Mira, yo ya probe este tutorial que publicaste y si me funciono el codigo…ahora bien yo quiero integrar el DHT11 al sensor de presion barometrica BMP085 en la misma placa arduino para tener una estacion meteorologica y espero no tener problemas…
Finalmente me gustaria conectar esta estacion meteorologica a la PC con Visual Basic 6.0 y poder ver la Humedad Relativa, Temperatura y la Presion Barometrica en la PC….Me gustaria saber tu opinion respecto a como deberia yo hacer el programa en Visual Basic 6.0 para ver estos tes datos…Saludos
hola logrè cargar la versión sin librería funciona a la perfección pero al septimo mensaje deja de enviar.
sabes que puede estar sucediendo??????
Hola. muy buen trabajo, estoy probando el código extendido y el programa funciona bien solo que únicamente me manda 2 o 3 veces la información al puerto serial y ahí se queda hasta que le aplico un reset, a que crees que se deba, saludos
Hola, llevo un par de dias probando con el sensor DHT11 varios programas, incluso alguno escrito por mi sencillito, pero no hay manera de que me de temperatura, por ejemplo en el programa primero que va sin libreria me dice por el puerto serie «Error 1: Condicion de start 1 no conocida.» he cambiado mil veces de librerias pero nada, estoy sospechando que el sensor este estropeado. saludos
buenas chico queria saber si este sensor sirve para sensar la temperatura en un area de 540 m2 o solo es para proyectos pequeños??
hola, si quisiera almacenar el sensado de esas temperaturas por dia algo asi como un reporte como le tendria q hacer
Hola raul, pues tendrías que mirar el tema de usar las librerías de tarjetas de memoria SD, y comprar un modulo SD o microSD y guardar ahí un archivo con las lecturas que realices cada día, para posteriormente poder tratar esos datos.
hola amigo oye tengo una pregunta hice el programa asi sin libreria pero solo me manda datos incorrecto por ejemplo solo me pone en humedad 3% y en temperatura solo ceros