Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
DHT11.h@9:24f0b61b6d99, 2018-12-04 (annotated)
- Committer:
- fek222357
- Date:
- Tue Dec 04 03:07:58 2018 +0000
- Revision:
- 9:24f0b61b6d99
GPS_RTOS
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| fek222357 | 9:24f0b61b6d99 | 1 | #include "mbed.h" |
| fek222357 | 9:24f0b61b6d99 | 2 | |
| fek222357 | 9:24f0b61b6d99 | 3 | //Class to manage DHT11 sensor |
| fek222357 | 9:24f0b61b6d99 | 4 | class DHT11{ |
| fek222357 | 9:24f0b61b6d99 | 5 | |
| fek222357 | 9:24f0b61b6d99 | 6 | public: |
| fek222357 | 9:24f0b61b6d99 | 7 | /* Takes the data pin of the sensor in parameter */ |
| fek222357 | 9:24f0b61b6d99 | 8 | DHT11(PinName pin):dataPin(pin) |
| fek222357 | 9:24f0b61b6d99 | 9 | { |
| fek222357 | 9:24f0b61b6d99 | 10 | iBit = 0; |
| fek222357 | 9:24f0b61b6d99 | 11 | data = 0; |
| fek222357 | 9:24f0b61b6d99 | 12 | } |
| fek222357 | 9:24f0b61b6d99 | 13 | |
| fek222357 | 9:24f0b61b6d99 | 14 | /* Request and receive new data from sensor |
| fek222357 | 9:24f0b61b6d99 | 15 | Returns : |
| fek222357 | 9:24f0b61b6d99 | 16 | 1 : OK |
| fek222357 | 9:24f0b61b6d99 | 17 | -1 : Checksum Error |
| fek222357 | 9:24f0b61b6d99 | 18 | */ |
| fek222357 | 9:24f0b61b6d99 | 19 | int readData(void){ |
| fek222357 | 9:24f0b61b6d99 | 20 | this->data = 0; |
| fek222357 | 9:24f0b61b6d99 | 21 | this->dataPin.output(); |
| fek222357 | 9:24f0b61b6d99 | 22 | // Request a measurement (low during t > 18ms) |
| fek222357 | 9:24f0b61b6d99 | 23 | this->dataPin = 0; |
| fek222357 | 9:24f0b61b6d99 | 24 | wait_ms(20); |
| fek222357 | 9:24f0b61b6d99 | 25 | this->dataPin = 1; |
| fek222357 | 9:24f0b61b6d99 | 26 | |
| fek222357 | 9:24f0b61b6d99 | 27 | //Wait for the sensor to take control and set low level /!\ Important |
| fek222357 | 9:24f0b61b6d99 | 28 | wait_us(20); |
| fek222357 | 9:24f0b61b6d99 | 29 | |
| fek222357 | 9:24f0b61b6d99 | 30 | this->dataPin.input(); |
| fek222357 | 9:24f0b61b6d99 | 31 | |
| fek222357 | 9:24f0b61b6d99 | 32 | //TODO Check if timing is correct (low : 80µs ; high 80µs) |
| fek222357 | 9:24f0b61b6d99 | 33 | // Wait until end of 80µs low |
| fek222357 | 9:24f0b61b6d99 | 34 | while(!this->dataPin.read()); |
| fek222357 | 9:24f0b61b6d99 | 35 | // Wait until end of 80 µs high |
| fek222357 | 9:24f0b61b6d99 | 36 | while(this->dataPin.read()); |
| fek222357 | 9:24f0b61b6d99 | 37 | |
| fek222357 | 9:24f0b61b6d99 | 38 | // Sensor reply 40bits |
| fek222357 | 9:24f0b61b6d99 | 39 | for(iBit=0; iBit<40; iBit++) { |
| fek222357 | 9:24f0b61b6d99 | 40 | this->data = this->data << 1; // Shift for new number |
| fek222357 | 9:24f0b61b6d99 | 41 | this->timer.stop(); |
| fek222357 | 9:24f0b61b6d99 | 42 | this->timer.reset(); |
| fek222357 | 9:24f0b61b6d99 | 43 | |
| fek222357 | 9:24f0b61b6d99 | 44 | // Wait for low level to end |
| fek222357 | 9:24f0b61b6d99 | 45 | while(!this->dataPin.read()); |
| fek222357 | 9:24f0b61b6d99 | 46 | this->timer.start(); |
| fek222357 | 9:24f0b61b6d99 | 47 | // Count time while high level |
| fek222357 | 9:24f0b61b6d99 | 48 | while(this->dataPin.read()); |
| fek222357 | 9:24f0b61b6d99 | 49 | |
| fek222357 | 9:24f0b61b6d99 | 50 | if(this->timer.read_us() > 50) |
| fek222357 | 9:24f0b61b6d99 | 51 | { |
| fek222357 | 9:24f0b61b6d99 | 52 | //This bit is '1' |
| fek222357 | 9:24f0b61b6d99 | 53 | this->data++; |
| fek222357 | 9:24f0b61b6d99 | 54 | } |
| fek222357 | 9:24f0b61b6d99 | 55 | } |
| fek222357 | 9:24f0b61b6d99 | 56 | |
| fek222357 | 9:24f0b61b6d99 | 57 | wait_ms(250); |
| fek222357 | 9:24f0b61b6d99 | 58 | |
| fek222357 | 9:24f0b61b6d99 | 59 | //Checking checksum |
| fek222357 | 9:24f0b61b6d99 | 60 | if((this->data & 0x00000000000000ff) != ((this->data & 0x000000ff00000000) >> 32) + |
| fek222357 | 9:24f0b61b6d99 | 61 | ((this->data & 0x00000000ff000000) >> 24) + |
| fek222357 | 9:24f0b61b6d99 | 62 | ((this->data & 0x0000000000ff0000) >> 16) + |
| fek222357 | 9:24f0b61b6d99 | 63 | ((this->data & 0x000000000000ff00) >> 8)) |
| fek222357 | 9:24f0b61b6d99 | 64 | { |
| fek222357 | 9:24f0b61b6d99 | 65 | return -1; |
| fek222357 | 9:24f0b61b6d99 | 66 | } |
| fek222357 | 9:24f0b61b6d99 | 67 | |
| fek222357 | 9:24f0b61b6d99 | 68 | return 1; |
| fek222357 | 9:24f0b61b6d99 | 69 | } |
| fek222357 | 9:24f0b61b6d99 | 70 | |
| fek222357 | 9:24f0b61b6d99 | 71 | int getTemperature(void){ |
| fek222357 | 9:24f0b61b6d99 | 72 | return (int)((this->data & 0x0000000000ff0000) >> 16); |
| fek222357 | 9:24f0b61b6d99 | 73 | } |
| fek222357 | 9:24f0b61b6d99 | 74 | |
| fek222357 | 9:24f0b61b6d99 | 75 | int getHumidity(void){ |
| fek222357 | 9:24f0b61b6d99 | 76 | return (int)((this->data & 0x000000ff00000000) >> 32); |
| fek222357 | 9:24f0b61b6d99 | 77 | } |
| fek222357 | 9:24f0b61b6d99 | 78 | |
| fek222357 | 9:24f0b61b6d99 | 79 | |
| fek222357 | 9:24f0b61b6d99 | 80 | private: |
| fek222357 | 9:24f0b61b6d99 | 81 | DigitalInOut dataPin;//Communication with the sensor |
| fek222357 | 9:24f0b61b6d99 | 82 | Timer timer; //initialize timer |
| fek222357 | 9:24f0b61b6d99 | 83 | uint64_t data; // 64 bit variable for temporary data |
| fek222357 | 9:24f0b61b6d99 | 84 | int iBit; |
| fek222357 | 9:24f0b61b6d99 | 85 | }; |