Autor Tema: PIC16F84A y sensor de temperatura DHT11  (Leído 55736 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
PIC16F84A y sensor de temperatura DHT11
« en: 09 de Agosto de 2011, 10:04:53 »
hola buenos dias amigos hace ya tiempo que no escribo y ahora pues despues de estar realizando diversos proyectos me enbarque en la aventura de comunicar un Pic el que sea con el sensor de temperatura DHT11 ya que solo hay ejemplos para arduino y tal vez pues alguien como yo le gustaria poder probarlo en los PIC de microchip sin necesidad de arduino voy a adjuntar lo siguiente una libreria hecha por mi por lo tanto es casera y se puede modificar al gusto y necesidad de cada uno y si alguien puede aportar mejoras, tanto mejor jejejeje  :lol: :lol: :lol:

LIBRERIA:

//----------------------------------------------------------//


#define dht11 PIN_B0
#bit dht_io = 0x86.0 // este es el bit 0 del tris b para ponerlo como entrada o salida
#byte puerto_b = 0x06

byte dht_dat[5]; // Creo un array de tipo byte de 5 ya que asi en el programa principal podemos mostrar cada dato
//individualmente sin necesidad de punteros
//los datos obtenidos son en este orden:
//dato 0= parte entera de la humedad
//dato1= parte decimal de la humedad
//dato2= parte entera de la temeperatura
//dato3= parte decimal de la temperatura
//dato4= dato de comprobacion para saber si la captura es correcta

//#use rs232(baud=9600,xmit=PIN_B7,rcv=PIN_B6,bits=8,parity=N,FORCE_SW) // conexion rs232 por si acaso alguien la necesita


void iniciar_dht();//para iniciar el sensor
void leer_dht();//para comenzar la captura de datos el sensor
byte leer_dht_dat();//funcion de captura de datos del sensor
void mostrar_dht();// mostrar datos

//--------------------------------funcion inicializar
void iniciar()
{

dht_io=0;
delay_ms(1);
OUTPUT_HIGH(dht11);

}//-------------------

//----------------------funcion de leer el dht-------------
void leer_dht()
{
//------- variables
byte GlobalErr=0;
byte dht_in;
byte i;

byte dht_check_sum;




//-----------------
dht_io=0; // configurar el pin como salida
OUTPUT_HIGH(dht11);
OUTPUT_LOW(dht11);
delay_ms(18);// retardo indicado por el fabricante
OUTPUT_HIGH(dht11);
delay_us(22);// entre 22 y 28 us
dht_io=1;// configurar el pin como entrada
delay_us(5);// retardo indicado por el fabricante esta entre los 22 y 28 us
dht_in=input(dht11);
if(dht_in)
 {
  GlobalErr=1;
  printf("<dht11 start condition 1 not met");
  return;
 }
 delay_us(80);
 dht_in=input(dht11);
 if(!dht_in)
 {
  GlobalErr=2;
  printf("<dht11 start condition 2 not met");
  return;
 }
  delay_us(80);
  for (i=0; i<5; i++)
  {
    dht_dat = leer_dht_dat(); // capturando datos
  }
 
  dht_io=0;// configura el puerto como salida

OUTPUT_HIGH(dht11);

dht_check_sum = dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3]; // comprobacion si la lectura es correcta
if(dht_dat[4]!=dht_check_sum)
{
 GlobalErr=3;
 printf("DHT11 checksum error");
 
}
dht_dat[0]=dht_dat[0]+5;
dht_dat[2]=dht_dat[2]+2;
// por ajustar segun caracteristicas +- 5%
//printf("Current humdity = ");
 //printf("%d",dht_dat[0]+5);
  //printf(".");
  //printf("%d",dht_dat[1]+50);
  //printf(" RH  ");
 //printf("temperature = ");
  //printf("%d",dht_dat[2]+2); // por ajustar segun caracteristicas +- 2ºC
  //printf(".");
  //printf("%d",dht_dat[3]+50);
  //
  //printf("C \n ");
 // delay_ms(2000);



}// fin de funcion leer dht

