Bus One Wire - Sensor de temperatura y humedad DHT11



1. Introducción:

 Este sensor también funciona con el bus "One Wire", pero hay ciertas diferencias que no lo hacen compatible con las librerías del DS18B20, sobre todo en los tiempos.





2. Características:

 Es un sensor compuesto por una sonda de humedad resistiva y una sonda NTC con un interface oneWire a través de un microcontrolador de 8 bits. Es un sensor calibrado y con gran precisión.


Características:


Datasheet del DHT11


3. Comunicación:

 A diferencia del DS18B20, sólo un sensor puede ir en cada línea puesto que no se permite direccionamiento.

Una vez iniciado solicitado el resultado de la conversión al DHT11, nos devolverá 40 bits:
8 bits humedad + 8 bits humedad + 8 bits temperatura + 8 bits temperatura + 8 bits paridad

Nota: El byte de paridad se calcula realizando la suma de los bytes de humedad y temperatura.


4. Timing de las señales:

 El primer paso es alimentar el DHT11. Luego debemos esperar como mínimo 1s para que se estabilice.

Para iniciar la comunicación, ponemos el bus a nivel bajo como mínimo 18 mS. El DHT11 responderá poniendo a nivel bajo el bus durante 60uS más y luego 80uS a nivel alto.


Es ahora cuando recibiremos los 40 bits de información.

bit 0 = 50uS a nivel bajo + 26-28uS a nivel alto.
bit 1 = 50uS a nivel bajo + 70uS a nivel alto.


Indica el fin, manteniendo 50uS el nivel bajo después de enviar los datos.


5. Ejemplo:

  En este ejemplo, se realiza la consulta de la temperatura y humedad.

	


/*
 * File:   main.c
 * Author: Eduardo
 *
 * Created on 5 de junio de 2017, 17:16
 */


#include 
#include "config.h"
#include "typedefs.h"
#include "usart.h"


/******************************************************************************
*                       DEFINIMOS EL PIN A USAR
* 
*   - Asigna un pin al bus
 *****************************************************************************/

#define DHT11_DataPin TRISDbits.TRISD7     // Configura como entrada o salida
#define DHT11_DataInput  PORTDbits.RD7     // Para leer estado
#define DHT11_DataOutput LATDbits.LATD7    // Para escribir estado



//PROTOTIPO DE LAS FUNCIONES USADAS
void delay_ms(uint16_t);
void delay_us(uint8_t);

void imprimirValorInt (int);
void imprimirValorFloat (float);

bool reset_DHT11 ();
uint8_t read_DHT11_Byte ();
void read_DTH11_Todo ();



void main(void) 
{
    USART_Initialize();     // Inicializamos el puerto Serie
    delay_ms(500);
    

    
        
    while (true)
    {
        
    if (reset_DHT11())
      {
          read_DTH11_Todo ();
      }
      else
          printf ("No se detecta el DHT11 \n");
      
USART_putcUSART("\n");
      
        //read_DTH11_Todo2 ();
        
      delay_ms(5000);             // Retardo antes de volver a iniciar
  
    }
}




/******************************************************************************
*                       FUNCION IMPRIMIR INT 
* 
*   - Funcion que permite imprimir un int por la uart
 *****************************************************************************/
void imprimirValorInt (int valor)
{
    unsigned char intStringVal[4];
    itoa( intStringVal, valor,10);
    printf(intStringVal);
    //printf("\n");
}


/******************************************************************************
*                       FUNCION IMPRIMIR HEX 
* 
*   - Funcion que permite imprimir un hex por la uart
 *****************************************************************************/
void imprimirValorHex (int valor)
{
    unsigned char intStringVal[4];
    itoa( intStringVal, valor,16);
    printf(intStringVal);
    printf("\n");
}


/******************************************************************************
*                       FUNCION IMPRIMIR FLOAT 
* 
*   - Funcion que permite imprimir un float por la uart
 *****************************************************************************/
void imprimirValorFloat (float valor)
{
    int bytesWritten; 
    char myString[50];

    bytesWritten = sprintf(myString, "%7.4f", valor); 
    UART_Write_Text(myString);   
    printf("\n");
}




/******************************************************************************
*                       FUNCION RETARDO DE mS
* 
*   - Funcion que realiza un retardo en mS segun el valor que recibe
 *****************************************************************************/
