TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: zerovlc en 09 de Agosto de 2011, 10:04:53

Título: PIC16F84A y sensor de temperatura DHT11
Publicado por: zerovlc 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
 
 
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: peteorito 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!
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: MARKUS 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!
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: zerovlc 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
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: peteorito 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.

(http://blog.wikifotos.org/wp-content/uploads/2011/08/dht11_pins.jpg)
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: zerovlc 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
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: peteorito 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..  :(
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: zerovlc 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
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: cabritillo 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 ;)









 





 
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: cabritillo 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.



Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: zerovlc 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
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: heromorph 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!!
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: zerovlc 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
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: PicTrance 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
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: PicTrance 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!
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: peteorito en 07 de Marzo de 2012, 20:19:12
Ahora si!! :)
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: eloysn en 23 de Mayo de 2012, 06:22:18
Bueno,en primer lugar gracias por el aporte ,pero tengo una duda si el sensor cuando envia un bit sea un 1 o un 0  siempre pone la linea en alto ,solo que lo hace variando el tiempo que esta en alto (26-28microseg para un 0 y 70microseg para un 1) mi duda es como sabemos cuando es un cero y cuando un uno,seguramente sea una tonteria pero leo el codigo y no logro entenderlo.
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: renanparanista en 20 de Julio de 2012, 12:16:41
Muito obrigado senhores, esta biblioteca salvou minha nota na disciplina de Automação na Faculdade.

Foi o único lugar na Internet onde achei essa biblioteca. vou postar o código q eu usei com essa biblioteca, conta com um display LCD, e um outro sensor de temperatura, um LM35, usei isso para fazer uma camara de refrigeração usando uma célula Peltier, num PIC 16f877A.

#include <16f877A.h>
#device adc=10
#use delay(clock=20000000, RESTART_WDT)
#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, parity=N, stop=1, bits=8)
#org 0x1F00, 0x1FFF void loader16F877(void) {}
#include <mod_lcd.c>
#include <dht11.c>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#byte porte = 0x09
#bit Incrementa = porta.5
#bit Decrementa = porta.4
#bit PeltierEsq = portc.2
#bit PeltierEsf = portc.1
#bit rele1  = portb.1
#bit rele2  = portb.2

int x = 0;
char received = 0x00,  dados[7];
long int SetTemp=30, TempSensor=0, TempVentoinha=0, limpatela=0;
long int RSetTemp=0, RTempVentoinha=0, msgUmidade=0, msgTemperatura = 0;
static boolean aux1  = true, aux2 = true, auxBotao1 = true, auxBotao2 = true;
static boolean manutencao = false, manutencao1 = false;

void Transmissao()
{
   dados[0] = 'f';
   dados[1] = RSetTemp;
   dados[2] = RTempVentoinha;
   dados[3] = dht_dat[2];
   dados[4] = dht_dat[0];
   dados[5] = msgUmidade;
   dados[6] = msgTemperatura;
   
   for(x=0 ; x < 7;x++)
   {
      putchar(dados
      delay_ms(3);
   }
}

#int_rda
void serial_interrupt()
{
   // Recebe informações do software (received)
   disable_interrupts(int_rda);
   received = getc();
   aux1 = true;
   aux2 = true;
}

void main()
{

   set_tris_a(0b11111111);
   porta=0x00;
   set_tris_b(0b11111001);
   portb=0x00;
 /*  set_tris_c(0b00000000);
   set_tris_d(0b11110011);
   set_tris_e(0b00000111);
   
   
   portc=0x00;
   portd=0x00;
   porte=0x00;
*/
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);

   setup_adc_ports (RA0_RA1_RA3_analog);//Configura Vdd e Vss como Vref
   setup_vref(FALSE);
   setup_adc (adc_clock_div_32);

   output_low(pin_c4);
   output_low(pin_c5);

   enable_interrupts(GLOBAL);
   
   lcd_ini();
   lcd_escreve('\f');
 
   while(true)
   {
      enable_interrupts(int_rda);
           
      if(limpatela != TempSensor)
      {
        lcd_escreve('\f');
        limpatela = TempSensor;
      }
     

      if (( manutencao == false) &&(manutencao1 == false))
     
      {
         lcd_pos_xy( 2, 1);
         lcd_escreve("TD");
         lcd_pos_xy( 2, 2);
         printf (lcd_escreve,"%ld",RSetTemp );
         lcd_pos_xy( 6, 1);
         lcd_escreve("TF");
         lcd_pos_xy( 6, 2);
         printf (lcd_escreve,"%d", dht_dat[2] );
         lcd_pos_xy( 10, 1);
         lcd_escreve("TV");
         lcd_pos_xy( 10, 2);
         printf (lcd_escreve,"%ld",RTempVentoinha );   
         lcd_pos_xy( 14, 1);
         lcd_escreve("UM");
         lcd_pos_xy( 14, 2);
         printf (lcd_escreve,"%d", dht_dat[0] );
         lcd_pos_xy( 16, 2);
         lcd_escreve("  ");
         delay_ms(100);
      }
     
      Transmissao();     
       
      if(!Incrementa)
      {
         auxBotao1=true;
      } 
      if(!Decrementa)
      {     
         auxBotao2=true;
      }
     
      // Botão incrementa
      if((!Incrementa)||(received == 0x02))
      {
         if (aux1 || auxBotao1)
         {
            // se incrementa pelo software nao usa delay
           
            if (SetTemp<=1020 && aux1)
            {
               SetTemp = SetTemp + 2;
               lcd_escreve('\f');
            }           
            else if (SetTemp<=1020 && auxBotao1)
            {
               SetTemp = SetTemp + 2;
               delay_ms(130);
               lcd_escreve('\f');
            }
           
            aux1 = false;
            auxBotao1 = false;
         }
      }
   
      // Botão decrementa
      if((!Decrementa)||(received == 0x01))
      {
         if (aux2 || auxBotao2)
         {
            // se decrementa pelo software nao usa delay           
            if (SetTemp>=2 && aux2)
            {
               SetTemp = SetTemp - 2;
               lcd_escreve('\f');
            }
            else  if (SetTemp>=2 && auxBotao2)
            {
               SetTemp = SetTemp - 2;
               delay_ms(130);
               lcd_escreve('\f');
            }
                     
            aux2 = false;
            auxBotao2 = false;
         }
      }
               
      delay_ms(10);
      iniciar();
      leer_dht();
      TempSensor =((1024* dht_dat[2])/500);
     
      set_adc_channel(1);
      delay_ms(10);
      TempVentoinha = read_adc();
         
     
     // RTempSensor       =(500*TempSensor)/1024;
      RTempVentoinha    =(500*TempVentoinha)/1024;
      RSetTemp          =(500*SetTemp)/1024;
     
   
      if(TempVentoinha > 80)
      {
         rele1 = 1;
      }
     
      if(TempVentoinha < 40)
      {                   
          rele1=0;
      }                     
         
      if((TempSensor)  > SetTemp)
      {
         PeltierEsf=1;
         PeltierEsq=0;
         rele2 = 1;
      }

      if((TempSensor)  < SetTemp)
      {                   
         PeltierEsq=1;
         PeltierEsf=0;
         rele2=0;
      }
     
      if ((dht_dat[0]) > 92)
      {
         manutencao = true;
         
         rele1=0;
         rele2=0;
         lcd_escreve('\f');
         lcd_pos_xy( 1, 1);
         lcd_escreve("  Umidade alta");
         lcd_pos_xy( 1, 2);
         lcd_escreve("parar p/ limpeza");
         msgUmidade = 1; // msg = 1 vai para o software para mostrar a msg
         delay_ms(500);
      }
      else
      {
         manutencao = false;
         msgUmidade = 0;
      }
      if (TempVentoinha >= 110)
      {       
         manutencao1 = true;
         
         rele1=1;
         rele2=0;
         lcd_escreve('\f');
         lcd_pos_xy( 1, 1);
         lcd_escreve("Temp. muito alta");
         lcd_pos_xy( 1, 2);
         lcd_escreve("PeltierDesligado");
         msgTemperatura = 1; // msg = 2 vai para o software para mostrar a msg
         delay_ms(500);
         
      }
      else
      {
         manutencao1 = false;
         msgTemperatura = 0;
      }
     
   }
}
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: fiolin en 28 de Noviembre de 2012, 07:12:37
En el código publicado por pictrance hay una parte que no encuentro que es:
#include "dht.c"
#include  "sht21.c"

