Dth11.h & cpp
#ifndef DHT11_H #define DHT11_H #include "mbed.h" #define DHTLIB_OK 0 #define DHTLIB_ERROR_CHECKSUM -1 #define DHTLIB_ERROR_TIMEOUT -2 /** Class for the DHT11 sensor. * * Example: * @code * #include "mbed.h" * #include "Dht11.h" * * Serial pc(USBTX, USBRX); * Dht11 sensor(PTD7); * * int main() { * sensor.read() * pc.printf("T: %f, H: %d\r\n", sensor.getFahrenheit(), sensor.getHumidity()); * } * @endcode */ class Dht11 { public: /** Construct the sensor object. * * @param pin PinName for the sensor pin. */ Dht11(PinName const &p); /** Update the humidity and temp from the sensor. * * @returns * 0 on success, otherwise error. */ int read(); /** Get the temp(f) from the saved object. * * @returns * Fahrenheit float */ float getFahrenheit(); /** Get the temp(c) from the saved object. * * @returns * Celsius int */ int getCelsius(); /** Get the humidity from the saved object. * * @returns * Humidity percent int */ int getHumidity(); private: /// percentage of humidity int _humidity; /// celsius int _temperature; /// pin to read the sensor info on DigitalInOut _pin; /// times startup (must settle for at least a second) Timer _timer; }; #endif
#include "Dht11.h" Dht11::Dht11(PinName const &p) : _pin(p) { // Set creation time so we can make // sure we pause at least 1 second for // startup. _timer.start(); _temperature = 0; _humidity = 0; } int Dht11::read() { // BUFFER TO RECEIVE uint8_t bits[5]; uint8_t cnt = 7; uint8_t idx = 0; // EMPTY BUFFER for (int i=0; i< 5; i++) bits[i] = 0; // Verify sensor settled after boot while(_timer.read_ms() < 1500) {} _timer.stop(); // Notify it we are ready to read _pin.output(); _pin = 0; wait_ms(18); _pin = 1; wait_us(40); _pin.input(); // ACKNOWLEDGE or TIMEOUT unsigned int loopCnt = 10000; while(_pin == 0) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; loopCnt = 10000; while(_pin == 1) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT for (int i=0; i<40; i++) { loopCnt = 10000; while(_pin == 0) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; //unsigned long t = micros(); Timer t; t. start(); loopCnt = 10000; while(_pin == 1) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; if (t.read_us() > 40) bits[idx] |= (1 << cnt); if (cnt == 0) // next byte? { cnt = 7; // restart at MSB idx++; // next byte! } else cnt--; } // WRITE TO RIGHT VARS // as bits[1] and bits[3] are allways zero they are omitted in formulas. _humidity = bits[0]; _temperature = bits[2]; uint8_t sum = bits[0] + bits[2]; if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM; return DHTLIB_OK; } float Dht11::getFahrenheit() { return((_temperature * 1.8) + 32); } int Dht11::getCelsius() { return(_temperature); } int Dht11::getHumidity() { return(_humidity); }