void delay_ms(uint16_t i)
{
    for ( uint16_t x=0; x < i; x++ ) 
    { 
    __delay_ms(1); 
    }
}



/******************************************************************************
*                       FUNCION RETARDO DE uS
* 
*   - Funcion que realiza un retardo en mS segun el valor que recibe
 *****************************************************************************/
void delay_us(uint8_t i)
{
    for ( uint8_t x=0; x < i; x++ ) 
    { 
    __delay_us(1); 
    }
}


/******************************************************************************
*                       FUNCION ENVIO RESET BUS
* 
*   - Realiza un reset para llamar la atención del DHT11
*   - Devuelve true, si hay respuesta
 *****************************************************************************/

bool reset_DHT11 ()
{
    DHT11_DataPin = 1;             // Habilita el pin como entrada
    while (!DHT11_DataInput);      // Espera hasta que el bus este en reposo
    bool detectado = false;     // Inicializamos una variable que nos indica si 
                                // algun esclavo responde
    
    DHT11_DataPin = 0;          // Configuramos el pin como salida
    DHT11_DataOutput = 0;            // Pone el bus a nivel bajo durante 480uS
    delay_ms(20); 
    DHT11_DataOutput = 1;           // Pone el bus en reposo durante 40uS
    delay_us(50); 
    
    DHT11_DataPin = 1;             // Configura el pin como entada otra vez. Las 
                                // funciones anteriores lo habian cambiado a salida
    
    if (DHT11_DataInput)           // Monitoriza el bus para detectar una respuesta
        detectado = false;
    else
        detectado = true;
    
    while (!DHT11_DataInput);      // Espera hasta que el bus este en reposo
    delay_us(20); 
    while (DHT11_DataInput);
    
    return detectado;           // Devuelve si ha detectado o no un esclavo
}



/******************************************************************************
*                       FUNCION LEER BYTE
* 
*   - Funcion que recoge 8 bits
 *****************************************************************************/
uint8_t read_DHT11_Byte ()
{
    uint8_t byteLeido = 0;
    
    DHT11_DataPin = 1;             // Habilita el pin como entrada
    delay_us(20);
    
    for (uint8_t temp = 0; temp < 8; temp ++)   // Guardamos 8 bits
    {
       while (!DHT11_DataInput);
       delay_us(30);
       
        byteLeido <<=1;                            // Vamos recogiendo cada byte y los vamos
       if (DHT11_DataInput)         // desplazando a la izquierda para tener
       {                            // el de menor peso en su posicion
           byteLeido = byteLeido | 0x01;
           //delay_us(40);
           while (DHT11_DataInput);
       }
       else 
       {
           byteLeido = byteLeido & 0xFE;
       }
       
       
    } 
    return byteLeido;
}





/******************************************************************************
*                       FUNCION LEER TODO
* 
*   - Funcion que recoge los 5 bytes del DHT11
 *****************************************************************************/
void read_DTH11_Todo ()
{
    uint8_t dataNumber [5]; // Array para recoger los 9 bytes de respuesta
    float temperatura;      // Variable para almacenar la temperatura recibida
    
   
    for (uint8_t temp = 0; temp < 5; temp ++)   // Guardamos los 5 bytes
    {
       dataNumber [temp] =  read_DHT11_Byte ();
    }   
    
    printf ("\n Leido: ");
    for (uint8_t temp = 0; temp < 5; temp ++)   // Guardamos los 5 bytes
    {
       imprimirValorInt (dataNumber [temp]);
       printf (" ");
    }   
    
    printf ("\n CRC: ");
    imprimirValorInt ((dataNumber [0] + dataNumber [1] + dataNumber [2] + dataNumber [3]));
    
    if ((dataNumber [0] + dataNumber [1] + dataNumber [2] + dataNumber [3]) == dataNumber [4])
    {
        printf ("\n");
        printf ("Temperatura: ");
        imprimirValorInt (dataNumber [2]);
        printf (".");
        imprimirValorInt (dataNumber [3]);
        printf (", Humedad: ");
        imprimirValorInt (dataNumber [0]);
        printf (".");
        imprimirValorInt (dataNumber [1]);
    }
    else
        printf ("Datos Error     ");  // Si hubo problemas, lo indicamos

}



				



6. Descargas:



www.microedu.es

Si chove, non orballa!