Simple example to read humidity and temperature from DHT11 sensor using DISCO-L475VG-IOT01A.
Fork of Nucleo_DHT11_Example by
DHT11.h@2:4815ae0a2549, 2018-04-18 (annotated)
- Committer:
- sliawatimena
- Date:
- Wed Apr 18 04:39:16 2018 +0000
- Revision:
- 2:4815ae0a2549
- Parent:
- 0:dbffab632178
Tested on DISCO-L475VG-IOT01A successfully.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ledonger | 0:dbffab632178 | 1 | #include "mbed.h" |
ledonger | 0:dbffab632178 | 2 | |
ledonger | 0:dbffab632178 | 3 | //Class to manage DHT11 sensor |
ledonger | 0:dbffab632178 | 4 | class DHT11{ |
ledonger | 0:dbffab632178 | 5 | |
ledonger | 0:dbffab632178 | 6 | public: |
ledonger | 0:dbffab632178 | 7 | /* Takes the data pin of the sensor in parameter */ |
ledonger | 0:dbffab632178 | 8 | DHT11(PinName pin):dataPin(pin) |
ledonger | 0:dbffab632178 | 9 | { |
ledonger | 0:dbffab632178 | 10 | iBit = 0; |
ledonger | 0:dbffab632178 | 11 | data = 0; |
ledonger | 0:dbffab632178 | 12 | } |
ledonger | 0:dbffab632178 | 13 | |
ledonger | 0:dbffab632178 | 14 | /* Request and receive new data from sensor |
ledonger | 0:dbffab632178 | 15 | Returns : |
ledonger | 0:dbffab632178 | 16 | 1 : OK |
ledonger | 0:dbffab632178 | 17 | -1 : Checksum Error |
ledonger | 0:dbffab632178 | 18 | */ |
ledonger | 0:dbffab632178 | 19 | int readData(void){ |
ledonger | 0:dbffab632178 | 20 | this->data = 0; |
ledonger | 0:dbffab632178 | 21 | this->dataPin.output(); |
ledonger | 0:dbffab632178 | 22 | // Request a measurement (low during t > 18ms) |
ledonger | 0:dbffab632178 | 23 | this->dataPin = 0; |
ledonger | 0:dbffab632178 | 24 | wait_ms(20); |
ledonger | 0:dbffab632178 | 25 | this->dataPin = 1; |
ledonger | 0:dbffab632178 | 26 | |
ledonger | 0:dbffab632178 | 27 | //Wait for the sensor to take control and set low level /!\ Important |
ledonger | 0:dbffab632178 | 28 | wait_us(20); |
ledonger | 0:dbffab632178 | 29 | |
ledonger | 0:dbffab632178 | 30 | this->dataPin.input(); |
ledonger | 0:dbffab632178 | 31 | |
ledonger | 0:dbffab632178 | 32 | //TODO Check if timing is correct (low : 80µs ; high 80µs) |
ledonger | 0:dbffab632178 | 33 | // Wait until end of 80µs low |
ledonger | 0:dbffab632178 | 34 | while(!this->dataPin.read()); |
ledonger | 0:dbffab632178 | 35 | // Wait until end of 80 µs high |
ledonger | 0:dbffab632178 | 36 | while(this->dataPin.read()); |
ledonger | 0:dbffab632178 | 37 | |
ledonger | 0:dbffab632178 | 38 | // Sensor reply 40bits |
ledonger | 0:dbffab632178 | 39 | for(iBit=0; iBit<40; iBit++) { |
ledonger | 0:dbffab632178 | 40 | this->data = this->data << 1; // Shift for new number |
ledonger | 0:dbffab632178 | 41 | this->timer.stop(); |
ledonger | 0:dbffab632178 | 42 | this->timer.reset(); |
ledonger | 0:dbffab632178 | 43 | |
ledonger | 0:dbffab632178 | 44 | // Wait for low level to end |
ledonger | 0:dbffab632178 | 45 | while(!this->dataPin.read()); |
ledonger | 0:dbffab632178 | 46 | this->timer.start(); |
ledonger | 0:dbffab632178 | 47 | // Count time while high level |
ledonger | 0:dbffab632178 | 48 | while(this->dataPin.read()); |
ledonger | 0:dbffab632178 | 49 | |
ledonger | 0:dbffab632178 | 50 | if(this->timer.read_us() > 50) |
ledonger | 0:dbffab632178 | 51 | { |
ledonger | 0:dbffab632178 | 52 | //This bit is '1' |
ledonger | 0:dbffab632178 | 53 | this->data++; |
ledonger | 0:dbffab632178 | 54 | } |
ledonger | 0:dbffab632178 | 55 | } |
ledonger | 0:dbffab632178 | 56 | |
ledonger | 0:dbffab632178 | 57 | wait_ms(250); |
ledonger | 0:dbffab632178 | 58 | |
ledonger | 0:dbffab632178 | 59 | //Checking checksum |
ledonger | 0:dbffab632178 | 60 | if((this->data & 0x00000000000000ff) != ((this->data & 0x000000ff00000000) >> 32) + |
ledonger | 0:dbffab632178 | 61 | ((this->data & 0x00000000ff000000) >> 24) + |
ledonger | 0:dbffab632178 | 62 | ((this->data & 0x0000000000ff0000) >> 16) + |
ledonger | 0:dbffab632178 | 63 | ((this->data & 0x000000000000ff00) >> 8)) |
ledonger | 0:dbffab632178 | 64 | { |
ledonger | 0:dbffab632178 | 65 | return -1; |
ledonger | 0:dbffab632178 | 66 | } |
ledonger | 0:dbffab632178 | 67 | |
ledonger | 0:dbffab632178 | 68 | return 1; |
ledonger | 0:dbffab632178 | 69 | } |
ledonger | 0:dbffab632178 | 70 | |
ledonger | 0:dbffab632178 | 71 | int getTemperature(void){ |
ledonger | 0:dbffab632178 | 72 | return (int)((this->data & 0x0000000000ff0000) >> 16); |
ledonger | 0:dbffab632178 | 73 | } |
ledonger | 0:dbffab632178 | 74 | |
ledonger | 0:dbffab632178 | 75 | int getHumidity(void){ |
ledonger | 0:dbffab632178 | 76 | return (int)((this->data & 0x000000ff00000000) >> 32); |
ledonger | 0:dbffab632178 | 77 | } |
ledonger | 0:dbffab632178 | 78 | |
ledonger | 0:dbffab632178 | 79 | |
ledonger | 0:dbffab632178 | 80 | private: |
ledonger | 0:dbffab632178 | 81 | DigitalInOut dataPin;//Communication with the sensor |
ledonger | 0:dbffab632178 | 82 | Timer timer; //initialize timer |
ledonger | 0:dbffab632178 | 83 | uint64_t data; // 64 bit variable for temporary data |
ledonger | 0:dbffab632178 | 84 | int iBit; |
ledonger | 0:dbffab632178 | 85 | }; |