11 Commits
1.1.1 ... 1.2.1

Author SHA1 Message Date
5fb1668822 Merge branch 'jmdana-master' 2015-10-05 17:55:14 -07:00
c57f0c8c29 Bump version to 1.2.1 2015-10-05 17:54:59 -07:00
51a8b814ac Divisions have been replaced by multiplications. 2015-10-03 13:42:09 +01:00
36fb16274b DHT::computeHeatIndex has been modified so it uses both Rothfusz and
Steadman's equations. As a result, it allows a larger range of
temperatures and more accurate results for extreme conditions.
2015-10-02 21:50:43 +01:00
6c0c723907 Merge branch 'matthijskooijman-fixes' 2015-09-15 12:26:54 -07:00
232ad0cd70 Bump version to 1.2.0 after integrating optimizations from matthijskooijman. 2015-09-15 12:26:38 -07:00
f9c3f323e3 Use INPUT_PULLUP
Previously, the mode was configured to INPUT and then written HIGH,
which works on AVR but isn't very portable. Instead, this uses the
INPUT_PULLUP pin mode (available since Arduino 1.0.1) which is portable.
2015-07-24 21:44:41 +02:00
45a20da301 Shrink DHT::data to 5 bytes
There's only 5 bytes of data being transferred (2x2 bytes of data, 1
byte checksum), so no need to keep a useless byte.
2015-07-24 21:43:52 +02:00
5973929e63 Remove the firstreading variable
By cleverly setting _lastreadtime in begin() to make sure that it looks
like the last read was alrady 2000 ms ago, even on startup when millis()
still returns 0, there is no longer a need to keep a separate
firstreading variable, saving a byte of memory and a bit of code.
2015-07-24 21:42:58 +02:00
f1b79028ea Clean up two-second interval check
There was some handling of millis() overflow that is not needed.
Standard unsigned subtraction and wraparound already works as expected,
so this extra check can be removed (it even hurts, since it introduces 2
seconds after a wraparound where no new data will be read, even if it
could otherwise happen).

Also, this prevents calling millis() a second time, since its value is
already known.
2015-07-24 21:41:19 +02:00
04905bc5cd Add force parameter to read methods
This allows forcing a read, even if the previous read was less than 2
seconds ago. This is useful in cases where the millis() timer is not
reliable, such as when sleeping. In this case, it is up to the caller to
ensure that at least 2 seconds elapse between calls with force set to
true.
2015-07-24 21:40:22 +02:00
3 changed files with 38 additions and 39 deletions

66
DHT.cpp
View File

@ -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) {
@ -85,23 +88,17 @@ float DHT::readHumidity(void) {
//boolean isFahrenheit: True == Fahrenheit; False == Celcius
float DHT::computeHeatIndex(float temperature, float percentHumidity, bool isFahrenheit) {
// Adapted from equation at: https://github.com/adafruit/DHT-sensor-library/issues/9 and
// Wikipedia: http://en.wikipedia.org/wiki/Heat_index
if (!isFahrenheit) {
// Celsius heat index calculation.
return -8.784695 +
1.61139411 * temperature +
2.338549 * percentHumidity +
-0.14611605 * temperature*percentHumidity +
-0.01230809 * pow(temperature, 2) +
-0.01642482 * pow(percentHumidity, 2) +
0.00221173 * pow(temperature, 2) * percentHumidity +
0.00072546 * temperature*pow(percentHumidity, 2) +
-0.00000358 * pow(temperature, 2) * pow(percentHumidity, 2);
}
else {
// Fahrenheit heat index calculation.
return -42.379 +
// Using both Rothfusz and Steadman's equations
// http://www.wpc.ncep.noaa.gov/html/heatindex_equation.shtml
float hi;
if (!isFahrenheit)
temperature = convertCtoF(temperature);
hi = 0.5 * (temperature + 61.0 + ((temperature - 68.0) * 1.2) + (percentHumidity * 0.094));
if (hi > 79) {
hi = -42.379 +
2.04901523 * temperature +
10.14333127 * percentHumidity +
-0.22475541 * temperature*percentHumidity +
@ -110,22 +107,25 @@ float DHT::computeHeatIndex(float temperature, float percentHumidity, bool isFah
0.00122874 * pow(temperature, 2) * percentHumidity +
0.00085282 * temperature*pow(percentHumidity, 2) +
-0.00000199 * pow(temperature, 2) * pow(percentHumidity, 2);
if((percentHumidity < 13) && (temperature >= 80.0) && (temperature <= 112.0))
hi -= ((13.0 - percentHumidity) * 0.25) * sqrt((17.0 - abs(temperature - 95.0)) * 0.05882);
else if((percentHumidity > 85.0) && (temperature >= 80.0) && (temperature <= 87.0))
hi += ((percentHumidity - 85.0) * 0.1) * ((87.0 - temperature) * 0.2);
}
return isFahrenheit ? hi : convertFtoC(hi);
}
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 +154,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

9
DHT.h
View File

@ -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);

View File

@ -1,5 +1,5 @@
name=DHT sensor library
version=1.1.1
version=1.2.1
author=Adafruit
maintainer=Adafruit <info@adafruit.com>
sentence=Arduino library for DHT11, DHT22, etc Temp & Humidity Sensors