Autor Tema: Sensor de temperatura y Humedad con DHT11  (Leído 3998 veces)

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

Desconectado TAZcustom

  • PIC10
  • *
  • Mensajes: 8
Sensor de temperatura y Humedad con DHT11
« en: 19 de Junio de 2012, 14:56:16 »
E comenzado este proyecto e logrado iniciar el sensor correctamente pero ahora no se como leer los datos para mostrarlos en un LCD 16x2 con un PIC16f877A aqui dejo el programa de lo que llevo por si alguien me puede ayudar con el tema, solo kiero obtener los datos de la temperatura y la humedad.

Define CONF_WORD = 0x3f72
Define CLOCK_FREQUENCY = 12
AllDigital

Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 4
Define LCD_RSREG = PORTD
Define LCD_RSBIT = 1
Define LCD_RWREG = PORTD
Define LCD_RWBIT = 2
Define LCD_EREG = PORTD
Define LCD_EBIT = 3

Lcdinit

Define 1WIRE_REG = PORTB
Define 1WIRE_BIT = 0
Dim v As Byte
Dim t_byte1 As Byte
Dim t_byte2 As Byte
Dim rh_byte1 As Byte
Dim rh_byte2 As Byte
Symbol data = PORTB.0
loop:
TRISB.0 = 0
1wireInit
High data
1wireSendByte 1
Low data
WaitUs 18
High data
WaitUs 30
TRISB.0 = 1
1wireGetByte v
If PORTB.0 = 0 Then
WaitUs 80
If PORTB.0 = 1 Then
WaitUs 80
Goto inicio
Endif
Endif
Goto loop
inicio:

WaitMs 50
Lcdout #t_byte1, "temp"
WaitMs 1000
Lcdcmdout LcdClear
Goto inicio


al final donde me muestra lcdout #t_byte, "temp" kiero mostrar la temperatura pero en el LCD me aparece " 0 temp"
Saludos!!!
« Última modificación: 19 de Junio de 2012, 16:32:53 por TAZcustom »

Desconectado TAZcustom

  • PIC10
  • *
  • Mensajes: 8
Re: Sensor de temperatura y Humedad con DHT11
« Respuesta #1 en: 19 de Junio de 2012, 16:02:00 »
Me proporcionaron este programa pero hay lineas que no las comprendo ya que es muy diferente al Pic Simulator IDE

// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

sbit Data at RA0_bit;
sbit DataDir at TRISA0_bit;
char message1[] = "Temp = 00.0 C";
char message2[] = "RH   = 00.0 %";
unsigned short TOUT = 0, CheckSum, i;
unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;

void StartSignal(){
  DataDir = 0;     // Data port is output
  Data    = 0;
  Delay_ms(25);    // Low for at least 18us
  Data    = 1;
  Delay_us(30);    // High for 20-40 us
  DataDir = 1;     // Data port is input

}

unsigned short CheckResponse(){
  TOUT = 0;
  TMR2 = 0;
  T2CON.TMR2ON = 1;      // Start TMR2 while waiting for sensor response
  while(!Data && !TOUT); // If there's no response within 256us, the Timer2 overflows
  if (TOUT) return 0;    // and exit
  else {
   TMR2 = 0;
   while(Data && !TOUT);
   if (TOUT) return 0;
   else {
    T2CON.TMR2ON = 0;
    return 1;
   }
  }
}

unsigned short ReadByte(){
  unsigned short num = 0, t;
  DataDir = 1;
  for (i=0; i<8; i++){
   while(!Data);
   TMR2 = 0;
   T2CON.TMR2ON = 1;  // Start TMR2 from 0 when a low to high data pulse
   while(Data);       // is detected, and wait until it falls low again.
   T2CON.TMR2ON = 0;  // Stop the TMR2 when the data pulse falls low.
   if(TMR2 > 40) num |= 1<<(7-i);  // If time > 40us, Data is 1
  }
  return num;
}

void interrupt(){
  if(PIR1.TMR2IF){
   TOUT = 1;
   T2CON.TMR2ON = 0; // stop timer
   PIR1.TMR2IF  = 0; // Clear TMR0 interrupt flag
  }
}

