| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /* DHT library
- MIT license
- written by Adafruit Industries
- */
- #include "DHT.h"
- #define NAN 0
- 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;
- }
|