Creo que no se ha quemada pero no me funciona bien el codigo.. solo recibo el primer dato de la humedad.. :(
#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;
}#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);
}
}#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);
}
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;
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;
for (i=0; i<5; i++){
dht22_dat[ i ] = leer_datos_dht(); // capturando datos
}
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 ... ^_^
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 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 .... ^_^
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
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
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);}
}
}
Como puedo guardar el valor de temperatura y humedad en una variable para despues utilizar estas variables.