mirror of
https://github.com/adafruit/DHT-sensor-library.git
synced 2023-10-23 22:20:38 +03:00
Compare commits
72 Commits
Author | SHA1 | Date | |
---|---|---|---|
9bf12551d8 | |||
7cec0cb06d | |||
1e752b12ee | |||
8b9624479e | |||
57fe95c1be | |||
d6488c1fbe | |||
d26e8ec729 | |||
b781f5998d | |||
01490aa8de | |||
261e997a90 | |||
bdd2756ed1 | |||
07da1cd001 | |||
b3b0b08d6d | |||
be8859e28c | |||
bf86a4068c | |||
f8d3497fac | |||
4bc4ec3fc4 | |||
efcca31a7f | |||
fa129747e8 | |||
dff65098bb | |||
73409c143c | |||
5550a040c2 | |||
dc71b006b6 | |||
562a4878a9 | |||
b429942ce8 | |||
7787bdd186 | |||
2dfa77993d | |||
f771939337 | |||
6b8b1ccdb9 | |||
a1169d20b4 | |||
3bba771f8c | |||
5211b2d701 | |||
a607a50475 | |||
b07db5af21 | |||
761f4f4fb9 | |||
16e61f1084 | |||
c978977718 | |||
519393f42e | |||
09344416d2 | |||
6722942d6c | |||
cad6977ba8 | |||
53375d8d70 | |||
89937d5d25 | |||
edcd0e06e6 | |||
15020aa891 | |||
572347f137 | |||
e9daf69083 | |||
56058fecc5 | |||
d71288af17 | |||
ce3190f65c | |||
5bc0a5c796 | |||
5fb1668822 | |||
c57f0c8c29 | |||
51a8b814ac | |||
36fb16274b | |||
6c0c723907 | |||
232ad0cd70 | |||
f9c3f323e3 | |||
45a20da301 | |||
5973929e63 | |||
f1b79028ea | |||
04905bc5cd | |||
5cd78aead6 | |||
85d85170bd | |||
9419315c50 | |||
a2208eb813 | |||
a1393fc0ff | |||
ef9590ad96 | |||
b6925ee001 | |||
729895339c | |||
9d7a9da8ae | |||
25942ac8b9 |
46
.github/ISSUE_TEMPLATE.md
vendored
Normal file
46
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,46 @@
|
||||
Thank you for opening an issue on an Adafruit Arduino library repository. To
|
||||
improve the speed of resolution please review the following guidelines and
|
||||
common troubleshooting steps below before creating the issue:
|
||||
|
||||
- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use
|
||||
the forums at http://forums.adafruit.com to ask questions and troubleshoot why
|
||||
something isn't working as expected. In many cases the problem is a common issue
|
||||
that you will more quickly receive help from the forum community. GitHub issues
|
||||
are meant for known defects in the code. If you don't know if there is a defect
|
||||
in the code then start with troubleshooting on the forum first.
|
||||
|
||||
- **If following a tutorial or guide be sure you didn't miss a step.** Carefully
|
||||
check all of the steps and commands to run have been followed. Consult the
|
||||
forum if you're unsure or have questions about steps in a guide/tutorial.
|
||||
|
||||
- **For Arduino projects check these very common issues to ensure they don't apply**:
|
||||
|
||||
- For uploading sketches or communicating with the board make sure you're using
|
||||
a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes
|
||||
very hard to tell the difference between a data and charge cable! Try using the
|
||||
cable with other devices or swapping to another cable to confirm it is not
|
||||
the problem.
|
||||
|
||||
- **Be sure you are supplying adequate power to the board.** Check the specs of
|
||||
your board and plug in an external power supply. In many cases just
|
||||
plugging a board into your computer is not enough to power it and other
|
||||
peripherals.
|
||||
|
||||
- **Double check all soldering joints and connections.** Flakey connections
|
||||
cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints.
|
||||
|
||||
- **Ensure you are using an official Arduino or Adafruit board.** We can't
|
||||
guarantee a clone board will have the same functionality and work as expected
|
||||
with this code and don't support them.
|
||||
|
||||
If you're sure this issue is a defect in the code and checked the steps above
|
||||
please fill in the following fields to provide enough troubleshooting information.
|
||||
You may delete the guideline and text above to just leave the following details:
|
||||
|
||||
- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE**
|
||||
|
||||
- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO
|
||||
VERSION HERE**
|
||||
|
||||
- List the steps to reproduce the problem below (if possible attach a sketch or
|
||||
copy the sketch code in too): **LIST REPRO STEPS BELOW**
|
26
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
26
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
Thank you for creating a pull request to contribute to Adafruit's GitHub code!
|
||||
Before you open the request please review the following guidelines and tips to
|
||||
help it be more easily integrated:
|
||||
|
||||
- **Describe the scope of your change--i.e. what the change does and what parts
|
||||
of the code were modified.** This will help us understand any risks of integrating
|
||||
the code.
|
||||
|
||||
- **Describe any known limitations with your change.** For example if the change
|
||||
doesn't apply to a supported platform of the library please mention it.
|
||||
|
||||
- **Please run any tests or examples that can exercise your modified code.** We
|
||||
strive to not break users of the code and running tests/examples helps with this
|
||||
process.
|
||||
|
||||
Thank you again for contributing! We will try to test and integrate the change
|
||||
as soon as we can, but be aware we have many GitHub repositories to manage and
|
||||
can't immediately respond to every request. There is no need to bump or check in
|
||||
on a pull request (it will clutter the discussion of the request).
|
||||
|
||||
Also don't be worried if the request is closed or not integrated--sometimes the
|
||||
priorities of Adafruit's GitHub code (education, ease of use) might not match the
|
||||
priorities of the pull request. Don't fret, the open source community thrives on
|
||||
forks and GitHub makes it easy to keep your changes in a forked repo.
|
||||
|
||||
After reviewing the guidelines above you can delete this text from the pull request.
|
398
DHT.cpp
398
DHT.cpp
@ -6,174 +6,290 @@ written by Adafruit Industries
|
||||
|
||||
#include "DHT.h"
|
||||
|
||||
#define MIN_INTERVAL 2000
|
||||
#define TIMEOUT -1
|
||||
|
||||
DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) {
|
||||
_pin = pin;
|
||||
_type = type;
|
||||
_count = count;
|
||||
firstreading = true;
|
||||
#ifdef __AVR
|
||||
_bit = digitalPinToBitMask(pin);
|
||||
_port = digitalPinToPort(pin);
|
||||
#endif
|
||||
_maxcycles = microsecondsToClockCycles(1000); // 1 millisecond timeout for
|
||||
// reading pulses from DHT sensor.
|
||||
// Note that count is now ignored as the DHT reading algorithm adjusts itself
|
||||
// based on the speed of the processor.
|
||||
}
|
||||
|
||||
void DHT::begin(void) {
|
||||
// Optionally pass pull-up time (in microseconds) before DHT reading starts.
|
||||
// Default is 55 (see function declaration in DHT.h).
|
||||
void DHT::begin(uint8_t usec) {
|
||||
// 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 = millis() - MIN_INTERVAL;
|
||||
DEBUG_PRINT("DHT max clock cycles: "); DEBUG_PRINTLN(_maxcycles, DEC);
|
||||
pullTime = usec;
|
||||
}
|
||||
|
||||
//boolean S == Scale. True == Farenheit; False == Celcius
|
||||
float DHT::readTemperature(bool S) {
|
||||
float f;
|
||||
//boolean S == Scale. True == Fahrenheit; False == Celcius
|
||||
float DHT::readTemperature(bool S, bool force) {
|
||||
float f = NAN;
|
||||
|
||||
if (read()) {
|
||||
if (read(force)) {
|
||||
switch (_type) {
|
||||
case DHT11:
|
||||
f = data[2];
|
||||
if(S)
|
||||
if (data[3] & 0x80) {
|
||||
f = -1 - f ;
|
||||
}
|
||||
f += (data[3] & 0x0f) * 0.1;
|
||||
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)
|
||||
}
|
||||
break;
|
||||
case DHT12:
|
||||
f = data[2];
|
||||
f += (data[3] & 0x0f) * 0.1;
|
||||
if (data[2] & 0x80) {
|
||||
f *= -1;
|
||||
if(S)
|
||||
}
|
||||
if(S) {
|
||||
f = convertCtoF(f);
|
||||
|
||||
return f;
|
||||
}
|
||||
}
|
||||
return NAN;
|
||||
}
|
||||
|
||||
float DHT::convertCtoF(float c) {
|
||||
return c * 9 / 5 + 32;
|
||||
}
|
||||
|
||||
float DHT::convertFtoC(float f) {
|
||||
return (f - 32) * 5 / 9;
|
||||
}
|
||||
|
||||
float DHT::readHumidity(void) {
|
||||
float f;
|
||||
if (read()) {
|
||||
switch (_type) {
|
||||
case DHT11:
|
||||
f = data[0];
|
||||
return f;
|
||||
break;
|
||||
case DHT22:
|
||||
case DHT21:
|
||||
f = data[0];
|
||||
f *= 256;
|
||||
f += data[1];
|
||||
f /= 10;
|
||||
return f;
|
||||
f = ((word)(data[2] & 0x7F)) << 8 | data[3];
|
||||
f *= 0.1;
|
||||
if (data[2] & 0x80) {
|
||||
f *= -1;
|
||||
}
|
||||
if(S) {
|
||||
f = convertCtoF(f);
|
||||
}
|
||||
return NAN;
|
||||
}
|
||||
|
||||
float DHT::computeHeatIndex(float tempFahrenheit, float percentHumidity) {
|
||||
// Adapted from equation at: https://github.com/adafruit/DHT-sensor-library/issues/9 and
|
||||
// Wikipedia: http://en.wikipedia.org/wiki/Heat_index
|
||||
return -42.379 +
|
||||
2.04901523 * tempFahrenheit +
|
||||
10.14333127 * percentHumidity +
|
||||
-0.22475541 * tempFahrenheit*percentHumidity +
|
||||
-0.00683783 * pow(tempFahrenheit, 2) +
|
||||
-0.05481717 * pow(percentHumidity, 2) +
|
||||
0.00122874 * pow(tempFahrenheit, 2) * percentHumidity +
|
||||
0.00085282 * tempFahrenheit*pow(percentHumidity, 2) +
|
||||
-0.00000199 * pow(tempFahrenheit, 2) * pow(percentHumidity, 2);
|
||||
}
|
||||
|
||||
|
||||
boolean DHT::read(void) {
|
||||
uint8_t laststate = HIGH;
|
||||
uint8_t counter = 0;
|
||||
uint8_t j = 0, i;
|
||||
unsigned long currenttime;
|
||||
|
||||
// Check if sensor was read less than two seconds ago and return early
|
||||
// to use last reading.
|
||||
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;
|
||||
|
||||
// pull the pin high and wait 250 milliseconds
|
||||
digitalWrite(_pin, HIGH);
|
||||
delay(250);
|
||||
|
||||
// now pull it low for ~20 milliseconds
|
||||
pinMode(_pin, OUTPUT);
|
||||
digitalWrite(_pin, LOW);
|
||||
delay(20);
|
||||
noInterrupts();
|
||||
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++;
|
||||
return f;
|
||||
}
|
||||
|
||||
float DHT::convertCtoF(float c) {
|
||||
return c * 1.8 + 32;
|
||||
}
|
||||
|
||||
interrupts();
|
||||
|
||||
/*
|
||||
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;
|
||||
float DHT::convertFtoC(float f) {
|
||||
return (f - 32) * 0.55555;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
|
||||
float DHT::readHumidity(bool force) {
|
||||
float f = NAN;
|
||||
if (read(force)) {
|
||||
switch (_type) {
|
||||
case DHT11:
|
||||
case DHT12:
|
||||
f = data[0] + data[1] * 0.1;
|
||||
break;
|
||||
case DHT22:
|
||||
case DHT21:
|
||||
f = ((word)data[0]) << 8 | data[1];
|
||||
f *= 0.1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
//boolean isFahrenheit: True == Fahrenheit; False == Celcius
|
||||
float DHT::computeHeatIndex(bool isFahrenheit) {
|
||||
float hi = computeHeatIndex(readTemperature(isFahrenheit), readHumidity(),
|
||||
isFahrenheit);
|
||||
return isFahrenheit ? hi : convertFtoC(hi);
|
||||
}
|
||||
|
||||
//boolean isFahrenheit: True == Fahrenheit; False == Celcius
|
||||
float DHT::computeHeatIndex(float temperature, float percentHumidity,
|
||||
bool isFahrenheit) {
|
||||
// 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 +
|
||||
-0.00683783 * pow(temperature, 2) +
|
||||
-0.05481717 * pow(percentHumidity, 2) +
|
||||
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);
|
||||
}
|
||||
|
||||
bool 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 (!force && ((currenttime - _lastreadtime) < MIN_INTERVAL)) {
|
||||
return _lastresult; // return last correct measurement
|
||||
}
|
||||
_lastreadtime = currenttime;
|
||||
|
||||
// Reset 40 bits of received data to zero.
|
||||
data[0] = data[1] = data[2] = data[3] = data[4] = 0;
|
||||
|
||||
// Send start signal. See DHT datasheet for full signal diagram:
|
||||
// http://www.adafruit.com/datasheets/Digital%20humidity%20and%20temperature%20sensor%20AM2302.pdf
|
||||
|
||||
// Go into high impedence state to let pull-up raise data line level and
|
||||
// start the reading process.
|
||||
pinMode(_pin, INPUT_PULLUP);
|
||||
delay(1);
|
||||
|
||||
// First set data line low for a period according to sensor type
|
||||
pinMode(_pin, OUTPUT);
|
||||
digitalWrite(_pin, LOW);
|
||||
switch(_type) {
|
||||
case DHT22:
|
||||
case DHT21:
|
||||
delayMicroseconds(1100); // data sheet says "at least 1ms"
|
||||
break;
|
||||
case DHT11:
|
||||
default:
|
||||
delay(20); //data sheet says at least 18ms, 20ms just to be safe
|
||||
break;
|
||||
}
|
||||
|
||||
uint32_t cycles[80];
|
||||
{
|
||||
// End the start signal by setting data line high for 40 microseconds.
|
||||
pinMode(_pin, INPUT_PULLUP);
|
||||
|
||||
// Delay a moment to let sensor pull data line low.
|
||||
delayMicroseconds(pullTime);
|
||||
|
||||
// Now start reading the data line to get the value from the DHT sensor.
|
||||
|
||||
// Turn off interrupts temporarily because the next sections
|
||||
// are timing critical and we don't want any interruptions.
|
||||
InterruptLock lock;
|
||||
|
||||
// First expect a low signal for ~80 microseconds followed by a high signal
|
||||
// for ~80 microseconds again.
|
||||
if (expectPulse(LOW) == TIMEOUT) {
|
||||
DEBUG_PRINTLN(F("DHT timeout waiting for start signal low pulse."));
|
||||
_lastresult = false;
|
||||
return _lastresult;
|
||||
}
|
||||
if (expectPulse(HIGH) == TIMEOUT) {
|
||||
DEBUG_PRINTLN(F("DHT timeout waiting for start signal high pulse."));
|
||||
_lastresult = false;
|
||||
return _lastresult;
|
||||
}
|
||||
|
||||
// Now read the 40 bits sent by the sensor. Each bit is sent as a 50
|
||||
// microsecond low pulse followed by a variable length high pulse. If the
|
||||
// high pulse is ~28 microseconds then it's a 0 and if it's ~70 microseconds
|
||||
// then it's a 1. We measure the cycle count of the initial 50us low pulse
|
||||
// and use that to compare to the cycle count of the high pulse to determine
|
||||
// if the bit is a 0 (high state cycle count < low state cycle count), or a
|
||||
// 1 (high state cycle count > low state cycle count). Note that for speed all
|
||||
// the pulses are read into a array and then examined in a later step.
|
||||
for (int i=0; i<80; i+=2) {
|
||||
cycles[i] = expectPulse(LOW);
|
||||
cycles[i+1] = expectPulse(HIGH);
|
||||
}
|
||||
} // Timing critical code is now complete.
|
||||
|
||||
// Inspect pulses and determine which ones are 0 (high state cycle count < low
|
||||
// state cycle count), or 1 (high state cycle count > low state cycle count).
|
||||
for (int i=0; i<40; ++i) {
|
||||
uint32_t lowCycles = cycles[2*i];
|
||||
uint32_t highCycles = cycles[2*i+1];
|
||||
if ((lowCycles == TIMEOUT) || (highCycles == TIMEOUT)) {
|
||||
DEBUG_PRINTLN(F("DHT timeout waiting for pulse."));
|
||||
_lastresult = false;
|
||||
return _lastresult;
|
||||
}
|
||||
data[i/8] <<= 1;
|
||||
// Now compare the low and high cycle times to see if the bit is a 0 or 1.
|
||||
if (highCycles > lowCycles) {
|
||||
// High cycles are greater than 50us low cycle count, must be a 1.
|
||||
data[i/8] |= 1;
|
||||
}
|
||||
// Else high cycles are less than (or equal to, a weird case) the 50us low
|
||||
// cycle count so this must be a zero. Nothing needs to be changed in the
|
||||
// stored data.
|
||||
}
|
||||
|
||||
DEBUG_PRINTLN(F("Received from DHT:"));
|
||||
DEBUG_PRINT(data[0], HEX); DEBUG_PRINT(F(", "));
|
||||
DEBUG_PRINT(data[1], HEX); DEBUG_PRINT(F(", "));
|
||||
DEBUG_PRINT(data[2], HEX); DEBUG_PRINT(F(", "));
|
||||
DEBUG_PRINT(data[3], HEX); DEBUG_PRINT(F(", "));
|
||||
DEBUG_PRINT(data[4], HEX); DEBUG_PRINT(F(" =? "));
|
||||
DEBUG_PRINTLN((data[0] + data[1] + data[2] + data[3]) & 0xFF, HEX);
|
||||
|
||||
// Check we read 40 bits and that the checksum matches.
|
||||
if (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) {
|
||||
_lastresult = true;
|
||||
return _lastresult;
|
||||
}
|
||||
else {
|
||||
DEBUG_PRINTLN(F("DHT checksum failure!"));
|
||||
_lastresult = false;
|
||||
return _lastresult;
|
||||
}
|
||||
}
|
||||
|
||||
// Expect the signal line to be at the specified level for a period of time and
|
||||
// return a count of loop cycles spent at that level (this cycle count can be
|
||||
// used to compare the relative time of two pulses). If more than a millisecond
|
||||
// ellapses without the level changing then the call fails with a 0 response.
|
||||
// This is adapted from Arduino's pulseInLong function (which is only available
|
||||
// in the very latest IDE versions):
|
||||
// https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/wiring_pulse.c
|
||||
uint32_t DHT::expectPulse(bool level) {
|
||||
#if (F_CPU > 16000000L)
|
||||
uint32_t count = 0;
|
||||
#else
|
||||
uint16_t count = 0; // To work fast enough on slower AVR boards
|
||||
#endif
|
||||
// On AVR platforms use direct GPIO port access as it's much faster and better
|
||||
// for catching pulses that are 10's of microseconds in length:
|
||||
#ifdef __AVR
|
||||
uint8_t portState = level ? _bit : 0;
|
||||
while ((*portInputRegister(_port) & _bit) == portState) {
|
||||
if (count++ >= _maxcycles) {
|
||||
return TIMEOUT; // Exceeded timeout, fail.
|
||||
}
|
||||
}
|
||||
// Otherwise fall back to using digitalRead (this seems to be necessary on ESP8266
|
||||
// right now, perhaps bugs in direct port access functions?).
|
||||
#else
|
||||
while (digitalRead(_pin) == level) {
|
||||
if (count++ >= _maxcycles) {
|
||||
return TIMEOUT; // Exceeded timeout, fail.
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return count;
|
||||
}
|
||||
|
80
DHT.h
80
DHT.h
@ -1,41 +1,87 @@
|
||||
/* DHT library
|
||||
|
||||
MIT license
|
||||
written by Adafruit Industries
|
||||
*/
|
||||
#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
|
||||
*/
|
||||
// Uncomment to enable printing out nice debug messages.
|
||||
//#define DHT_DEBUG
|
||||
|
||||
// how many timing transitions we need to keep track of. 2 * number bits + extra
|
||||
#define MAXTIMINGS 85
|
||||
// Define where debug output will be printed.
|
||||
#define DEBUG_PRINTER Serial
|
||||
|
||||
// Setup debug printing macros.
|
||||
#ifdef DHT_DEBUG
|
||||
#define DEBUG_PRINT(...) { DEBUG_PRINTER.print(__VA_ARGS__); }
|
||||
#define DEBUG_PRINTLN(...) { DEBUG_PRINTER.println(__VA_ARGS__); }
|
||||
#else
|
||||
#define DEBUG_PRINT(...) {}
|
||||
#define DEBUG_PRINTLN(...) {}
|
||||
#endif
|
||||
|
||||
// Define types of sensors.
|
||||
#define DHT11 11
|
||||
#define DHT12 12
|
||||
#define DHT22 22
|
||||
#define DHT21 21
|
||||
#define AM2301 21
|
||||
|
||||
class DHT {
|
||||
private:
|
||||
uint8_t data[6];
|
||||
uint8_t _pin, _type, _count;
|
||||
unsigned long _lastreadtime;
|
||||
boolean firstreading;
|
||||
|
||||
class DHT {
|
||||
public:
|
||||
DHT(uint8_t pin, uint8_t type, uint8_t count=6);
|
||||
void begin(void);
|
||||
float readTemperature(bool S=false);
|
||||
void begin(uint8_t usec=55);
|
||||
float readTemperature(bool S=false, bool force=false);
|
||||
float convertCtoF(float);
|
||||
float convertFtoC(float);
|
||||
float computeHeatIndex(float tempFahrenheit, float percentHumidity);
|
||||
float readHumidity(void);
|
||||
boolean read(void);
|
||||
float computeHeatIndex(bool isFahrenheit=true);
|
||||
float computeHeatIndex(float temperature, float percentHumidity, bool isFahrenheit=true);
|
||||
float readHumidity(bool force=false);
|
||||
bool read(bool force=false);
|
||||
|
||||
private:
|
||||
uint8_t data[5];
|
||||
uint8_t _pin, _type;
|
||||
#ifdef __AVR
|
||||
// Use direct GPIO access on an 8-bit AVR so keep track of the port and bitmask
|
||||
// for the digital pin connected to the DHT. Other platforms will use digitalRead.
|
||||
uint8_t _bit, _port;
|
||||
#endif
|
||||
uint32_t _lastreadtime, _maxcycles;
|
||||
bool _lastresult;
|
||||
uint8_t pullTime; // Time (in usec) to pull up data line before reading
|
||||
|
||||
uint32_t expectPulse(bool level);
|
||||
|
||||
};
|
||||
|
||||
class InterruptLock {
|
||||
public:
|
||||
InterruptLock() {
|
||||
#if defined(ESP8266)
|
||||
yield();
|
||||
#endif
|
||||
#if !defined(ARDUINO_ARCH_NRF52)
|
||||
noInterrupts();
|
||||
#endif
|
||||
}
|
||||
~InterruptLock() {
|
||||
#if !defined(ARDUINO_ARCH_NRF52)
|
||||
interrupts();
|
||||
#endif
|
||||
#if defined(ESP8266)
|
||||
yield();
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
195
DHT_U.cpp
Normal file
195
DHT_U.cpp
Normal file
@ -0,0 +1,195 @@
|
||||
// DHT Temperature & Humidity Unified Sensor Library
|
||||
// Copyright (c) 2014 Adafruit Industries
|
||||
// Author: Tony DiCola
|
||||
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
#include "DHT_U.h"
|
||||
|
||||
DHT_Unified::DHT_Unified(uint8_t pin, uint8_t type, uint8_t count, int32_t tempSensorId, int32_t humiditySensorId):
|
||||
_dht(pin, type, count),
|
||||
_type(type),
|
||||
_temp(this, tempSensorId),
|
||||
_humidity(this, humiditySensorId)
|
||||
{}
|
||||
|
||||
void DHT_Unified::begin() {
|
||||
_dht.begin();
|
||||
}
|
||||
|
||||
void DHT_Unified::setName(sensor_t* sensor) {
|
||||
switch(_type) {
|
||||
case DHT11:
|
||||
strncpy(sensor->name, "DHT11", sizeof(sensor->name) - 1);
|
||||
break;
|
||||
case DHT12:
|
||||
strncpy(sensor->name, "DHT12", sizeof(sensor->name) - 1);
|
||||
break;
|
||||
case DHT21:
|
||||
strncpy(sensor->name, "DHT21", sizeof(sensor->name) - 1);
|
||||
break;
|
||||
case DHT22:
|
||||
strncpy(sensor->name, "DHT22", sizeof(sensor->name) - 1);
|
||||
break;
|
||||
default:
|
||||
// TODO: Perhaps this should be an error? However main DHT library doesn't enforce
|
||||
// restrictions on the sensor type value. Pick a generic name for now.
|
||||
strncpy(sensor->name, "DHT?", sizeof(sensor->name) - 1);
|
||||
break;
|
||||
}
|
||||
sensor->name[sizeof(sensor->name)- 1] = 0;
|
||||
}
|
||||
|
||||
void DHT_Unified::setMinDelay(sensor_t* sensor) {
|
||||
switch(_type) {
|
||||
case DHT11:
|
||||
sensor->min_delay = 1000000L; // 1 second (in microseconds)
|
||||
break;
|
||||
case DHT12:
|
||||
sensor->min_delay = 2000000L; // 2 second (in microseconds)
|
||||
break;
|
||||
case DHT21:
|
||||
sensor->min_delay = 2000000L; // 2 seconds (in microseconds)
|
||||
break;
|
||||
case DHT22:
|
||||
sensor->min_delay = 2000000L; // 2 seconds (in microseconds)
|
||||
break;
|
||||
default:
|
||||
// Default to slowest sample rate in case of unknown type.
|
||||
sensor->min_delay = 2000000L; // 2 seconds (in microseconds)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DHT_Unified::Temperature::Temperature(DHT_Unified* parent, int32_t id):
|
||||
_parent(parent),
|
||||
_id(id)
|
||||
{}
|
||||
|
||||
bool DHT_Unified::Temperature::getEvent(sensors_event_t* event) {
|
||||
// Clear event definition.
|
||||
memset(event, 0, sizeof(sensors_event_t));
|
||||
// Populate sensor reading values.
|
||||
event->version = sizeof(sensors_event_t);
|
||||
event->sensor_id = _id;
|
||||
event->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
|
||||
event->timestamp = millis();
|
||||
event->temperature = _parent->_dht.readTemperature();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void DHT_Unified::Temperature::getSensor(sensor_t* sensor) {
|
||||
// Clear sensor definition.
|
||||
memset(sensor, 0, sizeof(sensor_t));
|
||||
// Set sensor name.
|
||||
_parent->setName(sensor);
|
||||
// Set version and ID
|
||||
sensor->version = DHT_SENSOR_VERSION;
|
||||
sensor->sensor_id = _id;
|
||||
// Set type and characteristics.
|
||||
sensor->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
|
||||
_parent->setMinDelay(sensor);
|
||||
switch (_parent->_type) {
|
||||
case DHT11:
|
||||
sensor->max_value = 50.0F;
|
||||
sensor->min_value = 0.0F;
|
||||
sensor->resolution = 2.0F;
|
||||
break;
|
||||
case DHT12:
|
||||
sensor->max_value = 60.0F;
|
||||
sensor->min_value = -20.0F;
|
||||
sensor->resolution = 0.5F;
|
||||
break;
|
||||
case DHT21:
|
||||
sensor->max_value = 80.0F;
|
||||
sensor->min_value = -40.0F;
|
||||
sensor->resolution = 0.1F;
|
||||
break;
|
||||
case DHT22:
|
||||
sensor->max_value = 125.0F;
|
||||
sensor->min_value = -40.0F;
|
||||
sensor->resolution = 0.1F;
|
||||
break;
|
||||
default:
|
||||
// Unknown type, default to 0.
|
||||
sensor->max_value = 0.0F;
|
||||
sensor->min_value = 0.0F;
|
||||
sensor->resolution = 0.0F;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DHT_Unified::Humidity::Humidity(DHT_Unified* parent, int32_t id):
|
||||
_parent(parent),
|
||||
_id(id)
|
||||
{}
|
||||
|
||||
bool DHT_Unified::Humidity::getEvent(sensors_event_t* event) {
|
||||
// Clear event definition.
|
||||
memset(event, 0, sizeof(sensors_event_t));
|
||||
// Populate sensor reading values.
|
||||
event->version = sizeof(sensors_event_t);
|
||||
event->sensor_id = _id;
|
||||
event->type = SENSOR_TYPE_RELATIVE_HUMIDITY;
|
||||
event->timestamp = millis();
|
||||
event->relative_humidity = _parent->_dht.readHumidity();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void DHT_Unified::Humidity::getSensor(sensor_t* sensor) {
|
||||
// Clear sensor definition.
|
||||
memset(sensor, 0, sizeof(sensor_t));
|
||||
// Set sensor name.
|
||||
_parent->setName(sensor);
|
||||
// Set version and ID
|
||||
sensor->version = DHT_SENSOR_VERSION;
|
||||
sensor->sensor_id = _id;
|
||||
// Set type and characteristics.
|
||||
sensor->type = SENSOR_TYPE_RELATIVE_HUMIDITY;
|
||||
_parent->setMinDelay(sensor);
|
||||
switch (_parent->_type) {
|
||||
case DHT11:
|
||||
sensor->max_value = 80.0F;
|
||||
sensor->min_value = 20.0F;
|
||||
sensor->resolution = 5.0F;
|
||||
break;
|
||||
case DHT12:
|
||||
sensor->max_value = 95.0F;
|
||||
sensor->min_value = 20.0F;
|
||||
sensor->resolution = 5.0F;
|
||||
break;
|
||||
case DHT21:
|
||||
sensor->max_value = 100.0F;
|
||||
sensor->min_value = 0.0F;
|
||||
sensor->resolution = 0.1F;
|
||||
break;
|
||||
case DHT22:
|
||||
sensor->max_value = 100.0F;
|
||||
sensor->min_value = 0.0F;
|
||||
sensor->resolution = 0.1F;
|
||||
break;
|
||||
default:
|
||||
// Unknown type, default to 0.
|
||||
sensor->max_value = 0.0F;
|
||||
sensor->min_value = 0.0F;
|
||||
sensor->resolution = 0.0F;
|
||||
break;
|
||||
}
|
||||
}
|
78
DHT_U.h
Normal file
78
DHT_U.h
Normal file
@ -0,0 +1,78 @@
|
||||
// DHT Temperature & Humidity Unified Sensor Library
|
||||
// Copyright (c) 2014 Adafruit Industries
|
||||
// Author: Tony DiCola
|
||||
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
#ifndef DHT_U_H
|
||||
#define DHT_U_H
|
||||
|
||||
#include <Adafruit_Sensor.h>
|
||||
#include <DHT.h>
|
||||
|
||||
#define DHT_SENSOR_VERSION 1
|
||||
|
||||
class DHT_Unified {
|
||||
public:
|
||||
DHT_Unified(uint8_t pin, uint8_t type, uint8_t count=6, int32_t tempSensorId=-1, int32_t humiditySensorId=-1);
|
||||
void begin();
|
||||
|
||||
class Temperature : public Adafruit_Sensor {
|
||||
public:
|
||||
Temperature(DHT_Unified* parent, int32_t id);
|
||||
bool getEvent(sensors_event_t* event);
|
||||
void getSensor(sensor_t* sensor);
|
||||
|
||||
private:
|
||||
DHT_Unified* _parent;
|
||||
int32_t _id;
|
||||
|
||||
};
|
||||
|
||||
class Humidity : public Adafruit_Sensor {
|
||||
public:
|
||||
Humidity(DHT_Unified* parent, int32_t id);
|
||||
bool getEvent(sensors_event_t* event);
|
||||
void getSensor(sensor_t* sensor);
|
||||
|
||||
private:
|
||||
DHT_Unified* _parent;
|
||||
int32_t _id;
|
||||
|
||||
};
|
||||
|
||||
Temperature temperature() {
|
||||
return _temp;
|
||||
}
|
||||
|
||||
Humidity humidity() {
|
||||
return _humidity;
|
||||
}
|
||||
|
||||
private:
|
||||
DHT _dht;
|
||||
uint8_t _type;
|
||||
Temperature _temp;
|
||||
Humidity _humidity;
|
||||
|
||||
void setName(sensor_t* sensor);
|
||||
void setMinDelay(sensor_t* sensor);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
14
README.md
Normal file
14
README.md
Normal file
@ -0,0 +1,14 @@
|
||||
# Adafruit DHT Humidity & Temperature Sensor Library
|
||||
|
||||
An Arduino library for the DHT series of low cost temperature/humidity sensors.
|
||||
|
||||
Tutorial: https://learn.adafruit.com/dht
|
||||
|
||||
**You must have the following Arduino libraries installed to use this class:**
|
||||
|
||||
- [Adafruit Unified Sensor Library](https://github.com/adafruit/Adafruit_Sensor)
|
||||
|
||||
Examples include both a "standalone" DHT example, and one that works along with the Adafruit Unified Sensor Library. Unified sensor library is required even if using the standalone version.
|
||||
|
||||
Recent Arduino IDE releases include the Library Manager for easy installation. Otherwise, to download, click the DOWNLOADS button in the top right corner, rename the uncompressed folder DHT. Check that the DHT folder contains DHT.cpp and DHT.h. Place the DHT library folder your <arduinosketchfolder>/libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE.
|
||||
|
@ -1,3 +0,0 @@
|
||||
This is an Arduino library for the DHT series of low cost temperature/humidity sensors.
|
||||
|
||||
To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder DHT. Check that the DHT folder contains DHT.cpp and DHT.h. Place the DHT library folder your <arduinosketchfolder>/libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE.
|
85
examples/DHT_Unified_Sensor/DHT_Unified_Sensor.ino
Normal file
85
examples/DHT_Unified_Sensor/DHT_Unified_Sensor.ino
Normal file
@ -0,0 +1,85 @@
|
||||
// DHT Temperature & Humidity Sensor
|
||||
// Unified Sensor Library Example
|
||||
// Written by Tony DiCola for Adafruit Industries
|
||||
// Released under an MIT license.
|
||||
|
||||
// REQUIRES the following Arduino libraries:
|
||||
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
|
||||
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
|
||||
|
||||
#include <Adafruit_Sensor.h>
|
||||
#include <DHT.h>
|
||||
#include <DHT_U.h>
|
||||
|
||||
#define DHTPIN 2 // Digital pin connected to the DHT sensor
|
||||
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
|
||||
// Pin 15 can work but DHT must be disconnected during program upload.
|
||||
|
||||
// Uncomment the type of sensor in use:
|
||||
//#define DHTTYPE DHT11 // DHT 11
|
||||
#define DHTTYPE DHT22 // DHT 22 (AM2302)
|
||||
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
|
||||
|
||||
// See guide for details on sensor wiring and usage:
|
||||
// https://learn.adafruit.com/dht/overview
|
||||
|
||||
DHT_Unified dht(DHTPIN, DHTTYPE);
|
||||
|
||||
uint32_t delayMS;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
// Initialize device.
|
||||
dht.begin();
|
||||
Serial.println(F("DHTxx Unified Sensor Example"));
|
||||
// Print temperature sensor details.
|
||||
sensor_t sensor;
|
||||
dht.temperature().getSensor(&sensor);
|
||||
Serial.println(F("------------------------------------"));
|
||||
Serial.println(F("Temperature Sensor"));
|
||||
Serial.print (F("Sensor Type: ")); Serial.println(sensor.name);
|
||||
Serial.print (F("Driver Ver: ")); Serial.println(sensor.version);
|
||||
Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id);
|
||||
Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("°C"));
|
||||
Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("°C"));
|
||||
Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("°C"));
|
||||
Serial.println(F("------------------------------------"));
|
||||
// Print humidity sensor details.
|
||||
dht.humidity().getSensor(&sensor);
|
||||
Serial.println(F("Humidity Sensor"));
|
||||
Serial.print (F("Sensor Type: ")); Serial.println(sensor.name);
|
||||
Serial.print (F("Driver Ver: ")); Serial.println(sensor.version);
|
||||
Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id);
|
||||
Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("%"));
|
||||
Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("%"));
|
||||
Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("%"));
|
||||
Serial.println(F("------------------------------------"));
|
||||
// Set delay between sensor readings based on sensor details.
|
||||
delayMS = sensor.min_delay / 1000;
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Delay between measurements.
|
||||
delay(delayMS);
|
||||
// Get temperature event and print its value.
|
||||
sensors_event_t event;
|
||||
dht.temperature().getEvent(&event);
|
||||
if (isnan(event.temperature)) {
|
||||
Serial.println(F("Error reading temperature!"));
|
||||
}
|
||||
else {
|
||||
Serial.print(F("Temperature: "));
|
||||
Serial.print(event.temperature);
|
||||
Serial.println(F("°C"));
|
||||
}
|
||||
// Get humidity event and print its value.
|
||||
dht.humidity().getEvent(&event);
|
||||
if (isnan(event.relative_humidity)) {
|
||||
Serial.println(F("Error reading humidity!"));
|
||||
}
|
||||
else {
|
||||
Serial.print(F("Humidity: "));
|
||||
Serial.print(event.relative_humidity);
|
||||
Serial.println(F("%"));
|
||||
}
|
||||
}
|
@ -1,13 +1,19 @@
|
||||
// Example testing sketch for various DHT humidity/temperature sensors
|
||||
// Written by ladyada, public domain
|
||||
|
||||
// REQUIRES the following Arduino libraries:
|
||||
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
|
||||
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
|
||||
|
||||
#include "DHT.h"
|
||||
|
||||
#define DHTPIN 2 // what pin we're connected to
|
||||
#define DHTPIN 2 // Digital pin connected to the DHT sensor
|
||||
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
|
||||
// Pin 15 can work but DHT must be disconnected during program upload.
|
||||
|
||||
// Uncomment whatever type you're using!
|
||||
//#define DHTTYPE DHT11 // DHT 11
|
||||
#define DHTTYPE DHT22 // DHT 22 (AM2302)
|
||||
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
|
||||
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
|
||||
|
||||
// Connect pin 1 (on the left) of the sensor to +5V
|
||||
@ -17,20 +23,15 @@
|
||||
// Connect pin 4 (on the right) of the sensor to GROUND
|
||||
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
|
||||
|
||||
// Initialize DHT sensor for normal 16mhz Arduino
|
||||
// Initialize DHT sensor.
|
||||
// Note that older versions of this library took an optional third parameter to
|
||||
// tweak the timings for faster processors. This parameter is no longer needed
|
||||
// as the current DHT reading algorithm adjusts itself to work on faster procs.
|
||||
DHT dht(DHTPIN, DHTTYPE);
|
||||
// NOTE: For working with a faster chip, like an Arduino Due or Teensy, you
|
||||
// might need to increase the threshold for cycle counts considered a 1 or 0.
|
||||
// You can do this by passing a 3rd parameter for this threshold. It's a bit
|
||||
// of fiddling to find the right value, but in general the faster the CPU the
|
||||
// higher the value. The default for a 16mhz AVR is a value of 6. For an
|
||||
// Arduino Due that runs at 84mhz a value of 30 works.
|
||||
// Example to initialize DHT sensor for Arduino Due:
|
||||
//DHT dht(DHTPIN, DHTTYPE, 30);
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
Serial.println("DHTxx test!");
|
||||
Serial.println(F("DHTxx test!"));
|
||||
|
||||
dht.begin();
|
||||
}
|
||||
@ -42,30 +43,31 @@ void loop() {
|
||||
// Reading temperature or humidity takes about 250 milliseconds!
|
||||
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
|
||||
float h = dht.readHumidity();
|
||||
// Read temperature as Celsius
|
||||
// Read temperature as Celsius (the default)
|
||||
float t = dht.readTemperature();
|
||||
// Read temperature as Fahrenheit
|
||||
// Read temperature as Fahrenheit (isFahrenheit = true)
|
||||
float f = dht.readTemperature(true);
|
||||
|
||||
// Check if any reads failed and exit early (to try again).
|
||||
if (isnan(h) || isnan(t) || isnan(f)) {
|
||||
Serial.println("Failed to read from DHT sensor!");
|
||||
Serial.println(F("Failed to read from DHT sensor!"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Compute heat index
|
||||
// Must send in temp in Fahrenheit!
|
||||
float hi = dht.computeHeatIndex(f, h);
|
||||
// Compute heat index in Fahrenheit (the default)
|
||||
float hif = dht.computeHeatIndex(f, h);
|
||||
// Compute heat index in Celsius (isFahreheit = false)
|
||||
float hic = dht.computeHeatIndex(t, h, false);
|
||||
|
||||
Serial.print("Humidity: ");
|
||||
Serial.print(F("Humidity: "));
|
||||
Serial.print(h);
|
||||
Serial.print(" %\t");
|
||||
Serial.print("Temperature: ");
|
||||
Serial.print(F("% Temperature: "));
|
||||
Serial.print(t);
|
||||
Serial.print(" *C ");
|
||||
Serial.print(F("°C "));
|
||||
Serial.print(f);
|
||||
Serial.print(" *F\t");
|
||||
Serial.print("Heat index: ");
|
||||
Serial.print(hi);
|
||||
Serial.println(" *F");
|
||||
Serial.print(F("°F Heat index: "));
|
||||
Serial.print(hic);
|
||||
Serial.print(F("°C "));
|
||||
Serial.print(hif);
|
||||
Serial.println(F("°F"));
|
||||
}
|
||||
|
22
keywords.txt
Normal file
22
keywords.txt
Normal file
@ -0,0 +1,22 @@
|
||||
###########################################
|
||||
# Syntax Coloring Map For DHT-sensor-library
|
||||
###########################################
|
||||
|
||||
###########################################
|
||||
# Datatypes (KEYWORD1)
|
||||
###########################################
|
||||
|
||||
DHT KEYWORD1
|
||||
|
||||
###########################################
|
||||
# Methods and Functions (KEYWORD2)
|
||||
###########################################
|
||||
|
||||
begin KEYWORD2
|
||||
readTemperature KEYWORD2
|
||||
convertCtoF KEYWORD2
|
||||
convertFtoC KEYWORD2
|
||||
computeHeatIndex KEYWORD2
|
||||
readHumidity KEYWORD2
|
||||
read KEYWORD2
|
||||
|
@ -1,5 +1,5 @@
|
||||
name=DHT sensor library
|
||||
version=1.0.0
|
||||
version=1.3.3
|
||||
author=Adafruit
|
||||
maintainer=Adafruit <info@adafruit.com>
|
||||
sentence=Arduino library for DHT11, DHT22, etc Temp & Humidity Sensors
|
||||
|
Reference in New Issue
Block a user