Project aiming to do a Bluetooth Low Energy IoT devices, which measure temperature and humidity. Bluetooth achieved with the IDB05A1 shield. Temperature/humidity achieved with a DHT11 sensor. Project working, tested on an STM32 L476 board.

Dependencies:   BLE_API X_NUCLEO_IDB0XA1 mbed

Committer:
ledonger
Date:
Fri Apr 07 11:36:47 2017 +0000
Revision:
0:d2c18f736df1
Child:
1:023e1eae2048
Working version

Who changed what in which revision?

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