DHT11


Sensor Digital de Temperatura y Humedad 1 wire
  
El sensor DHT11 originalmente tiene 4 puertos de los cuales solo usaremos 3 para conectarlo a nuestra MCU tal y como nos indica el fabricante.



Para comunicarnos con el sensor debemos de implementar en nuestra MCU el protocolo que el fabricante nos proporciona el datasheet es el siguiente:

La MCU se comunicará con  el DHT y éste le enviará 5 bytes de datos donde los 2 primeros corresponderán a la Humedad Relativa, los 2 siguientes a la Temperatura y el último byte para el Checksum.



Pimero de todo MCU mandará una secuencia de START al DHT y después el mismo esperará a que el DHT responda. Después el DHT mandará una señal al MCU para indicar de que está preparado para inicial la trasmisión bit a bit.



Siempre que inicia la trasmisión de un bit el sensor, mandará un pulso de bajo voltaje de 50us y después enviará un pulso de alto voltaje que según la duración del mismo el pulso significará que es un "0" (26-28us fig 3) o un "1" (70us fig 4). 






fig 3

fig 4



Código para realizar la secuencia de START:
 
/*
#define Data      PORTBbits.RB4   //El sensor lo conectaremos al puerto RB4
#define DataDir   TRISBbits.TRISB4
void start_signal()
 { DataDir = 0;     // Data port is output
   Data    = 0;
   __delay_ms(25);
   Data    = 1;
   
   __delay_us(30);
   Data    = 0;
   DataDir = 1;     // Data port is input 
 }
*/

Código para verificar que recibimos respuesta por parte del sensor para medir el tiempo utilizamos el TIMER2:

/*
unsigned short check_response()
 { TOUT = 0;
   TMR2 = 0;
   TMR2ON = 1;                // start timer
   while (!Data && !TOUT);
   if (TOUT) 
      return 0;
   else 
    { TMR2 = 0;
      while (Data && !TOUT);
      if (TOUT) 
         return 0;
      else 
       { TMR2ON = 0;
         return 1;
       }
    }
 }

*/


Código para guardar los bits en bytes utilizando el TIMER2:

/*
unsigned short read_byte()
 { unsigned short num = 0;
   DataDir = 1;
   for (i=0; i<8; i++)
    { while (!Data);
      TMR2 = 0;
      TMR2ON = 1;
      while (Data);
      TMR2ON = 0;
      if (TMR2 > 49) 
         num |= 1<<(7-i);  // si el tiempo > 49us, Data es 1
    }
   return num;
 }
*/

Código en el Main():

/*
            start_signal();
            check = check_response();
            
            if (!check) 
       { 
                 while (BusyUSART());
            putsUSART("No response  from the sensor DHT11");
            Salto_Enter();
                
              
       }
      else
       { RH_Byte1 = read_byte();
         RH_Byte2 = read_byte();
         T_Byte1  = read_byte();
         T_Byte2  = read_byte();
         CheckSum = read_byte();
         __delay_us(50);
         TRISBbits.TRISB4 = 0;
            PORTBbits.RB4 = 1;
         // Check for error in Data reception
         if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
          { 
             
            sprintf(CharTX, "DATA DHT11 :Temperature = %u C", T_Byte1);
            while (BusyUSART());
            putsUSART(CharTX);
            Salto_Enter();
            
            
            sprintf(CharTX, "DATA DHT11 :Humidity = %u %%", RH_Byte1);
            while (BusyUSART());
            putsUSART(CharTX);
            Salto_Enter();
            
          }
         else
          { 
             
             while (BusyUSART());
            putsUSART("Checksum Error!   Trying Again ... ");
            Salto_Enter();

          }
       }
             
            
*/




























IMPLEMENTACIÓN: 









Comments