void main() {
  unsigned short check;
  TRISB = 0b00000000;
  PORTB = 0;
  TRISA = 0b00100001;
  CMCON = 7;
  INTCON.GIE = 1;    //Enable global interrupt
  INTCON.PEIE = 1;   //Enable peripheral interrupt
  // Configure Timer2 module
  PIE1.TMR2IE = 1;  // Enable Timer2 interrupt
  T2CON = 0;        // Prescaler 1:1, and Timer2 is off initially
  PIR1.TMR2IF =0;   // Clear TMR INT Flag bit
  TMR2 = 0;
  Lcd_Init();
  Lcd_Cmd(_Lcd_Clear);
  Lcd_Cmd(_LCD_CURSOR_OFF);

  do {
    Delay_ms(1000);
    StartSignal();
    check = CheckResponse();
    if (!check) {
     Lcd_Cmd(_Lcd_Clear);
     Lcd_Out(1, 1, "No response");
     Lcd_Out(2, 1, "from the sensor");
    }
    else{

     RH_Byte1 = ReadByte();
     RH_Byte2 = ReadByte();
     T_Byte1 = ReadByte();
     T_Byte2 = ReadByte();
     CheckSum = ReadByte();
     // Check for error in Data reception
     if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
     {
      message1[7]  = T_Byte1/10 + 48;
      message1[8]  = T_Byte1%10 + 48;
      message1[10] = T_Byte2/10 + 48;
      message2[7]  = RH_Byte1/10 + 48;
      message2[8]  = RH_Byte1%10 + 48;
      message2[10] = RH_Byte2/10 + 48;
      message1[11] = 223;     // Degree symbol
      Lcd_Cmd(_Lcd_Clear);
      Lcd_Out(1, 1, message1);
      Lcd_Out(2, 1, message2);
      }

      else{
       Lcd_Cmd(_Lcd_Clear);
       Lcd_Out(1, 1, "Checksum Error!");
       Lcd_Out(2, 1, "Trying Again ...");
      }
    }

  }while(1);
}

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Sensor de temperatura y Humedad con DHT11
« Respuesta #2 en: 20 de Junio de 2012, 09:14:08 »
Por lo que veo a t_byte1 no le asignas ningun valor antes de enviarla al display, imagino que antes tendras que hacer t_byte1 = v para de esta forma asignarle un valor.

Otro tema; indicas que los puertos trabajaran como digitales pero no especificas que el portb.0 lo vas a utilizar como entrada ya que lo estás leyendo, esto seria trisb.0 =1 como entrada. Todo esto implica que dejas a la elección del compilador su estado por lo que no sé que puede pasar.

Nota: Utilizar K en vez de Q queda bonito, pero el buscador del foro no lo entiende, por lo que en todos los foros, por lo menos los técnicos, se recomienda encarecidamente escribir lo mejor posible.
« Última modificación: 20 de Junio de 2012, 09:58:14 por dogflu66 »
Saludos desde Granada, España.

Desconectado TAZcustom

  • PIC10
  • *
  • Mensajes: 8
Re: Sensor de temperatura y Humedad con DHT11
« Respuesta #3 en: 20 de Junio de 2012, 17:01:17 »
Por lo que veo a t_byte1 no le asignas ningun valor antes de enviarla al display, imagino que antes tendras que hacer t_byte1 = v para de esta forma asignarle un valor.

Otro tema; indicas que los puertos trabajaran como digitales pero no especificas que el portb.0 lo vas a utilizar como entrada ya que lo estás leyendo, esto seria trisb.0 =1 como entrada. Todo esto implica que dejas a la elección del compilador su estado por lo que no sé que puede pasar.

Nota: Utilizar K en vez de Q queda bonito, pero el buscador del foro no lo entiende, por lo que en todos los foros, por lo menos los técnicos, se recomienda encarecidamente escribir lo mejor posible.
GRACIAS AMIGO LO TOMARE EN CUENTA Y SI FIJATE QUE NO LE ASIGNE NINGUN VALOR YA QUE AUN NO SE COMO LEER LOS DATOS NO SE SI EL PIC LOS DETECTE AUTOMATICAMENTE O QUE ONDA.

otra duda puedo usar el puerto como entrada y salida al mismo tiempo?? si te fijas puse trisb.0 = 1 y trisb.0 = 0
saludos!!

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Sensor de temperatura y Humedad con DHT11
« Respuesta #4 en: 21 de Junio de 2012, 07:05:50 »
Si se puede utilizar, no me di cuenta que usas "TRIS" en el cuerpo del programa, no es normal pero si la aplicación lo requiere es totalmente valido.

Si no recuerdo mal, todas o casi todas las funciones del PSI ya reconfiguran de forma automática los puertos como entrada o como salida según la necesidad. De todas formas es conveniente leer el manual que indica como trabaja la función, por si antes de llamarla hay que configurar el puerto o pin del puerto de una forma determinada.
« Última modificación: 21 de Junio de 2012, 07:09:40 por dogflu66 »
Saludos desde Granada, España.


 

anything