ernesto melendez / TextLCD

Dependents:   LED_RTOS4you

Committer:
fek222357
Date:
Tue Dec 04 03:07:58 2018 +0000
Revision:
9:24f0b61b6d99
GPS_RTOS

Who changed what in which revision?

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