Created
October 30, 2015 08:10
-
-
Save dougrchamberlain/92f7b43855e72144c6ee to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// FILE: dht11.cpp | |
// VERSION: 0.4.1 | |
// PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino | |
// LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html) | |
// | |
// DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf | |
// | |
// HISTORY: | |
// George Hadjikyriacou - Original version (??) | |
// Mod by SimKard - Version 0.2 (24/11/2010) | |
// Mod by Rob Tillaart - Version 0.3 (28/03/2011) | |
// + added comments | |
// + removed all non DHT11 specific code | |
// + added references | |
// Mod by Rob Tillaart - Version 0.4 (17/03/2012) | |
// + added 1.0 support | |
// Mod by Rob Tillaart - Version 0.4.1 (19/05/2012) | |
// + added error codes | |
// | |
#include "dht11.h" | |
// Return values: | |
// DHTLIB_OK | |
// DHTLIB_ERROR_CHECKSUM | |
// DHTLIB_ERROR_TIMEOUT | |
int dht11::read(int pin) | |
{ | |
// 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; | |
// REQUEST SAMPLE | |
pinMode(pin, OUTPUT); | |
digitalWrite(pin, LOW); | |
delay(18); | |
digitalWrite(pin, HIGH); | |
delayMicroseconds(40); | |
pinMode(pin, INPUT); | |
// ACKNOWLEDGE or TIMEOUT | |
unsigned int loopCnt = 10000; | |
while(digitalRead(pin) == LOW) | |
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; | |
loopCnt = 10000; | |
while(digitalRead(pin) == HIGH) | |
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(digitalRead(pin) == LOW) | |
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; | |
unsigned long t = micros(); | |
loopCnt = 10000; | |
while(digitalRead(pin) == HIGH) | |
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; | |
if ((micros() - t) > 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; | |
} | |
// | |
// END OF FILE | |
// |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment