Autor Tema: DHT22 y PIC16f877a  (Leído 2477 veces)

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

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
DHT22 y PIC16f877a
« en: 07 de Marzo de 2020, 22:09:19 »
EStimados. Estoy armando  un medidor de temperatura y humedad con el sensor dht22 y el pic16f877A. EStoy usando el codigo extraído de la página "http://ccspicc.blogspot.com/2016/05/pic16f877a-dht22-am2302-rht03-humidity-temperature-sensor-proteus-simulation-ccs-picc.html" Utilizo también el compilador ccs. Lo unico que cambie de este programa es la librería del lcd, estoy usando la lcdflex.c . Al momento de compilar lo hace sin ningún error. Cuando la cargo al microcontrolador logro visualizar solo el valor de la humedad en xy(1,1) (ejemplo...=34%) en una ubicación distinta a la establecida en el programa. Debería verla en la fila 2(xy) (1,2) como Rh=34%. Cuando por accidente levante la patita del RS del lcd se ven las medidas de temp. y humedad pero cambiando permanentemente de lugar. EStoy trabajando con un cristal de 8Mhz.

 No sé que tendría que modificar para que las lecturas queden en las posiciones indicadas en ese programa. 
Gracias por alguna sugerencia !!!!
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:DHT22 y PIC16f877a
« Respuesta #1 en: 09 de Marzo de 2020, 22:18:35 »
Hola, aquí les dejo el programa y sus modificaciones. La compilación es correcta pero no logro ver las medidas en el lcd. solo veo ua parte del resultado de la humedad en un lugar distinto al indicado por el programa.

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 8000000)
#include <lcdflex.c>
#use fast_io(D)

// Connection pin between PIC16F877A and DHT22 sensor

#BIT Data_Pin = 0x08.0                       // Pin mapped to PORTD.0
#BIT Data_Pin_Direction = 0x88.0             // Pin direction mapped to TRISD.0

char message1[] = "Temp = 00.0 C";
char message2[] = "RH   = 00.0 %";
short Time_out ;
unsigned int8 T_byte1, T_byte2, RH_byte1, RH_byte2, CheckSum ;
unsigned int16 Temp, RH;
void start_signal(){
  Data_Pin_Direction = 0;              // Configure connection pin as output
  Data_Pin = 0;                        // Connection pin output low
  delay_ms(25);
  Data_Pin = 1;                        // Connection pin output high
  delay_us(30);
  Data_Pin_Direction = 1;              // Configure connection pin as input
}
short check_response(){
  delay_us(40);
  if(!Data_Pin){                     // Read and test if connection pin is low
    delay_us(80);
    if(Data_Pin){                    // Read and test if connection pin is high
      delay_us(50);
      return 1;}
    }
}
unsigned int8 Read_Data(){
  unsigned int8 i, k, _data = 0;     // k is used to count 1 bit reading duration
  if(Time_out)
    break;
  for(i = 0; i < 8; i++){
    k = 0;
    while(!Data_Pin){                          // Wait until pin goes high
      k++;
      if (k > 100) {Time_out = 1; break;}
      delay_us(1);}
    delay_us(30);
    if(!Data_Pin)
      bit_clear(_data, (7 - i));               // Clear bit (7 - i)
    else{
      bit_set(_data, (7 - i));                 // Set bit (7 - i)
      while(Data_Pin){                         // Wait until pin goes low
      k++;
      if (k > 100) {Time_out = 1; break;}
      delay_us(1);}
    }
  }
  return _data;
}
void main(){
  lcd_init();                                 // Initialize LCD module
  lcd_putc('\f');                             // LCD clear
  while(TRUE){
    delay_ms(1000);
    Time_out = 0;
    Start_signal();
    if(check_response()){                    // If there is response from sensor
      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
      if(Time_out){                           // If reading takes long time
        lcd_putc('\f');                       // LCD clear
        lcd_gotoxy(5, 1);                     // Go to column 5 row 1
        lcd_putc("Time out!");
      }
      else{
       if(CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF)){
        RH = RH_byte1;
        RH = (RH <<8) | RH_byte2;     //la carita es un 8
        Temp = T_byte1;
        Temp = (Temp <<8) | T_byte2;       //la carita es un 8
        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;
        message2[7]  = (RH / 100) % 10 + 48;
        message2[8]  = (RH / 10) % 10 + 48;
        message2[10] = RH % 10 + 48;
        message1[11] = 223;                   // Degree symbol
        lcd_putc('\f');                       // LCD clear
        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 {
      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");
    }
  }
}


muchas gracias
« Última modificación: 10 de Marzo de 2020, 20:46:10 por kidpic »
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:DHT22 y PIC16f877a
« Respuesta #2 en: 11 de Marzo de 2020, 10:00:13 »
Me está sucediendo lo siguiente. Estoy programando INCIRCUIT con el pikckit2, resulta que la programación se hace sin ningún problema. Se observan las variables medidas correctamente. Pero cuando desconecto el programador se borra la pantalla del LCD. Cuando le conecto una fuente externa sigue sin aparecer la medición. Cuando le conecto nuevamente el programador pic kit2 aparece la medición.
« Última modificación: 11 de Marzo de 2020, 18:35:45 por kidpic »
Si quieres trascender..., enseña humildemente  lo que sabes.


 

anything