This is an example program to fetch data of DHT11 Sensors

Dependencies:   mbed

Fork of DHT11_with_Nucleo by Adatgy2014

main.cpp

Committer:
ledonger
Date:
2017-04-05
Revision:
12:31645d013d6c
Parent:
11:1379308ecace

File content as of revision 12:31645d013d6c:

#include "mbed.h"

//Tested with success on STM32 Nucleo L476

DigitalOut myled(LED1); // Activate LED
DigitalIn mybutton(USER_BUTTON); // Activate button
DigitalInOut data_pin(A0); // Activate digital in
Serial pc(SERIAL_TX, SERIAL_RX); // Initialize UART connection
// Use a terminal program (eg. TeraTerm).
Timer tmr; //initialize timer
uint64_t adat; // 64 bit variable for temporary data
int i;


// Function to initialize DHT11
void dht_read(void) {
    data_pin.output(); 
    // Initialize measurement > 18 ms low
    data_pin = 0;
    wait_ms(20);
    // After high and release the pin switch input mode
    data_pin = 1;
    
    wait_us(20);//Wait for the sensor to take control and set low level /!\ Important
    
    data_pin.input();
    // Wait until the end of 80 us low
    while(!data_pin.read());
    // Wait until end of 80 us high
    while(data_pin.read());
    // 40 bit, 40 read out cycle
    for(i=0; i<40; i++) {
        adat = adat << 1; // Shift for new number
        tmr.stop(); // Stop timer if runs
        tmr.reset();  // Reset timer
        // Wait until pin
        while(!data_pin.read());       
        tmr.start();            
        while(data_pin.read());
        // If DHT11 HIGH longer than 40 micro seconds (hopefully 70 us)
        if(tmr.read_us() > 50) {
            // bit is 1
            adat++;
        }
    }
}

int main() {
    pc.printf("Read the DHT11 temperature and humidity sensor!\n"); //Welcome message
    while(1) {
        if(mybutton == 0){ // Button is pressed
            // Reset adat variable
            adat = 0;
            myled = 1; // LED is ON
            dht_read(); // Call the function
            // Send result through UART result
            //pc.printf("Raw data:%10x\n\r",adat);
            pc.printf("Humidity:%d%%\n\r", (adat  & 0x000000ff00000000) >> 32); // Humidity
            pc.printf("Temperature:%d degrees\n\r", (adat & 0x0000000000ff0000) >> 16 ); // Temperature
            if((adat&0x00000000000000ff) == ((adat&0x000000ff00000000) >> 32) + ((adat&0x00000000ff000000) >> 24)
                + ((adat&0x0000000000ff0000) >> 16) + ((adat&0x000000000000ff00) >> 8)){
                pc.printf("Checksum : OK\n\r");        
            }
            else{
                pc.printf("Checksum : Error\n\r");   
            }
            
            //pc.printf("Checksum:%d\n\r", adat & 0x00000000000000ff); // Checksum.
            /*pc.printf("Checksum calculated:%d\n\r",((adat&0x000000ff00000000) >> 32) + ((adat  & 0x00000000ff000000) >> 24)
                + ((adat & 0x0000000000ff0000) >> 16) + ((adat & 0x000000000000ff00) >> 8));*/
            wait_ms(300); // Wait 0.2 sec till continue.
        } 
        else{
            myled = 0; // LED is OFF
        }
    }
}