Desde ya les digo que está muy bueno el trabajo que han hecho los amigos.
gracias
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: PicTrance en 05 de Diciembre de 2012, 19:29:17
Hola fiolin

te comento que al "dht.c" es la misma libredia "dht22.c" renombrada y modificada para otro pin del pic
ya que tengo 2 sensores dht22, la libreria "SHT21.c" es un sensor de temperatura y humedad
I2C de la marca sensirion, ese driver lo compartí en otro foro (neoteo) y en el foro oficial de CCS

Saludos!!!
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: mirasu en 09 de Abril de 2013, 10:54:05
Hola zerovlc
Ante todo gracias por tu libreria, me a sido muy util y me a permitido hacer un programita sin conocimientos de C y casi que ni de basic, yo desde que quitaron el 10, 20 y 30 delante de las lineas en basic.... que ya no e sabido hacer nada :-D
Te queria preguntar si podrias ver el programa y ver si tengo algun error. el programa funciona y hace lo que necesito.
otra cosa que me preocupa es que cambie el pin donde va el sensor,
 #define dht11 PIN_B6 // cambiado el pin del 0 al 6
#bit dht_io = 0x86.0 // no lo he cambiado, pero creo que

Edito. Añado el codigo y explico que hace.
tengo 6 led en linea, el 1º se enciende para marcar que funciona, del 2º al 5º se encienden cuando llega la humedad a 50,60,70 y 80% relativamente y 6º se enciende cuando llega a 85% este es de color rojo y al encenderse activa un ventilador.
solo hay una entrada que es el DHT11.

 

Código: [Seleccionar]
#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)



//Declaracion de variables globales

#define LedOn pin_b0 //  led on
#define led2 pin_b1 // Led mas del 50% humedad
#define led3 pin_b2 // Led mas del 60% humedad
#define led4 pin_b3 // Led mas del 70% humedad
#define led5 pin_b4 // Led mas del 80% humedad
#define LedFin pin_a3// Led mas del 85% humedad-activa el calor

#define Retardo delay_ms(1000)//Nombra a delay_ms() como Retardo


//Programa principal
void main(){

//Configuracion de puertos E/S
SET_TRIS_A(0x00);//Configura el puerto B: 0=Salida; 1=Entrada
output_a(0x00); //Limpia el registro del puerto
//SET_TRIS_b(0x00);//Configura el puerto B: 0=Salida; 1=Entrada
//output_b(0x00); //Limpia el registro del puerto
  do
{
delay_ms(100);
 iniciar();
 delay_ms(100);
leer_dht();

output_high(LedOn); // enciende el led on cuando se inicializa

if (dht_dat[0]>50)
{
output_high(led2);//Pone en alto a led
retardo;//Demora
   if (dht_dat[0]>60)
   {
   output_high(led3); //Pone en alto a led
   retardo;//Demora
   if (dht_dat[0]>70)
      {
      output_high(led4);//Pone en alto a led
      retardo;//Demora
      if (dht_dat[0]>80)
         //Estructura Programa principal
         {
         output_high(led5);//Pone en alto a led
         retardo;//Demora
         if (dht_dat[0]>85)
            {
            //Estructura Programa principal
            output_high(LedFin);//Pone en alto a led
            retardo;//Demora
            delay_ms(60000);
            }
            else
            {
            output_low(LedFin);//Pone en bajo a led
            retardo;//Demora
            }
         }
         else{
         output_low(led5);//Pone en bajo a led
         retardo;//Demora
         }
      }
      else{
      output_low(led4);//Pone en bajo a led
      retardo;//Demora
      }
   }
   else{
   output_low(led3); //Pone en bajo a led
   retardo;//Demora
   }
}
else{
output_low(led2);//Pone en bajo a led
retardo;//Demora
}

output_low(LedOn);
retardo;//Demora


//goto inicio;//Regresa a la etiqueta inicio
}while(true);
}

Gracias por tu libreria otra vez

Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: sergio_silva en 30 de Abril de 2013, 15:32:33
Hola zerovlc,

porquê que somas 2 à temperatura lida e 5 à humidade? É que nas especificações aparece que o erro pode ser +/- 2ºC e +/- 5%RH, então eu acho incorrecto corrigir para o valor máximo.


[ING]
 why do you add 2 to the read temperature value and 5 to the humidity value? The specifications said that the accuracy is +/- 2ºC e +/- 5%RH, so i think that is wrong to correct to the maximum value.


Saludos!
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: Evonkc en 22 de Junio de 2013, 00:52:02
Disculpen es un poco mas que tarde para consultar,

estimados necesito si alguien amable me puede explicar este codigo, que es lo que hace, tengo algunas ideas vagas pero aun asi hay cosas que no entiendo. pues soy nuevo en esto de la programacion y mas trabajo con basic, de antemano gracias por su ayuda.


Código: [Seleccionar]
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;
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: Evonkc en 22 de Junio de 2013, 00:57:02
Disculpen es un poco mas que tarde para consultar,

estimados necesito si alguien amable me puede explicar estas dos lineas de codigo que adjunto, que es lo que hace, tengo algunas ideas de la mayoría del original presente en este post, pero aun así hay cosas que no entiendo, (que son las adjuntas). pues soy nuevo en esto de la programación y mas aun si trabajo con basic, de antemano gracias por su ayuda saludos a todos los que lo lean


Código: [Seleccionar]
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; 