//------------------------funcion recoger bits del dht
byte leer_dht_dat()
{
byte i = 0;
 byte result=0;
 for (i=0; i< 8; i++) {
  //We enter this during the first start bit (low for 50uS) of the byte
  //Next: wait until pin goes high
  while(input(dht11)==0);
  delay_us(30);
  if (input(dht11)==1)//Was: if(PINC & _BV(dht_PIN))
  {
  result |=(1<<(7-i));
  }
  while (input(dht11)==1);
  //Was: while((PINC & _BV(dht_PIN)));
 }
 //end of "for.."
 return result;
}

//---------------------------------------------------------


a continuacion voy a poner un ejemplo hecho con el PIC16F84A pero puede utilizarse para cualquier PIC

EJEMPLO:
//--------------------------------------------------------------------------------

#include <16F84A.h>
#include <dht11.h>  //esta es la libreria creada por mi
#FUSES NOWDT                    //desactiva el wath dog
#FUSES XT                       //Crystal  <= 4mhz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_B5,rcv=PIN_B4,BITS=8,PARITY=N)

void main()
{

   //setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

   // TODO: USER CODE!!

delay_ms(5000);
printf("iniciando..\n");
   do
{




delay_ms(10);
 iniciar();
leer_dht();

printf("Humedad = ");
 printf("%d",dht_dat[0]);
 delay_ms(20);
 printf(",");
  printf("%d ",dht_dat[1]);
  delay_ms(20);
 printf("Temperatura = ");
 printf("%d ",dht_dat[2]);
 delay_ms(20);
  printf(",");
  printf("%d ",dht_dat[3]);
  delay_ms(20);
printf("\n...terminado..\n");

  delay_ms(2000);

}while(true);


}

//-------------------------------------------------------

hasta aqui mi aporte espero que les sirva de ayuda a los demas.

P.D.: SI ALGUIEN tiene alguna duda que no dude en comentarlo o me mande algun privado
 
 

Desconectado peteorito

  • PIC16
  • ***
  • Mensajes: 136
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #1 en: 18 de Agosto de 2011, 15:27:44 »
Gracias!! Estaba  pensando en comparlo , pero tenia el problema  del codigo para el pic!! Gracias por tu aporte!! ya te contare cuando lo reciba y lo monte!! Un saludo!

Desconectado MARKUS

  • PIC10
  • *
  • Mensajes: 11
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #2 en: 21 de Agosto de 2011, 00:38:59 »
Excelente aporte! También estaba indeciso de comprarlo para experimentar, pero con esto, tengo como para ponerme en movimiento. Muchas gracias!
"Para mover al mundo debemos primero movernos nosotros mismos" -Sócrates

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #3 en: 25 de Agosto de 2011, 05:18:44 »
de nada, bueno y animo a la gente a que si tienen algun aporte para la libreria ya sea para mejorarla o simplificarla vamos lo que sea que lo cuelgue ya que soy partidario de compartir ejejeje por cierto tambien sirve para el dht22

Desconectado peteorito

  • PIC16
  • ***
  • Mensajes: 136
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #4 en: 09 de Septiembre de 2011, 12:09:46 »
Ya lo he recibido!!! el sensor..   he empezado con las pruebas el primero creo que lo he quemado por que lo he puesto al reves..  pongo una imagen  para que  no le pase a nadie mas.


Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #5 en: 15 de Septiembre de 2011, 07:12:58 »
si yo tb me equivoque menos mal ke lo hice con la fuente de laboratorio y me cortocircuito y lo kite enseguida pero sigue funcionando pruebalo de todas formas yo ahora voy a adquriri el dht22 que me da precision de decimales

