This is an example program to fetch data of DHT11 Sensors
Fork of DHT11_with_Nucleo by
main.cpp@12:31645d013d6c, 2017-04-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |