diff --git a/DHT.cpp b/DHT.cpp index 79f6a40..c2257d0 100644 --- a/DHT.cpp +++ b/DHT.cpp @@ -6,10 +6,11 @@ written by Adafruit Industries #include "DHT.h" +#define MIN_INTERVAL 2000 + DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) { _pin = pin; _type = type; - _firstreading = true; _bit = digitalPinToBitMask(pin); _port = digitalPinToPort(pin); _maxcycles = microsecondsToClockCycles(1000); // 1 millisecond timeout for @@ -20,17 +21,19 @@ DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) { void DHT::begin(void) { // set up the pins! - pinMode(_pin, INPUT); - digitalWrite(_pin, HIGH); - _lastreadtime = 0; + pinMode(_pin, INPUT_PULLUP); + // Using this value makes sure that millis() - lastreadtime will be + // >= MIN_INTERVAL right away. Note that this assignment wraps around, + // but so will the subtraction. + _lastreadtime = -MIN_INTERVAL; DEBUG_PRINT("Max clock cycles: "); DEBUG_PRINTLN(_maxcycles, DEC); } //boolean S == Scale. True == Fahrenheit; False == Celcius -float DHT::readTemperature(bool S) { +float DHT::readTemperature(bool S, bool force) { float f = NAN; - if (read()) { + if (read(force)) { switch (_type) { case DHT11: f = data[2]; @@ -64,7 +67,7 @@ float DHT::convertFtoC(float f) { return (f - 32) * 5 / 9; } -float DHT::readHumidity(void) { +float DHT::readHumidity(bool force) { float f = NAN; if (read()) { switch (_type) { @@ -113,19 +116,14 @@ float DHT::computeHeatIndex(float temperature, float percentHumidity, bool isFah } } -boolean DHT::read(void) { +boolean DHT::read(bool force) { // Check if sensor was read less than two seconds ago and return early // to use last reading. uint32_t currenttime = millis(); - if (currenttime < _lastreadtime) { - // ie there was a rollover - _lastreadtime = 0; - } - if (!_firstreading && ((currenttime - _lastreadtime) < 2000)) { + if (!force && ((currenttime - _lastreadtime) < 2000)) { return _lastresult; // return last correct measurement } - _firstreading = false; - _lastreadtime = millis(); + _lastreadtime = currenttime; // Reset 40 bits of received data to zero. data[0] = data[1] = data[2] = data[3] = data[4] = 0; @@ -154,7 +152,7 @@ boolean DHT::read(void) { delayMicroseconds(40); // Now start reading the data line to get the value from the DHT sensor. - pinMode(_pin, INPUT); + pinMode(_pin, INPUT_PULLUP); delayMicroseconds(10); // Delay a bit to let sensor pull data line low. // First expect a low signal for ~80 microseconds followed by a high signal diff --git a/DHT.h b/DHT.h index dd4d1f5..5d92f06 100644 --- a/DHT.h +++ b/DHT.h @@ -39,18 +39,17 @@ class DHT { public: DHT(uint8_t pin, uint8_t type, uint8_t count=6); void begin(void); - float readTemperature(bool S=false); + float readTemperature(bool S=false, bool force=false); float convertCtoF(float); float convertFtoC(float); float computeHeatIndex(float temperature, float percentHumidity, bool isFahrenheit=true); - float readHumidity(void); - boolean read(void); + float readHumidity(bool force=false); + boolean read(bool force=false); private: - uint8_t data[6]; + uint8_t data[5]; uint8_t _pin, _type, _bit, _port; uint32_t _lastreadtime, _maxcycles; - bool _firstreading; bool _lastresult; uint32_t expectPulse(bool level); diff --git a/library.properties b/library.properties index d8bfdf1..49c992d 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=DHT sensor library -version=1.1.1 +version=1.2.0 author=Adafruit maintainer=Adafruit sentence=Arduino library for DHT11, DHT22, etc Temp & Humidity Sensors