Código: [Seleccionar]
   for (i=0; i<5; i++){
      dht22_dat[ i ] = leer_datos_dht(); // capturando datos
   }
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: Thulsa Doom en 23 de Junio de 2013, 07:12:13
Muchas gracias por el aporte
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: TIBURONMAUI en 21 de Octubre de 2013, 09:39:43
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


hola  saludos  soy  nuevo  en  esto  pero  gracias  a ustedes   ya  e podido   aprender algo  ..  primero fue manejar un lcd 16x2 ni dormir.. pero al fin pude y ahora adaptando la librería de el ejemplo para el dht 22 para el pic 16f88 .. pero   tenia sus mañas  como  para  que no cualquiera  las pueda  llegar  y  usar  los  comentarios que no son ...   y  ahora  ....   quería  preguntar   la  dth22.c también  tiene  mañas  verdad   porque en el ejemplo  sale asi (//#include dht22.c)..   y  mas  abajo  (#include dht.c)  osea la  primera  no figura  porque  es  solo  como  comentario   y  la  dht.c   esa  es  la  buena  pero no esta no...  la falta  de sueño   me  tiene  loco  y  peor  no puedo  dormir  cada  vez  estoy  mas  cerca  ....   me  pregunto   la librería subida  para  el  publico   tiene  mañas  verdad  porque estoy  con  un  lcd 16x2 y aparecen los  primeros  mensajes pero de ai a mas nada y  estuve leyendo la hoja de datos del  dht22 y dice que al energizar no se le debe mandar ningún pulso,, y medí en la protoboad el pin a2 del micro y lo primero que hace es eso,, osea  hay  algo.  ademas después sigue con pulsos,   es la librería .  pero   se  que  son  detalles   pequeños  creo.. pero  con  falta  de  sueño me cuesta  mas  pensar   jajaja....   en  realidad  quiero  un  termohigrometro para el control de tempera,humedad de una incubadora ..  y voy por  partes como  no  se  de  esto ya tengo  la librería probada del lcd y ahora voy   por el sensor pero me  cuesta  ... jaja...   gracias   si  esqueme  pudiera dar  pistas  para  facilitarme  un  poco  la búsqueda solo  si quiere   ....  gracias   y muchas  bendiciones,  su  trabajo  me a servido mucho  ...  ^_^





Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: PicTrance en 25 de Octubre de 2013, 21:43:26

hola  saludos  soy  nuevo  en  esto  pero  gracias  a ustedes   ya  e podido   aprender algo  ..  primero fue manejar un lcd 16x2 ni dormir.. pero al fin pude y ahora adaptando la librería de el ejemplo para el dht 22 para el pic 16f88 .. pero   tenia sus mañas  como  para  que no cualquiera  las pueda  llegar  y  usar  los  comentarios que no son ...   y  ahora  ....   quería  preguntar   la  dth22.c también  tiene  mañas  verdad   porque en el ejemplo  sale asi (//#include dht22.c)..   y  mas  abajo  (#include dht.c)  osea la  primera  no figura  porque  es  solo  como  comentario   y  la  dht.c   esa  es  la  buena  pero no esta no...  la falta  de sueño   me  tiene  loco  y  peor  no puedo  dormir  cada  vez  estoy  mas  cerca  ....   me  pregunto   la librería subida  para  el  publico   tiene  mañas  verdad  porque estoy  con  un  lcd 16x2 y aparecen los  primeros  mensajes pero de ai a mas nada y  estuve leyendo la hoja de datos del  dht22 y dice que al energizar no se le debe mandar ningún pulso,, y medí en la protoboad el pin a2 del micro y lo primero que hace es eso,, osea  hay  algo.  ademas después sigue con pulsos,   es la librería .  pero   se  que  son  detalles   pequeños  creo.. pero  con  falta  de  sueño me cuesta  mas  pensar   jajaja....   en  realidad  quiero  un  termohigrometro para el control de tempera,humedad de una incubadora ..  y voy por  partes como  no  se  de  esto ya tengo  la librería probada del lcd y ahora voy   por el sensor pero me  cuesta  ... jaja...   gracias   si  esqueme  pudiera dar  pistas  para  facilitarme  un  poco  la búsqueda solo  si quiere   ....  gracias   y muchas  bendiciones,  su  trabajo  me a servido mucho  ...  ^_^

Hola, el código no tiene mañas simplemente al publicarlo no me di cuenta que el (//#include dht22.c) no lo des-comente, aparte de que a la libreria original la empece a modificar sin cambiarle el nombre por eso el de dht.c y el dht22.c ya que la probé para 2 sensores que tengo al final ya la nombre "dht22.c"  y esto mismo lo puse en los comentarios anteriores, ¿los leíste? y este ejemplo que puse no usa LCD todo lo envía por serial.

Saludos!!

pictrance.blogspot.mx/2013/10/driver-para-el-dht22-rht22-en-ccs.html (http://pictrance.blogspot.mx/2013/10/driver-para-el-dht22-rht22-en-ccs.html)
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: IngJulianVelasco en 13 de Noviembre de 2013, 12:08:07
HOLA A TODOS DE ANTAMANO GRACIAS POR EL TRABAJO REALIZADO

muchachos ya guarde la libreria y copie el codigo pero cuando ejecuto el programa tengo un problema cuando trata de compilar la libreria
sale un error en el (delay) dice que (Undefined identifier)

GRACIAS POR SU AYUDA
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: TIBURONMAUI en 13 de Noviembre de 2013, 13:08:34
HOLA A TODOS DE ANTAMANO GRACIAS POR EL TRABAJO REALIZADO

muchachos ya guarde la libreria y copie el codigo pero cuando ejecuto el programa tengo un problema cuando trata de compilar la libreria
sale un error en el (delay) dice que (Undefined identifier)

GRACIAS POR SU AYUDA


hola eso es que no tienes definido ese delay o esta bien para lo que lo quieres. pero con otra modificación echa le cambio a ese error puede bien, el error estar justo en el relay que te dice, o en otro lado ..  me paso muchas veces ...   y  también prueba si estas usando el compilador picc ,pic c compiler, hay veces que te da error, y puedes modificar todo y abrir y cerrar el programa, pero va a seguir igual ...   yo estuve todo un día así. y fue que tuve que reiniciar el notebook, y así funciono las modificaciones de lo que estaba haciendo, prueba con eso ...  y  lo otro para poder ayudarte mejor pega tu librería y donde te da error . te puedo ayudar por que de errores para que decir ..  pero yo tengo  funcionando mi termostato gracias a este foro y los muchachos y su información muy buena......   después de mucho trabajo ...   dios te ayude ....   ^_^
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: IngJulianVelasco en 16 de Noviembre de 2013, 15:52:23
HOLA A TODOS DE ANTAMANO GRACIAS POR EL TRABAJO REALIZADO

muchachos ya guarde la libreria y copie el codigo pero cuando ejecuto el programa tengo un problema cuando trata de compilar la libreria
sale un error en el (delay) dice que (Undefined identifier)

GRACIAS POR SU AYUDA


hola eso es que no tienes definido ese delay o esta bien para lo que lo quieres. pero con otra modificación echa le cambio a ese error puede bien, el error estar justo en el relay que te dice, o en otro lado ..  me paso muchas veces ...   y  también prueba si estas usando el compilador picc ,pic c compiler, hay veces que te da error, y puedes modificar todo y abrir y cerrar el programa, pero va a seguir igual ...   yo estuve todo un día así. y fue que tuve que reiniciar el notebook, y así funciono las modificaciones de lo que estaba haciendo, prueba con eso ...  y  lo otro para poder ayudarte mejor pega tu librería y donde te da error . te puedo ayudar por que de errores para que decir ..  pero yo tengo  funcionando mi termostato gracias a este foro y los muchachos y su información muy buena......   después de mucho trabajo ...   dios te ayude ....   ^_^

Mira llevo vario tiempo con eso y no he podido y necesito urg hacer funcionar ese sensor, mira cuando corro el programa me sale un error en todos los delay y estoy trabajando con CCS ya reinicie el pc varias veces y no logro hacerlo funcionar, pregunta ¿ no se puede colocar todo el codigo en un solo archivo, es decir incluir la libreria en el mismo codigo??
gracias por la info q me puedas brindar
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: TIBURONMAUI en 16 de Noviembre de 2013, 16:00:47
HOLA A TODOS DE ANTAMANO GRACIAS POR EL TRABAJO REALIZADO

muchachos ya guarde la libreria y copie el codigo pero cuando ejecuto el programa tengo un problema cuando trata de compilar la libreria
sale un error en el (delay) dice que (Undefined identifier)

GRACIAS POR SU AYUDA


hola eso es que no tienes definido ese delay o esta bien para lo que lo quieres. pero con otra modificación echa le cambio a ese error puede bien, el error estar justo en el relay que te dice, o en otro lado ..  me paso muchas veces ...   y  también prueba si estas usando el compilador picc ,pic c compiler, hay veces que te da error, y puedes modificar todo y abrir y cerrar el programa, pero va a seguir igual ...   yo estuve todo un día así. y fue que tuve que reiniciar el notebook, y así funciono las modificaciones de lo que estaba haciendo, prueba con eso ...  y  lo otro para poder ayudarte mejor pega tu librería y donde te da error . te puedo ayudar por que de errores para que decir ..  pero yo tengo  funcionando mi termostato gracias a este foro y los muchachos y su información muy buena......   después de mucho trabajo ...   dios te ayude ....   ^_^

Mira llevo vario tiempo con eso y no he podido y necesito urg hacer funcionar ese sensor, mira cuando corro el programa me sale un error en todos los delay y estoy trabajando con CCS ya reinicie el pc varias veces y no logro hacerlo funcionar, pregunta ¿ no se puede colocar todo el codigo en un solo archivo, es decir incluir la libreria en el mismo codigo??
gracias por la info q me puedas brindar
 



puedes pero te complicaría aun mas hallar los errores ....   disculpa pero con que pic trabajas, y en que quieres mostrar los datos     ...   en el pc o en otro medio ?    y con cual sensor el dht22 verdad ...   dímelo y con un poco de tiempo te podría ayudar en  algo ... 
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: IngJulianVelasco en 16 de Noviembre de 2013, 18:10:21
DESPUES DE TANTO INTENTAR PUDE HACERLO  FUNCIONAR GRACIAS POR EL CODIGO Y LA LIBRERIA ME HAN SALVADO LA VIDA
LO QUE HICE FUE INTEGRAR EL CODIGO Y A LIBRERIA EN UN SOLO ARCHIVO YA QUE POR SEPARADO NO ME COMPILABA
y tener cuidado con esta linea

dht_dat = leer_dht_dat();

ya que al descargar el codigo no sale  el ( [ i ] )
por ultimo vi los datos por el puerto serial de arduino,
aparte de ello tengo un video colgado en youtube con la configuracion del cable rs232 para quienes no lo han trabajado.
denuevo gracias
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: TIBURONMAUI en 16 de Noviembre de 2013, 19:32:30
DESPUES DE TANTO INTENTAR PUDE HACERLO  FUNCIONAR GRACIAS POR EL CODIGO Y LA LIBRERIA ME HAN SALVADO LA VIDA
LO QUE HICE FUE INTEGRAR EL CODIGO Y A LIBRERIA EN UN SOLO ARCHIVO YA QUE POR SEPARADO NO ME COMPILABA
y tener cuidado con esta linea

dht_dat = leer_dht_dat();

ya que al descargar el codigo no sale  el ( [ i ] )
por ultimo vi los datos por el puerto serial de arduino,
aparte de ello tengo un video colgado en youtube con la configuracion del cable rs232 para quienes no lo han trabajado.
denuevo gracias


QUE  BUENO   QUE DIOS TE SIGA AYUDANDO   ....    QUE  ALEGRÍA SABER  QUE LO LOGRASTE   .....   YO DE IGUAL MANERA COMO TU AGRADEZCO A TODOS POR EL TRABAJO ECHO ...  SALUDOS ...  Y BENDICIONES ...   ^_^
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: nando_azul en 02 de Diciembre de 2013, 20:08:50
hola! como les va?
pues nada aquí pidiendo ayuda......... al utilizar la librería DHT11.h y compilarlo en pic c compiler me da todo bien pero al momento de echarlo a andar me marca cero grados.......mi circuito muestra la temperatura en un display de 4 dígitos de 7 segmentos(los datos están multiplxeados). Probando mi circuito con un sensor de temperatura lm35 me marca bien la temperatura......les dejo mi código del sensor DHT11 y las imágenes tanto del lm35 como del dht11esperando me puedan ayudar haber que tengo mal.....espero me puedan ayudar....... :) y de antemano gracias!!!!


#include <16F877A.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOWRT,NOBROWNOUT   //Fuses configuración
#use delay(clock=4000000)                          //Frecuencia de oscilador
#include <DHT11.h>                             //Librería para uso de sensor DHT11
#use fast_io(c)                                   

void main() {


set_tris_c(0x00);                //Puerto C como salida             
unsigned int u, d;               //Variables unidad y decena
//Numeros del 0 al 9
int Numeros[10] = {0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01101111};
/******************************************************************************/
   
   while(true){
   
   
   iniciar_dht();                 //Inicialización del DHT11
   leer_dht();                   

   
   u=(int)dht_dat[3] % 10; 
   d=(int)dht_dat[3] / 10;       
   

   //Display de la decena
   output_low(pin_c0);       //Enciende display 1
   output_high(pin_c1);        //Apaga display 2
   output_high(pin_c2);        //Apaga display 3
   output_high(pin_c3);        //Apaga display 4
   output_b(Numeros[d]);      //Envia dato de unidad
   delay_ms(5);
   
   //Display de la unidad
   output_low(pin_c1);       //Enciende display 2
   output_high(pin_c0);        //Apaga display 1
   output_high(pin_c2);        //Apaga display 3
   output_high(pin_c3);        //Apaga display 4
   output_b(Numeros);      //Envia dato de decena
   delay_ms(5);
   
   //Display del signo de centigrados
   output_low(pin_c2);       //Enciende display 3
   output_high(pin_c0);        //Apaga display 1
   output_high(pin_c1);        //Apaga display 2
   output_high(pin_c3);        //Apaga display 4
   output_b(0b11100011);      //Envia signo de centigrados
   delay_ms(5);
   
   //Display la letra C
   output_low(pin_c3);       //Enciende display 4
   output_high(pin_c0);        //Apaga display 1
   output_high(pin_c1);        //Apaga display 2
   output_high(pin_c2);        //Apaga display 3
   output_b(0b00111001);      //Envia letra C
   delay_ms(5);
   
//Apagar todos los display
   output_high(pin_c3);        //Apaga display 4
   output_high(pin_c0);        //Apaga display 1
   output_high(pin_c1);        //Apaga display 2
   output_high(pin_c2);        //Apaga display 3
   delay_ms(2);
   
     

//Temperatura estable
   if(dht_dat[3]>=0&&dht_dat[3]<=20){
   output_low(pin_d4);}
//Temperatura en los limites   
   if(dht_dat[3]>20&&dht_dat[3]<=50){
   output_high(pin_d4);}
   
   }
   
}
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: nando_azul en 03 de Diciembre de 2013, 02:51:03
amigos!!
ya resolví mi duda!!
resulta que mandaba a llamar el dato 4 que en este caso son los decimales de la temperatura por eso me daba 0 grados  :oops:
en lugar de "dht_dat[3]" es "dht_dat[2]"
(adjunto foto funcionando al 100%) Gracias por la libreria!!!

hola! como les va?
pues nada aquí pidiendo ayuda......... al utilizar la librería DHT11.h y compilarlo en pic c compiler me da todo bien pero al momento de echarlo a andar me marca cero grados.......mi circuito muestra la temperatura en un display de 4 dígitos de 7 segmentos(los datos están multiplxeados). Probando mi circuito con un sensor de temperatura lm35 me marca bien la temperatura......les dejo mi código del sensor DHT11 y las imágenes tanto del lm35 como del dht11esperando me puedan ayudar haber que tengo mal.....espero me puedan ayudar....... :) y de antemano gracias!!!!


#include <16F877A.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOWRT,NOBROWNOUT   //Fuses configuración
#use delay(clock=4000000)                          //Frecuencia de oscilador
#include <DHT11.h>                             //Librería para uso de sensor DHT11
#use fast_io(c)                                   

void main() {


set_tris_c(0x00);                //Puerto C como salida             
unsigned int u, d;               //Variables unidad y decena
//Numeros del 0 al 9
int Numeros[10] = {0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01101111};
/******************************************************************************/
   
   while(true){
   
   
   iniciar_dht();                 //Inicialización del DHT11
   leer_dht();                   

   
   u=(int)dht_dat[3] % 10; 
   d=(int)dht_dat[3] / 10;       
   

   //Display de la decena
   output_low(pin_c0);       //Enciende display 1
   output_high(pin_c1);        //Apaga display 2
   output_high(pin_c2);        //Apaga display 3
   output_high(pin_c3);        //Apaga display 4
   output_b(Numeros[d]);      //Envia dato de unidad
   delay_ms(5);
   
   //Display de la unidad
   output_low(pin_c1);       //Enciende display 2
   output_high(pin_c0);        //Apaga display 1
   output_high(pin_c2);        //Apaga display 3
   output_high(pin_c3);        //Apaga display 4
   output_b(Numeros);      //Envia dato de decena
   delay_ms(5);
   
   //Display del signo de centigrados
   output_low(pin_c2);       //Enciende display 3
   output_high(pin_c0);        //Apaga display 1
   output_high(pin_c1);        //Apaga display 2
   output_high(pin_c3);        //Apaga display 4
   output_b(0b11100011);      //Envia signo de centigrados
   delay_ms(5);
   
   //Display la letra C
   output_low(pin_c3);       //Enciende display 4
   output_high(pin_c0);        //Apaga display 1
   output_high(pin_c1);        //Apaga display 2
   output_high(pin_c2);        //Apaga display 3
   output_b(0b00111001);      //Envia letra C
   delay_ms(5);
   
//Apagar todos los display
   output_high(pin_c3);        //Apaga display 4
   output_high(pin_c0);        //Apaga display 1
   output_high(pin_c1);        //Apaga display 2
   output_high(pin_c2);        //Apaga display 3
   delay_ms(2);
   
     

//Temperatura estable
   if(dht_dat[3]>=0&&dht_dat[3]<=20){
   output_low(pin_d4);}
//Temperatura en los limites   
   if(dht_dat[3]>20&&dht_dat[3]<=50){
   output_high(pin_d4);}
   
   }
   
}
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: DavidVG_83 en 23 de Abril de 2014, 07:26:47
Hola!! Soy nuevo por aquí y necesito ayuda con respecto al sensor DHT11. No estoy seguro, de si este es el mejor tema donde exponer mi duda, ya que, esta abierto y la prueba es con un Pic, y no con una placa Arduino Mega como es en mi caso. O si debería abrir un nuevo tema relacionado con el DHT11. Dicho esto, espero no estar haciéndolo mal y sean tan amables de darme alguna pista.

Hace poco adquirí un DHT11 y utilizando una librería DHT lo hice funcionar facilmente. Lo que quiero ahora, es hacerlo funcionar pero sin utilizar una librería, por lo que, indagando por Internet encontré este código para Arduino, que es muy similar al expuesto al principio de este tema:


//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 hay un 1 en la lectura del pin, indicamos que hay error de tipo 2
  if(!dht_in){
    bGlobalErr=2;
    return;
  }
  /*Despues de 80us a nivel bajo, el pin deberia de estar durante 80us a nivel alto.
  Despus 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 = 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 transmisión
  while (digitalRead(DHTPIN)==HIGH);// Se queda infinitamente en este bucle.
  }
  return result; //devolvemos el resultado
}



Al parecer, cuando el programa llega al último while (digitalRead(DHTPIN)==HIGH); se queda en este bucle infinitamente y no sale, lo único que muestra es esto; "Test Sensor DHT11."  Si quitas el While continuamente dice; "Error 3: DHT checksum error." y posteriormente este otro; "Error 1: Condicion de start 1 no conocida." Entiendo como funciona o como debería de funcionar el programa en teoría, pero en la práctica no funciona. He realizado mi propia librería en base a esta, en la cual, para simplificar he ir descartando cosas, sólo intento recoger el dato entero de la humedad que se almacena en el byte 0 de la variable recogedat[]. La variable "ok" siempre me recoge un "0" esto significa que el sensor se activa correctamente, pero no consigo capturar los datos correctamente, y lo peor de todo es que me salen valores aleatorios.  Este es el código de mi librería:



int datos = 2;  //Defino el pin 2 por el cual voy a recibir los datos.
byte recogedat[1];//Es una variable tipo array en la que sólo quiero que guarde (de momento) el dato entero de la humedad.
//

void setup()
{
  Serial.begin(9600);
  IniciarDHT();//Inicializamos el dht con esta función.
  
}


void IniciarDHT()
{
  Serial.println("Iiciando DHT11");
  pinMode(datos, OUTPUT);//Pongo como salida.
  delay(1);
  digitalWrite(datos, HIGH);//Le envío un pulso alto al DHT11.
  delay(1000);//Este delay es muy importante para que no de errores el DHT11.
}
  

void loop()
{
  estado();
}

void estado()//Mediante esta función sabemos si el DHT11 se ha activado correctamente,
             //si la variable "ok" recoge un "0" todo esta bien.
{
  byte ok;
  
  digitalWrite(datos, LOW);//Ahora pasamos a estado bajo durante 18ms(recomendado por el fabricante).
  delay(18);
  digitalWrite(datos, HIGH);//Pasamos a estado alto de nuevo durante 25 microsegundos. Con estos pasos el DHT11 se supone que         se activa.
  delayMicroseconds(25);
  pinMode(datos, INPUT);//Cambio el estado del pin datos a entradas, para poder recibir los datos del DHT11.
  delayMicroseconds(25);
  
  
    ok = digitalRead(datos);//Si se recoge un cero todo esta bien.
  
 Serial.print("Ok: ");
 Serial.println(ok);
  switch(ok)
  {
    case 1:
      Serial.println("Error de tipo 1");
      delayMicroseconds(60);
      break;
    case 2:
      Serial.println("Error de tipo 2");
      delayMicroseconds(60);
      break;
   // default:
     // Serial.println("Error desconocido");
      
  }

  
  
  while(digitalRead(datos)== LOW)//Pongo estos dos whiles, ya que, según el fabricante el DHT11 cuando se activa envía un pulso bajo y otro alto durante
  {                              //80us. Son para comprobar si realmente hace dichos pulsos.
    //delayMicroseconds(80);
    Serial.println("LOW");
  }
  
  while(digitalRead(datos)== HIGH)
  {
   // delayMicroseconds(80);
    Serial.println("HIGH");
  }
  

 

  int i = 0;
  for(i=0; i<1; i++)
  {
    recogedat = leerbyte();//Mediante este for recogeré los 8bits relativos a la humedad, y se guardarán en la posicion 0 del array recogedat[].
  }
    pinMode(datos, OUTPUT);//Volvemos a poner como salida el pin 2.
    digitalWrite(datos, HIGH);//Mandamos otro pulso alto, para que vuelva a empezar de nuevo.
    delay(500);
    //byte check = recogedat[0]+recogedat[1]+recogedat[2]+recogedat[3];
    Serial.print("Recogedat: ");
    Serial.println(recogedat[0]);//Se imprime recogedat[].
    
    /*if (recogedat[4]!= check)
    {
      Serial.println("Error de checkeo");
      delay(1500);
    }*/
  

  

}
 
byte leerbyte()//Función para recoger los 8bits.
{

  int i = 0;
  byte result = 0;
  
  for(i=0; i<8; i++)//Con este for dará las 8 vueltas que necesita para recoger uno a uno los bits.
  {
   while(digitalRead(datos)==0)//Según el fabricante por cada bit enviado "0" o "1", tiene que estar el pin en estado bajo 50us.
   {                           //por eso, si el pin está en estado bajo se queda haciendo el bucle while hasta que cambia a estado alto.
        
          Serial.print("BIT START: " );//Es una marca mía para sabér cuantas veces entra en este while, debería de entrar 8 veces, pero
          Serial.println(i);          //me suele entrar 2, 3, 5 veces según le dá.
          //delayMicroseconds(50);
   }      
            
              
             delayMicroseconds(30);//Este retardo es por si al cambiar a flanco ascendente, el bit que ha enviado es un "0", los ceros duran
                                  //entre 26 y 28us y es para que no entre en el siguiente if, antes de cambiar a flanco descendente de nuevo.
            if(digitalRead(datos)==1)//Si se ha enviado un "1" y como estos duran 70us, después del retardo anterior aún se mantendrá en
            {                        //flanco ascendente y entrará en el if marcando un uno en la posición que le corresponda.
        
               result |= (1<<(7-i));//Guarda en la variable "byte result" en la posición que le corresponda el bit uno.
              Serial.print("Resultado: " );
              Serial.println(result);
        
      
            }
         while(digitalRead(datos)==1)//Cuando sale del if anterior y sigue estando a nivel alto entra en el while hasta que cambie de estado a nivel bajo.
         {                          //para así volver al while de arriba el de flanco descendente.
         }
      }
    return result;// devuelve el resultado a la variable recogedat, una vez terminado de recoger los 8 bits.
}
  

Espero me puedan ayudar y si necesitan algo más decírmelo y lo expondré. Gracias.
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: mdvymdv en 25 de Mayo de 2014, 12:26:51
Muchas Gracias Muchachos!!!, por fin di con la tecla, después de mucho renegar y romper 2 sensores pude hacer funcionar mi dht22, le dejo un video para mostrarles como quedo.


Saludos cordiales a toda la comunidad de TODOPIC!!!
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: weten en 24 de Junio de 2014, 06:12:42
¿Alguien podría resolverme una duda?

He creado un programa para una LCD con un DHT11, de tal forma que usando tu librería fuera capaz de medir la temperatura y la humedad. El caso es que mide perfectamente ambas cosas pero cuando quiere escribir la parte decimal, siempre es "0", yo entiendo que hay 4 datos, 2 para la parte entera de cada medición, y otros dos para la parte decimal... Si no es así, corregidme. Me gustaría que al menos diera 1 decimal..

Felicidades por la librería, me sirvió de mucho
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: Micom en 24 de Junio de 2014, 19:49:34
El DHT11 solo da la parte entera de la temperatura y de la humedad y el sensor DHT22 si da los decimales
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: reactordoz en 10 de Marzo de 2015, 23:23:51
Que tal amigos buenas noches .... gracias por la libreria pero queria preguntar si esta libreria sirve para el pic16f4550 o 16f887

y como cargo la libreria al picc compiler porfavor !!!! agradecere su respuesta
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: ottanawa en 22 de Julio de 2015, 16:09:21
Hola a todos! Hace un poco de tiempo que no hago mucho de electrónica, y bueno me puse a jugar un poco con el sensor dht22 y pic 16f887. En primer lugar lo he podido hacer funcionar pero devolviendome temperaturas positivas. He leído que con tres líneas de programación se puede obtener temperaturas negativas. Quiero preguntar si alguien me puede dar una mano con la lógica a seguir. Muchas gracias a todos. Les quería comentar que estoy trabajando con varios sensores como por ejemplo de humedad de suelo y radición de luz. En cuanto vaya logrando algo preciso lo subiré.

Saludos a Todos.
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: KILLERJC en 22 de Julio de 2015, 20:43:48
Segun lei del datasheet el los 16 bits de temperatura, el bit de mayor peso, es decir el bit 15 si esta en 1 significa que es una temperatura negativa. Es la unica diferencia, por lo demas seguis tomando la temperatura como antes. pero si ese bit es 1 es negativo.
Título: Re: PIC16F84A y sensor de temperatura DHT11
Publicado por: Gunner en 01 de Agosto de 2015, 09:51:07
Gracias zerovlc.
He utilizado tu aporte y he intentado pasarlo a asm(asembler) pero no me muestra nada en pantalla.
PORFAVOR si alguien podria ayudarme y decirme que esta mal, seguramente la logica pero no se en que parte se los agradeceria mucho

CBLOCK 0x0C ;define la posición del inicio de las variables
GlobalError
dht_check_sum
aux_dht11
cnt_dht11
cnt_nuevo         ;segundo contador
j_dht11            ;comparador para el segundo contador
numero_dht11      ;numero uno que sera rotado
siete_dht11         ;numero 7 para la rotacion
r_dht11            ;respuesta parcial
resultado_dht11      ;respuesta final
dato0_dht11
dato1_dht11
dato2_dht11
dato3_dht11
dato4_dht11
mensaje_dht11
ENDC

#DEFINE DHT11 PORTA,1   ;El pin DATA a la linea RA1 del PIC

;Subrutina "DHT11_Inicializa" -----------------------
DTH11_Inicializa
   bsf STATUS,RP0 ;Banco 1
   bcf TRISA,1      ; el pin 1 del puerto A como salida
   call Retardo_1ms
   bsf DHT11
   return

;Subrutina "Lee_DHT11"
Lee_DHT11
   ;inicializar varibles
   clrf GlobalError
   ;Leer
   bsf STATUS,RP0
   bcf TRISA,1
   bsf DHT11
   bcf DHT11
   ;retardo de 18 milisegundos
   call Retardo_10ms
   call Retardo_5ms
   call Retardo_1ms
   bsf DHT11
   ;retardo de 22 y 28 microsegundos
   call Retardo_20micros
   call Retardo_4micros   
   bsf STATUS,RP0 ;Banco 1
   bsf TRISA,1      ; el pin 1 del puerto A como entrada
   call Retardo_5micros   
   
   ;condicion if de error
   btfsc DHT11
   goto Error_1
   ;retardo de 80 us
   call Retardo_50micros
   call Retardo_20micros
   call Retardo_10micros

   ;condicion de error 2
   btfss DHT11
   goto Error_2
   ;retardo de 80 us
   call Retardo_50micros
   call Retardo_20micros
   call Retardo_10micros
   
   ;captura de datos
   call Leer_DHT11_dato
   movwf dato0_dht11
   call Leer_DHT11_dato
   movwf dato1_dht11
   call Leer_DHT11_dato
   movwf dato2_dht11
   call Leer_DHT11_dato
   movwf dato3_dht11
   call Leer_DHT11_dato
   movwf dato4_dht11
   
   ;configuramos el puerto como salida
   bsf STATUS,RP0 ;Banco 1
   bcf TRISA,1      ; el pin 1 del puerto A como salida
   ;ponemos en alto
   bsf DHT11

   ;comprobamos si la lectura esta bien
   movfw dato0_dht11
   addwf dato1_dht11,1
   movfw dato1_dht11
   addwf dato2_dht11,1
   movfw dato2_dht11
   addwf dato3_dht11,1
   movfw dato3_dht11
   movwf dht_check_sum
   movlw .4
   movwf aux_dht11
   
   ;comparamos
   movf aux_dht11, W ; W-> aux_dht11
   subwf dht_check_sum, W ; W->dht_check_sum – aux_dht11, Z
   btfss STATUS, Z ; si Z = 1 salta ya que son iguales
   goto Error_dht ; Z = 0;
   
   ;ajustar
   movlw .5
   addwf dato0_dht11,1
   movlw .2
   addwf dato2_dht11,1
   movfw dato0_dht11
return

;Subrutina
 Leer_DHT11_dato
   ;iniciar varibles
   clrf resultado_dht11
   movlw .0
   movwf cnt_dht11

   Bucle1_dht
      Mientras1_dht11
      btfss DHT11
      goto Mientras1_dht11
      ;retraso 30us
      call Retardo_20micros
      call Retardo_10micros
      ;condicion si dht1 =1
      btfsc DHT11
      call Halla_res_dht   ; halla el resultado
      movwf resultado_dht11
      Mientras2_dht11
      btfsc DHT11
      goto Mientras2_dht11
      incf cnt_dht11
      ;comparamos
      movlw .8 ; W-> 8
      subwf cnt_dht11, W ; W->cnt_dht11 – 8, Z
      btfss STATUS, Z ; si Z = 1 salta ya que son iguales
      goto Bucle1_dht   ; si Z=0 no son iguales

   ;devuelve  los valores
   movf resultado_dht11,W
   return

;subrutina
Halla_res_dht
   ;dezplazar
   clrf j_dht11   
   movfw cnt_dht11
   subwf siete_dht11,0
   movwf cnt_nuevo
   DESPLAZAR
      movfw j_dht11   
      subwf cnt_nuevo,W
      btfsc STATUS,Z
      goto DESPLAZAR_FIN
      
      btfss numero_dht11,7
      goto Cero_dht11
      bsf STATUS,C
      goto Continua_dht11

      Cero_dht11
      bcf STATUS,C

      Continua_dht11
      rlf numero_dht11,1
      incf j_dht11   
      goto DESPLAZAR
   DESPLAZAR_FIN
   ;OR acumulativo
   movfw numero_dht11
   iorwf r_dht11,1
   movfw r_dht11
   return

Error_1
movlw .1
movwf mensaje_dht11
return
Error_2
movlw .1
movwf mensaje_dht11
return
Error_dht
movlw .1
movwf mensaje_dht11
return
Título: Como almacenar Temp y RH en variables ( uso del DHT22).
Publicado por: RPS_tp_ed en 17 de Agosto de 2017, 19:35:40
Tengo una pregunta se que talvez esta fuera del tema pero necesito ayuda.
Como puedo guardar el valor de temperatura y humedad en una variable para despues utilizar estas variables.
El programa se los muestro a continuación.


/* Interfacing PIC16F887 with DHT22 (AM2302) sensor CCS C code
   Read DHT22 datasheet to understand the code!
   Internal oscillator used @ 8MHz
   Timer1 is configured so that it increments every 1µs
   http://ccspicc.blogspot.com/
   electronnote@gmail.com
*/

//LCD module connections
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_ENABLE_PIN PIN_D2
#define LCD_DATA4 PIN_D3
#define LCD_DATA5 PIN_D4
#define LCD_DATA6 PIN_D5
#define LCD_DATA7 PIN_D6
//End LCD module connections

#include <16F887.h>
#fuses NOMCLR NOBROWNOUT NOLVP INTRC_IO
#use delay(clock = 8MHz)
#include <lcd.c>
#use fast_io(B)
#use fast_io(D)
#define DHT22_PIN PIN_B0                              // DHT22 Data pin is connected to RB0

char message1[] = "Temp = 00.0 C  ";
char message2[] = "RH   = 00.0 %  ";
short Time_out = 0;
unsigned int8 T_byte1, T_byte2, RH_byte1, RH_byte2, CheckSum ;
unsigned int16 Temp, RH;

void start_signal(){
  output_drive(DHT22_PIN);                            // Configure connection pin as output
  output_low(DHT22_PIN);                              // Connection pin output low
  delay_ms(25);
  output_high(DHT22_PIN);                             // Connection pin output high
  delay_us(25);
  output_float(DHT22_PIN);                            // Configure connection pin as input
}
short check_response(){
  set_timer1(0);                                      // Set Timer1 value to 0
  setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);           // Start Timer1 with internal clock source + 2 prescaler
  while(!input(DHT22_PIN) && get_timer1() < 100);     // Wait until DHT22_PIN becomes high (cheking of 80µs low time response)
  if(get_timer1() > 99)                               // If response time > 99µS  ==> Response error
    return 0;                                         // Return 0 (Device has a problem with response)
  else{
    set_timer1(0);                                    // Set Timer1 value to 0
    while(input(DHT22_PIN) && get_timer1() < 100);    // Wait until DHT22_PIN becomes low (cheking of 80µs high time response)
    if(get_timer1() > 99)                             // If response time > 99µS  ==> Response error
      return 0;                                       // Return 0 (Device has a problem with response)
    else
      return 1;                                       // Return 1 (response OK)
  }
}
unsigned int8 Read_Data(){
  unsigned int8 i, _data = 0;
  if(Time_out)
    break;
  for(i = 0; i < 8; i++){
    set_timer1(0);                                    // Set Timer1 value to 0
    while(!input(DHT22_PIN))                          // Wait until DHT22_PIN becomes high
      if(get_timer1() > 100){                         // If low time > 100  ==>  Time out error (Normally it takes 50µs)
        Time_out = 1;
        break;
      }
    set_timer1(0);                                    // Set Timer1 value to 0
    while(input(DHT22_PIN))                           // Wait until DHT22_PIN becomes low
      if(get_timer1() > 100){                         // If high time > 100  ==>  Time out error (Normally it takes 26-28µs for 0 and 70µs for 1)
        Time_out = 1;
        break;
      }
     if(get_timer1() > 50)                            // If high time > 50  ==>  Sensor sent 1
       bit_set(_data, (7 - i));                       // Set bit (7 - i)
  }
  return _data;
}
void main(){
  setup_oscillator(OSC_8MHZ);                         // Set the internal oscillator to 8MHz
  setup_timer_1(T1_DISABLED);                         // Disable Timer1
  lcd_init();                                         // Initialize LCD module
  lcd_putc('\f');                                     // Clear LCD
  while(TRUE){
    delay_ms(1000);                                   // Wait 1s
    Time_out = 0;
    Start_signal();                                   // Send start signal to the sensor
    if(check_response()){                             // Check if there is a response from sensor (If OK start reading humidity and temperature data)
      RH_byte1 = Read_Data();                         // read RH byte1
      RH_byte2 = Read_Data();                         // read RH byte2
      T_byte1  = Read_Data();                         // read T byte1
      T_byte2  = Read_Data();                         // read T byte2
      Checksum = Read_Data();                         // read checksum
      setup_timer_1(T1_DISABLED);                     // Disable Timer1
      if(Time_out) {                                  // If there is a time out in reading
        lcd_putc('\f');                               // LCD clear
        lcd_gotoxy(5, 1);                             // Go to column 5 row 1
        lcd_putc("Time out!");                        // Display "Time out!"
      }
      else {                                          // If there is no time out
        if(CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF)){
          RH = RH_byte1;
          RH = (RH << 8) | RH_byte2;
          Temp = T_byte1;
          Temp = (Temp << 8) | T_byte2;
          if (Temp > 0X8000){
            message1[6] = '-';
            Temp = Temp & 0X7FFF;
          }
          else
            message1[6] = ' ';
          message1[7]  = (Temp / 100) % 10  + 48;
          message1[8]  = (Temp / 10) % 10  + 48;
          message1[10] = Temp % 10  + 48;
          if(RH == 1000)                              // If the relative humidity = 100.0 %
            message2[6]  = 1 + 48;
          else
            message2[6]  = ' ';
          message2[7]  = (RH / 100) % 10 + 48;
          message2[8]  = (RH / 10) % 10 + 48;
          message2[10] = RH % 10 + 48;
          message1[11] = 223;                         // Degree symbol   
          lcd_gotoxy(1, 1);                           // Go to column 1 row 1
          printf(lcd_putc, message1);                 // Display message1
          lcd_gotoxy(1, 2);                           // Go to column 1 row 2
          printf(lcd_putc, message2);                 // Display message2
        }
        else {
          lcd_putc('\f');                             // LCD clear
          lcd_gotoxy(1, 1);                           // Go to column 1 row 1
          lcd_putc("Checksum Error!");
        }
      }
    }
    else {                                            // If there is no response from DHT22 sensor
      lcd_putc('\f');                                 // LCD clear
      lcd_gotoxy(3, 1);                               // Go to column 3 row 1
      lcd_putc("No response");
      lcd_gotoxy(1, 2);                               // Go to column 1 row 2
      lcd_putc("from the sensor");
    }
  }
}

