Simple example to read humidity and temperature from DHT11 sensor using DISCO-L475VG-IOT01A.

Dependencies:   mbed

Fork of Nucleo_DHT11_Example by Ro Led

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?

UserRevisionLine numberNew 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 };