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);
}
我要赚赏金
