Autor Tema: Pic 16f628a y DHT11  (Leído 2077 veces)

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

Desconectado guillermoc

  • PIC10
  • *
  • Mensajes: 3
Pic 16f628a y DHT11
« en: 16 de Agosto de 2015, 20:23:08 »
Hola, estuve buscando librería para el DHT11 y utilice la de que un colega publicó para un 16f84a, en este proyecto "estación meteorológica" conecto un DS18B20 y un DHT11, el primero anda bien pero nunca logro obtener lecturas de humedad, al menos en la simulación Proteus, dejo aquí el código y la simulación, instale en Proteus 7 la librería para contar con el sensor DHT11 en Proteus 8 ya está incluido pero sigue sin funcionar. Agradecería si me pueden ayudar a medir humedad, muchas gracias.

LIBRERIA DHT11.h

#define dht11 PIN_B0  //PIN QUE YO NECESITO UTILIZAR

#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()
{

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;
}

PROGRAMA ESTACION METEOROLOGICA (TEMP + HUM)

#include <16F628A.h>
#FUSES XT,NOWDT,NOPROTECT,NOPUT//Ordenes para el programador
#use delay (clock=4000000) // reloj de 4MHz
//#define use_portb_lcd TRUE
#include<LCD_FLEX.c>
#include<1wire.c>  //LIBRERIA PARA DS18B20 CONECTADO A B1
#include<DS18B20.c>
#include<DHT11.h>

/////////Programa principal/////////////

 void main(void)//Programa Principal
{
float temperatura;  //Obtiene el valor dado por la funcion ds1820_read
int dht_dat[4];

delay_ms(25);
lcd_init();
lcd_putc("\fInicializando...");
delay_ms(2500);
lcd_init();
lcd_putc("T: ");
while (true){
temperatura = ds1820_read();

lcd_gotoxy(4,1);
printf(lcd_putc,"%1.2f",temperatura);
lcd_gotoxy(9,1);
lcd_putc("*");
delay_ms(10);
leer_dht();
humedad = dht_dat[0]
lcd_gotoxy(1,2);
printf(lcd_putc,"Hum.: %d  ",humedad);    // Mostrar los datos en la pantalla  
delay_ms(2000);
}
}


******** Agregado por el autor ************
Ya encontré la falla, tan simple como obvia, ahora jaja, antes de llamar a la función leer_dht() debía inicializar el sensor ... iniciar_dht(), Funciona perfecto, saludos!
« Última modificación: 28 de Agosto de 2015, 14:17:14 por guillermoc »