This is an example program to fetch data of DHT11 Sensors

Dependencies:   mbed

Fork of DHT11_with_Nucleo by Adatgy2014

Committer:
ledonger
Date:
Wed Apr 05 13:14:12 2017 +0000
Revision:
12:31645d013d6c
Parent:
11:1379308ecace
Solved problem while reading data, because of an offset of 20?s before the sensor takes control of the data bus

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kaliczp 0:e8a1a503d390 1 #include "mbed.h"
kaliczp 0:e8a1a503d390 2
ledonger 12:31645d013d6c 3 //Tested with success on STM32 Nucleo L476
ledonger 12:31645d013d6c 4
kaliczp 2:4469aa7f4995 5 DigitalOut myled(LED1); // Activate LED
kaliczp 2:4469aa7f4995 6 DigitalIn mybutton(USER_BUTTON); // Activate button
kaliczp 2:4469aa7f4995 7 DigitalInOut data_pin(A0); // Activate digital in
kaliczp 4:62b680fac6ed 8 Serial pc(SERIAL_TX, SERIAL_RX); // Initialize UART connection
kaliczp 4:62b680fac6ed 9 // Use a terminal program (eg. TeraTerm).
kaliczp 5:76a9332af64c 10 Timer tmr; //initialize timer
kaliczp 9:a2918c6c37ee 11 uint64_t adat; // 64 bit variable for temporary data
kaliczp 5:76a9332af64c 12 int i;
kaliczp 0:e8a1a503d390 13
ledonger 12:31645d013d6c 14
kaliczp 3:6228ab73d420 15 // Function to initialize DHT11
kaliczp 3:6228ab73d420 16 void dht_read(void) {
ledonger 12:31645d013d6c 17 data_pin.output();
kaliczp 3:6228ab73d420 18 // Initialize measurement > 18 ms low
kaliczp 3:6228ab73d420 19 data_pin = 0;
kaliczp 3:6228ab73d420 20 wait_ms(20);
kaliczp 3:6228ab73d420 21 // After high and release the pin switch input mode
kaliczp 3:6228ab73d420 22 data_pin = 1;
ledonger 12:31645d013d6c 23
ledonger 12:31645d013d6c 24 wait_us(20);//Wait for the sensor to take control and set low level /!\ Important
ledonger 12:31645d013d6c 25
kaliczp 4:62b680fac6ed 26 data_pin.input();
kaliczp 5:76a9332af64c 27 // Wait until the end of 80 us low
ledonger 12:31645d013d6c 28 while(!data_pin.read());
kaliczp 5:76a9332af64c 29 // Wait until end of 80 us high
ledonger 12:31645d013d6c 30 while(data_pin.read());
kaliczp 5:76a9332af64c 31 // 40 bit, 40 read out cycle
kaliczp 5:76a9332af64c 32 for(i=0; i<40; i++) {
kaliczp 9:a2918c6c37ee 33 adat = adat << 1; // Shift for new number
kaliczp 5:76a9332af64c 34 tmr.stop(); // Stop timer if runs
kaliczp 5:76a9332af64c 35 tmr.reset(); // Reset timer
kaliczp 5:76a9332af64c 36 // Wait until pin
ledonger 12:31645d013d6c 37 while(!data_pin.read());
kaliczp 5:76a9332af64c 38 tmr.start();
ledonger 12:31645d013d6c 39 while(data_pin.read());
kaliczp 5:76a9332af64c 40 // If DHT11 HIGH longer than 40 micro seconds (hopefully 70 us)
ledonger 12:31645d013d6c 41 if(tmr.read_us() > 50) {
kaliczp 5:76a9332af64c 42 // bit is 1
kaliczp 9:a2918c6c37ee 43 adat++;
kaliczp 5:76a9332af64c 44 }
kaliczp 5:76a9332af64c 45 }
kaliczp 3:6228ab73d420 46 }
kaliczp 3:6228ab73d420 47
kaliczp 0:e8a1a503d390 48 int main() {
kaliczp 4:62b680fac6ed 49 pc.printf("Read the DHT11 temperature and humidity sensor!\n"); //Welcome message
kaliczp 0:e8a1a503d390 50 while(1) {
ledonger 12:31645d013d6c 51 if(mybutton == 0){ // Button is pressed
kaliczp 9:a2918c6c37ee 52 // Reset adat variable
kaliczp 9:a2918c6c37ee 53 adat = 0;
kaliczp 1:c0c5b5860aa8 54 myled = 1; // LED is ON
kaliczp 3:6228ab73d420 55 dht_read(); // Call the function
kaliczp 5:76a9332af64c 56 // Send result through UART result
ledonger 12:31645d013d6c 57 //pc.printf("Raw data:%10x\n\r",adat);
ledonger 12:31645d013d6c 58 pc.printf("Humidity:%d%%\n\r", (adat & 0x000000ff00000000) >> 32); // Humidity
ledonger 12:31645d013d6c 59 pc.printf("Temperature:%d degrees\n\r", (adat & 0x0000000000ff0000) >> 16 ); // Temperature
ledonger 12:31645d013d6c 60 if((adat&0x00000000000000ff) == ((adat&0x000000ff00000000) >> 32) + ((adat&0x00000000ff000000) >> 24)
ledonger 12:31645d013d6c 61 + ((adat&0x0000000000ff0000) >> 16) + ((adat&0x000000000000ff00) >> 8)){
ledonger 12:31645d013d6c 62 pc.printf("Checksum : OK\n\r");
ledonger 12:31645d013d6c 63 }
ledonger 12:31645d013d6c 64 else{
ledonger 12:31645d013d6c 65 pc.printf("Checksum : Error\n\r");
ledonger 12:31645d013d6c 66 }
ledonger 12:31645d013d6c 67
ledonger 12:31645d013d6c 68 //pc.printf("Checksum:%d\n\r", adat & 0x00000000000000ff); // Checksum.
ledonger 12:31645d013d6c 69 /*pc.printf("Checksum calculated:%d\n\r",((adat&0x000000ff00000000) >> 32) + ((adat & 0x00000000ff000000) >> 24)
ledonger 12:31645d013d6c 70 + ((adat & 0x0000000000ff0000) >> 16) + ((adat & 0x000000000000ff00) >> 8));*/
ledonger 12:31645d013d6c 71 wait_ms(300); // Wait 0.2 sec till continue.
ledonger 12:31645d013d6c 72 }
ledonger 12:31645d013d6c 73 else{
kaliczp 1:c0c5b5860aa8 74 myled = 0; // LED is OFF
kaliczp 1:c0c5b5860aa8 75 }
kaliczp 0:e8a1a503d390 76 }
kaliczp 0:e8a1a503d390 77 }