Saludos.
 :-) :-)
Título: Re:PIC16F84A y sensor de temperatura DHT11
Publicado por: KILLERJC en 17 de Agosto de 2017, 22:24:57
Citar
Como puedo guardar el valor de temperatura y humedad en una variable para despues utilizar estas variables.

Las tenes en las variables RH y Temp que son enteros de 16 bits luego de esto:

Código: C
  1. RH = RH_byte1;
  2.           RH = (RH << 8) | RH_byte2;
  3.           Temp = T_byte1;
  4.           Temp = (Temp << 8) | T_byte2;

Pero si no me equivoco, los bytes de temperatura y humedad tiene algunos bits que son decimales, y la Temperatura si esta seteado el bit de mayor peso, significa que es negativo.
Para mas info de que te devuelve el sensor, revisa el datasheet del DHT11
Título: Re:PIC16F84A y sensor de temperatura DHT11
Publicado por: simonork en 17 de Mayo de 2019, 18:25:22
Hola colegas, muy buen aporte!
Tengo un error en los delay, dice: *** Error 112 "C:\Users\simonk\Desktop\DHT-11\DHT11.h" Line 24(1,1): Function used but not defined:  ... delay_ms 186  SCR=441

si alguien me puede orientar por favor. Muchas gracias.
Título: Re:PIC16F84A y sensor de temperatura DHT11
Publicado por: KILLERJC en 17 de Mayo de 2019, 21:11:14
agrega el xc.h que ahi estan las funcioens _delay_ms