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

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

Desconectado TIBURONMAUI

  • PIC10
  • *
  • Mensajes: 4
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #30 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 ... 

Desconectado IngJulianVelasco

  • PIC10
  • *
  • Mensajes: 3
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #31 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

Desconectado TIBURONMAUI

  • PIC10
  • *
  • Mensajes: 4
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #32 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 ...   ^_^

Desconectado nando_azul

  • PIC10
  • *
  • Mensajes: 2
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #33 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);}
   
   }
   
}

Desconectado nando_azul

  • PIC10
  • *
  • Mensajes: 2
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #34 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);}
   
   }
   
}

Desconectado DavidVG_83

  • PIC10
  • *
  • Mensajes: 1
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #35 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.

Desconectado mdvymdv

  • PIC10
  • *
  • Mensajes: 2
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #36 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!!!

Desconectado weten

  • PIC10
  • *
  • Mensajes: 6
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #37 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

Desconectado Micom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 783
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #38 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
El programador GTP USB PLUS es un super programador
GRACIAS dobles amigo SISPIC

Tan solo queda seguir sobreviviendo

Desconectado reactordoz

  • PIC10
  • *
  • Mensajes: 1
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #39 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

Desconectado ottanawa

  • PIC10
  • *
  • Mensajes: 5
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #40 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #41 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.

Desconectado Gunner

  • PIC10
  • *
  • Mensajes: 1
Re: PIC16F84A y sensor de temperatura DHT11
« Respuesta #42 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

Desconectado RPS_tp_ed

  • PIC10
  • *
  • Mensajes: 2
Como almacenar Temp y RH en variables ( uso del DHT22).
« Respuesta #43 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.
 :-) :-)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16F84A y sensor de temperatura DHT11
« Respuesta #44 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


 

anything