....
Dependents: WizFi310_ThingPlug_Test WizFi310_ThingPlug_Test_P WizFi310_Sensor_Test
Fork of DHT11 by
Dht11.cpp
- Committer:
- fossum_13
- Date:
- 2015-02-15
- Revision:
- 0:c1da310d3e8a
- Child:
- 1:5da6f6de3e42
File content as of revision 0:c1da310d3e8a:
#include "Dht11.h"
Dht11::Dht11(PinName p) : _pin(p) {
// Set creation time so we can make
// sure we pause at least 1 second for
// startup.
_timer.start();
}
// Return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
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;
}
int Dht11::temperature() {
return(_temperature);
}
int Dht11::humidity() {
return(_humidity);
}