Desconectado peteorito

  • PIC16
  • ***
  • Mensajes: 136
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #6 en: 15 de Septiembre de 2011, 17:25:03 »
Creo que no se ha   quemada  pero no me funciona bien el codigo.. solo recibo el primer dato de la humedad..  :(

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #7 en: 20 de Septiembre de 2011, 13:20:19 »
pues a mi me funciono perfecto me saco datos de humedad y temeperatura pero solo las partes real ya que la parte decimal del valor ese sensor no tiene

Desconectado cabritillo

  • PIC10
  • *
  • Mensajes: 14
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #8 en: 27 de Enero de 2012, 17:29:01 »

 Felicitaciones por tu creacion zerovlc.

 No obstante, dado que hay varios C disponibles para PIC, para que tu ayuda fuera plena habría sido ideal que junto con el código hubieses publicado el nombre del creador del compilador C que utilizaste.

 Imagino que expertos en C lo habrán detectado con facilidad, pero en el foro habrá otros como yo que prefieren el basic al C y no lo tienen tan claro.

 Personalmente prefiero el Basic al C, dadas las impresionantes capacidades del PICBasic Pro, o el ensamblador mpasm PURO si el programa a crear no es muy largo.

 He creado un modulo ASM puro similar a tu librería a partir de una traducción libre al PIC ASM de la librería arduino.

 Como no he encontrado software de simulación del DHT11 en Proteus solo podré probarlo en un circuito real.

 El modulo asm me ocupa 162 WORDS (10 RAM bytes)

 Como aun no lo he probado prefiero no publicarlo aun.

 Como complemento a lo que habeis expuesto algunos comentarios:
 + El DHT11 da 5 bytes de salida
 + 2 bytes estan vacios
 + 1 byte mide la humedad -> valores de 20 a 95 
 + 1 byte mide la temperatura -> valores de 0 a 50
 + 1 byte es de comprobación de la suma de los bytes de humedad y temperatura

 El resultado es que su precisión es de 1 unidad tanto en humedad como en temperatura
 Esto supone que especialmente en temperatura la precisión es algo pequeña.

 Las buenas noticias son que existe otro modulo idéntico en aspecto y pinout : el DHT22, PERO MUCHO MAS PRECISO.

 Basicamente es identico en todo al DHT11, salvo que los 2 bytes vacíos los usa para aumentar en 1 byte tanto la medida de
la humedad como de la temperatura.

 El DHT11 si mide una humedad del 33% , solo puede cambiar a 32% o a 34%
 Pero el DHT22 puede detectar 32.9% o 33.1%

 De forma similar el DHT11 si mide una temperatura del 23ºC, solo puede cambiar a 22ºC o a 24ºC
 Pero el DHT22 puede detectar 22.9ºC o 23.1ºC

 El DHT22 tambien detecta un mayor rango de dedidas de humedad desde el 0 al 100% (el DHT11 solo 20 al 95),
 
 El DHT22 detecta incluso temperaturas negativas.


 El unico defecto del DHT22 es el precio, algo más de 6 euretes, es decir , cuesta casi 4 veces mas que un DHT11 -> CUIDADO CON ESTE peteorito ;)









 





 

Desconectado cabritillo

  • PIC10
  • *
  • Mensajes: 14
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #9 en: 08 de Febrero de 2012, 22:55:54 »
 Buenas noticas, el DHT11 que compre hace 6 meses funciona al fin.

 A falta del pdf , había creado el modulo asm inicial para PIC de una traducción del software pseudo-C de la librería Arduino.

 Como conseguí al final después el pdf , creé un nuevo modulo ASM a partir de las indicaciones del pdf , y este (el que funciona) me ha quedado en 109 WORDS (8 RAM bytes).

 Lo malo es que el modulo DHT11 que he probado mide la temperatura con mucho mas error del que da el fabricante:
 El DHT11 indica 11'c
 Un termometro digital de precision indica 6,1'C

 Es decir, 5 grados reales de error.

 Lo bueno es que conocido este error, si se corrige en sotware (restando 5' a la lectura del modulo) se puede conseguir al
final una precision de 1 grado.

 Me falta hacer lo anterior con la humedad , pero para ello tengo que reparar antes un medidor de precision que compre en Lidl hace años que mide la humedad tambien con 0.1 en precision.

 Otra opcion es comprar un DHT22, que en teoria es 10 veces mas preciso, aunque 4 veces mas caro que un DHT11.



« Última modificación: 08 de Febrero de 2012, 22:59:46 por cabritillo »

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #10 en: 09 de Febrero de 2012, 18:04:37 »
Hola buenas noches gracias por el aporte, pues no lo puse debido a que como hice la libreria en 1 tarde destripando el datasheet y  ejemplos de por ahi jijijijiji, bueno pues lo digo ahora, que mas vale tarde que nunca, la libreria esta hecha con CCS, y sirve para el DHT11 y el DHT22 haciendo alguna modificación.

Yo personalmente programo en PIC C, porque mis conocimientos y el gran manejo de dicho lenguaje me permiten hacer lo que quiera y me gusta mas que el basic pero bueno, para gustos colores, ya que en cuanto a capacidades, tanto en un idioma u otro se puede hacer lo mismo todo depende del programador.

Lo que propongo que se podria hacer si no lo esta ya es lo siguiente algun sub-foro en donde pues se coloquen librerias de distintos elementos en los idiomas mas utilizados, ASM, BASIC y C, pero bueno eso depende de los moderadores y si no es posible pues invito como ya dije si alguien tiene alguna mejora o lo que sea como aporte pues lo ponga y lo comparta para el resto ya que en la variedad esta el gusto ASIASSSS Y SALUDOS A TODOS  :D :D :D :D

Desconectado heromorph

  • PIC10
  • *
  • Mensajes: 1
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #11 en: 18 de Febrero de 2012, 23:14:30 »
Que tal, felicidades por el proyecto!! , me parece que he encontrado la razón por la que peteorito tiene el siguiente problema

Creo que no se ha   quemada  pero no me funciona bien el codigo.. solo recibo el primer dato de la humedad..  :(

Inicialmente pensé que pudo haber sido un error tuyo en el código, pero al previsualizar la sugerencia que tengo para corregir el problema me di cuenta que el problema se debe al editor mismo de los posts, explico:

el error está en

for (i=0; i<5; i++)
  {
    dht_dat = leer_dht_dat(); // capturando datos
  }


este código no funciona pues dht_dat apunta al primer byte del arreglo de 5 bytes que creaste, pero como no hay índice que mueva el apuntador, lo que hace es sobreescribir todos los datos en el mismo byte.

Sin embargo ahora se que tu pusiste el código correctamente, pero cuando el editor del post encontró la cadena [ i ] (lo pongo con espacios para que no desaparezca), pensó que querías comenzar a escribir en itálicas, si te fijas, a partir de ese momento el código que posteaste está en itálicas, es por ello que el editor elimina [ i ] que es el índice que permite que se llenen los 5 bytes del arreglo

La solución sería corregir la línea poniendo:

  dht_dat[ i ] = leer_dht_dat();

No creo que haya problema por compilarlo así con los espacios adentro del corchete, pero en todo caso eliminarlos antes de compilar.

Soy nuevo en este foro pero me imagino que este "malentendido" con el editor de posts debe causar una gran cantidad de errores en código cuando se pega el código en el post, pues [ i ] es una cadena de lo más común en cualquier programa, la sugerencia sería adjuntar el archivo del código para evitar este tipo de alteraciones.

Yo acabo de recibir mi DHT11 y aún no he probado el código, voy a poner manos a la obra y probaré la corrección propuesta, en cuanto lo tenga funcionando regresaré para compartir mis resultados con ustedes

Nuevamente muchas felicidades por el proyecto!!

Desconectado zerovlc

  • PIC10
  • *
  • Mensajes: 28
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #12 en: 01 de Marzo de 2012, 19:28:38 »
ostras vaya tienes razon no me di cuenta ves pues ahora adjunto la libreria gracias por el aporte, ahora subo la libreria

GRACIAS DE NUEVO A TODOS

Desconectado PicTrance

  • PIC10
  • *
  • Mensajes: 6
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #13 en: 02 de Marzo de 2012, 17:41:44 »
Hola zerovlc

antes que nada: gracias por la librería :)
y te comento que he modificado tu libreria para el DHT22(RHT03)

y esta es la libreria que he hecho basando me en la tuya :oops:
Código: [Seleccionar]
#define dht22 PIN_A2
#bit dht_io = 0xf92.2
byte dht22_dat[5];

byte leer_datos_dht();

Void dht_init (void){
   dht_io=0;
   delay_ms(1);
   output_high(dht22);
}

byte leer_datos_dht(){
   byte i = 0;
   byte result=0;
   for (i=0; i< 8; i++) {
      //We enter this during the first start bit (low for 50uS) of the byte
      //Next: wait until pin goes high
      while(input(dht22)==0);
      delay_us(30);
      if (input(dht22)==1){//Was: if(PINC & _BV(dht_PIN))
         result |=(1<<(7-i));
      }
      while (input(dht22)==1);
      //Was: while((PINC & _BV(dht_PIN)));
   }//end of "for.."
   
   return result;
}

Void leer_dht22 (float &dhthum,float &dthtemp){
   //byte GlobalErr=0;
   byte dht22_in, i, dht22_checksum;
   int16 temperatura, humedad;
   float temp,hum;
   
   dht_io=0; // configurar el pin como salida
   output_high(dht22);
   delay_us(20);
   output_low(dht22);
   delay_ms(18);
   
   output_high(dht22);
   delay_us(22);
   dht_io=1;// configurar el pin como entrada
   delay_us(5);
   dht22_in=input(dht22);
   
   if(dht22_in) {
      //GlobalErr=1;
      printf("\r\ndht condicion 1 de inicio no encontrada");
      return;
   }
   
   delay_us(80);
   dht22_in=input(dht22);
   
   if(!dht22_in){
      //GlobalErr=2;
      printf("\r\ndht condicion 2 de inicio no encontrada");
      return;
   }
   
   delay_us(80);
   
   for (i=0; i<5; i++){
      dht22_dat[ i ] = leer_datos_dht(); // capturando datos
   }
   
   dht_io=0;
   delay_us(10);
   output_high(dht22);
   
   dht22_checksum= dht22_dat[0]+dht22_dat[1]+dht22_dat[2]+dht22_dat[3];
   
   if(dht22_dat[4]!=dht22_checksum){
      //GlobalErr=3;
      printf("\r\nDHT checksum error");
   }
   
   humedad = make16(dht22_dat[0],dht22_dat[1]);
   temperatura = make16(dht22_dat[2],dht22_dat[3]);
   
   hum = humedad;
   temp = temperatura;
   
   dhthum = (hum)/10;
   dthtemp = (temp)/10;
}

y este es un ejemplo de como usarla:

Código: [Seleccionar]
#include <18f4550.h>           //PIC utilizado
#device adc=10
//#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG
//#use delay(clock=20M)

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48M)


//Pal bootloader
#build (reset=0x1000,interrupt=0x1008)
#org 0x0000,0x0FFF{}

#use i2c(Master,slow,sda=PIN_A4,scl=PIN_A5)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

//#include "dht22.c"
#include "dht.c"
#include  "sht21.c"

//#include <LCD20X4.c>


void main(){
   int16 lux;
   float dhthum, dthtemp,temp,humid;
   setup_adc_ports(AN0|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   //EXT_INT_EDGE(H_TO_L);
   
   //lcd_init();
   
   //lcd_putc("\fSensor T-H\nDHT22 RHT03");
   printf ("\f\r\nSensor de temperatura y humedad:\r\nDHT22-RHT03");
   delay_ms(500);
   
   //printf(lcd_putc,"\fHola-Saludos\nEnviame un dato");
   dht_init();
   sht21_init();
   delay_ms(300);
   //lcd_putc("\f");
while(true){
   set_adc_channel(0);
   delay_ms(1);
   lux=read_adc();
   printf("\r\nAdc =: %lu ",lux);
   
   delay_ms(10);
   //leer_dht();
   leer_dht22(dhthum, dthtemp);
   sht21_both(temp,humid);
   delay_ms(10);

   printf("\r\nDHT22 Humedad = %f %%",dhthum);
   delay_ms(1);
   
   printf("\r\nDHT22 Temperatura = %f %cC", dthtemp,223);
   delay_ms(1);
   
   printf("\r\nSHT21 RH = %f %%",humid);
   delay_ms(1);
   
   printf("\r\nSHT21 T = %f %cC", temp,223);
   delay_ms(1);
   
   printf("\r\n...terminado..\n");
   
   delay_ms(2000);
 }
}

por el momento me sirve para valores psositivos de temperatura y voy a hacer pruebas con valores
negativos en temperatura (claro hay que agregar mas cosas a la librería ;-))

bueno ese es mi aporte y gracias de nuevo, me evitaste empezar desde cero :)

Saludos!

Nota: En cuanto pueda subo vídeos y el código mejorado para el DHT22

Desconectado PicTrance

  • PIC10
  • *
  • Mensajes: 6
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #14 en: 02 de Marzo de 2012, 23:07:16 »
Hola otra vez!

aquí de nuevo con 3 videos de este sensor ya funcionando  ;-)




ahora no sé es sí será bueno iniciar un nuevo tema con lo que ya hice para ponerlo allí.

Saludos!
« Última modificación: 03 de Marzo de 2012, 00:14:53 por PicTrance »