Created
June 23, 2015 02:04
-
-
Save gregorthebigmac/04a04e67809ec3620fc0 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
/* DHT library | |
MIT license | |
written by Adafruit Industries | |
*/ | |
#include "DHT.h" | |
DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) { | |
_pin = pin; | |
_type = type; | |
_count = count; | |
firstreading = true; | |
} | |
void DHT::begin(void) { | |
// set up the pins! | |
pinMode(_pin, INPUT); | |
digitalWrite(_pin, HIGH); | |
_lastreadtime = 0; | |
} | |
//boolean S == Scale. True == Farenheit; False == Celcius | |
float DHT::readTemperature(bool S) { | |
float f; | |
if (read()) { | |
switch (_type) { | |
case DHT11: | |
f = data[2]; | |
if(S) | |
f = convertCtoF(f); | |
return f; | |
case DHT22: | |
case DHT21: | |
f = data[2] & 0x7F; | |
f *= 256; | |
f += data[3]; | |
f /= 10; | |
if (data[2] & 0x80) | |
f *= -1; | |
if(S) | |
f = convertCtoF(f); | |
return f; | |
} | |
} | |
Serial.print("Read fail"); | |
return NAN; | |
} | |
float DHT::convertCtoF(float c) { | |
return c * 9 / 5 + 32; | |
} | |
float DHT::readHumidity(void) { | |
float f; | |
if (read()) { | |
switch (_type) { | |
case DHT11: | |
f = data[0]; | |
return f; | |
case DHT22: | |
case DHT21: | |
f = data[0]; | |
f *= 256; | |
f += data[1]; | |
f /= 10; | |
return f; | |
} | |
} | |
Serial.print("Read fail"); | |
return NAN; | |
} | |
boolean DHT::read(void) { | |
uint8_t laststate = HIGH; | |
uint8_t counter = 0; | |
uint8_t j = 0, i; | |
unsigned long currenttime; | |
// pull the pin high and wait 250 milliseconds | |
digitalWrite(_pin, HIGH); | |
delay(250); | |
currenttime = millis(); | |
if (currenttime < _lastreadtime) { | |
// ie there was a rollover | |
_lastreadtime = 0; | |
} | |
if (!firstreading && ((currenttime - _lastreadtime) < 2000)) { | |
return true; // return last correct measurement | |
//delay(2000 - (currenttime - _lastreadtime)); | |
} | |
firstreading = false; | |
/* | |
Serial.print("Currtime: "); Serial.print(currenttime); | |
Serial.print(" Lasttime: "); Serial.print(_lastreadtime); | |
*/ | |
_lastreadtime = millis(); | |
data[0] = data[1] = data[2] = data[3] = data[4] = 0; | |
// now pull it low for ~20 milliseconds | |
pinMode(_pin, OUTPUT); | |
digitalWrite(_pin, LOW); | |
delay(20); | |
cli(); | |
digitalWrite(_pin, HIGH); | |
delayMicroseconds(40); | |
pinMode(_pin, INPUT); | |
// read in timings | |
for ( i=0; i< MAXTIMINGS; i++) { | |
counter = 0; | |
while (digitalRead(_pin) == laststate) { | |
counter++; | |
delayMicroseconds(1); | |
if (counter == 255) { | |
break; | |
} | |
} | |
laststate = digitalRead(_pin); | |
if (counter == 255) break; | |
// ignore first 3 transitions | |
if ((i >= 4) && (i%2 == 0)) { | |
// shove each bit into the storage bytes | |
data[j/8] <<= 1; | |
if (counter > _count) | |
data[j/8] |= 1; | |
j++; | |
} | |
} | |
sei(); | |
/* | |
Serial.println(j, DEC); | |
Serial.print(data[0], HEX); Serial.print(", "); | |
Serial.print(data[1], HEX); Serial.print(", "); | |
Serial.print(data[2], HEX); Serial.print(", "); | |
Serial.print(data[3], HEX); Serial.print(", "); | |
Serial.print(data[4], HEX); Serial.print(" =? "); | |
Serial.println(data[0] + data[1] + data[2] + data[3], HEX); | |
*/ | |
// check we read 40 bits and that the checksum matches | |
if ((j >= 40) && | |
(data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) { | |
return true; | |
} | |
return false; | |
} |
This file contains hidden or 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
#ifndef DHT_H | |
#define DHT_H | |
#if ARDUINO >= 100 | |
#include "Arduino.h" | |
#else | |
#include "WProgram.h" | |
#endif | |
/* DHT library | |
MIT license | |
written by Adafruit Industries | |
*/ | |
// how many timing transitions we need to keep track of. 2 * number bits + extra | |
#define MAXTIMINGS 85 | |
#define DHT11 11 | |
#define DHT22 22 | |
#define DHT21 21 | |
#define AM2301 21 | |
class DHT { | |
private: | |
uint8_t data[6]; | |
uint8_t _pin, _type, _count; | |
boolean read(void); | |
unsigned long _lastreadtime; | |
boolean firstreading; | |
public: | |
DHT(uint8_t pin, uint8_t type, uint8_t count=6); | |
void begin(void); | |
float readTemperature(bool S=false); | |
float convertCtoF(float); | |
float readHumidity(void); | |
}; | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment