mirror of
https://github.com/adafruit/DHT-sensor-library.git
synced 2023-10-23 22:20:38 +03:00
Compare commits
26 Commits
Author | SHA1 | Date | |
---|---|---|---|
428e115b57 | |||
db1a7943d4 | |||
e194e633df | |||
3f3b158090 | |||
1cc7cbcbbe | |||
47854ee87d | |||
bcb7767e4f | |||
deafbf4067 | |||
26177dbc71 | |||
297faa7762 | |||
79baadf4e5 | |||
c1a3b9e507 | |||
56262f5b17 | |||
91977b79b8 | |||
c76d42e280 | |||
dd455428a0 | |||
f76a51243f | |||
30809d2a6c | |||
8e0a94fff3 | |||
6332774b18 | |||
f566d58f47 | |||
9bf12551d8 | |||
7cec0cb06d | |||
1e752b12ee | |||
8b9624479e | |||
57fe95c1be |
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
# osx
|
||||
.DS_Store
|
||||
|
||||
# doxygen
|
||||
Doxyfile*
|
||||
doxygen_sqlite3.db
|
||||
html
|
||||
*.tmp
|
29
.travis.yml
Normal file
29
.travis.yml
Normal file
@ -0,0 +1,29 @@
|
||||
language: c
|
||||
sudo: false
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- ~/arduino_ide
|
||||
- ~/.arduino15/packages/
|
||||
|
||||
git:
|
||||
depth: false
|
||||
quiet: true
|
||||
|
||||
env:
|
||||
global:
|
||||
- ARDUINO_IDE_VERSION="1.8.7"
|
||||
- PRETTYNAME="DHT sensor library"
|
||||
|
||||
before_install:
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/install.sh)
|
||||
|
||||
install:
|
||||
- arduino --install-library "Adafruit Unified Sensor"
|
||||
|
||||
script:
|
||||
- build_main_platforms
|
||||
|
||||
after_success:
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/library_check.sh)
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/doxy_gen_and_deploy.sh)
|
13
CONTRIBUTING.md
Normal file
13
CONTRIBUTING.md
Normal file
@ -0,0 +1,13 @@
|
||||
# Contribution Guidlines
|
||||
|
||||
This library is the culmination of the expertise of many members of the open source community who have dedicated their time and hard work. The best way to ask for help or propose a new idea is to [create a new issue](https://github.com/adafruit/DHT-sensor-library/issues/new) while creating a Pull Request with your code changes allows you to share your own innovations with the rest of the community.
|
||||
|
||||
The following are some guidelines to observe when creating issues or PRs:
|
||||
|
||||
- Be friendly; it is important that we can all enjoy a safe space as we are all working on the same project and it is okay for people to have different ideas
|
||||
|
||||
- [Use code blocks](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#code); it helps us help you when we can read your code! On that note also refrain from pasting more than 30 lines of code in a post, instead [create a gist](https://gist.github.com/) if you need to share large snippets
|
||||
|
||||
- Use reasonable titles; refrain from using overly long or capitalized titles as they are usually annoying and do little to encourage others to help :smile:
|
||||
|
||||
- Be detailed; refrain from mentioning code problems without sharing your source code and always give information regarding your board and version of the library
|
278
DHT.cpp
278
DHT.cpp
@ -1,51 +1,106 @@
|
||||
/* DHT library
|
||||
|
||||
MIT license
|
||||
written by Adafruit Industries
|
||||
*/
|
||||
/*!
|
||||
* @file DHT.cpp
|
||||
*
|
||||
* @mainpage DHT series of low cost temperature/humidity sensors.
|
||||
*
|
||||
* @section intro_sec Introduction
|
||||
*
|
||||
* This is a library for DHT series of low cost temperature/humidity sensors.
|
||||
*
|
||||
* You must have Adafruit Unified Sensor Library library installed to use this
|
||||
* class.
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit andopen-source hardware by purchasing products
|
||||
* from Adafruit!
|
||||
*
|
||||
* @section author Author
|
||||
*
|
||||
* Written by Adafruit Industries.
|
||||
*
|
||||
* @section license License
|
||||
*
|
||||
* MIT license, all text above must be included in any redistribution
|
||||
*/
|
||||
|
||||
#include "DHT.h"
|
||||
|
||||
#define MIN_INTERVAL 2000
|
||||
#define TIMEOUT -1
|
||||
#define MIN_INTERVAL 2000 /**< min interval value */
|
||||
#define TIMEOUT -1 /**< timeout on */
|
||||
|
||||
/*!
|
||||
* @brief Instantiates a new DHT class
|
||||
* @param pin
|
||||
* pin number that sensor is connected
|
||||
* @param type
|
||||
* type of sensor
|
||||
* @param count
|
||||
* number of sensors
|
||||
*/
|
||||
DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) {
|
||||
_pin = pin;
|
||||
_type = type;
|
||||
#ifdef __AVR
|
||||
_bit = digitalPinToBitMask(pin);
|
||||
_port = digitalPinToPort(pin);
|
||||
#endif
|
||||
_maxcycles = microsecondsToClockCycles(1000); // 1 millisecond timeout for
|
||||
// reading pulses from DHT sensor.
|
||||
#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) {
|
||||
/*!
|
||||
* @brief Setup sensor pins and set pull timings
|
||||
* @param usec
|
||||
* 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_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);
|
||||
DEBUG_PRINT("DHT max clock cycles: ");
|
||||
DEBUG_PRINTLN(_maxcycles, DEC);
|
||||
pullTime = usec;
|
||||
}
|
||||
|
||||
//boolean S == Scale. True == Fahrenheit; False == Celcius
|
||||
/*!
|
||||
* @brief Read temperature
|
||||
* @param S
|
||||
* Scale. Boolean value:
|
||||
* - true = Fahrenheit
|
||||
* - false = Celcius
|
||||
* @param force
|
||||
* true if in force mode
|
||||
* @return Temperature value in selected scale
|
||||
*/
|
||||
float DHT::readTemperature(bool S, bool force) {
|
||||
float f = NAN;
|
||||
|
||||
if (read(force)) {
|
||||
switch (_type) {
|
||||
case DHT11:
|
||||
f = data[2];
|
||||
if (data[3] & 0x80) {
|
||||
f = -1 - f;
|
||||
}
|
||||
f += (data[3] & 0x0f) * 0.1;
|
||||
if (S) {
|
||||
f = convertCtoF(f);
|
||||
}
|
||||
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);
|
||||
}
|
||||
break;
|
||||
@ -56,7 +111,7 @@ float DHT::readTemperature(bool S, bool force) {
|
||||
if (data[2] & 0x80) {
|
||||
f *= -1;
|
||||
}
|
||||
if(S) {
|
||||
if (S) {
|
||||
f = convertCtoF(f);
|
||||
}
|
||||
break;
|
||||
@ -65,14 +120,28 @@ float DHT::readTemperature(bool S, bool force) {
|
||||
return f;
|
||||
}
|
||||
|
||||
float DHT::convertCtoF(float c) {
|
||||
return c * 1.8 + 32;
|
||||
}
|
||||
/*!
|
||||
* @brief Converts Celcius to Fahrenheit
|
||||
* @param c
|
||||
* value in Celcius
|
||||
* @return float value in Fahrenheit
|
||||
*/
|
||||
float DHT::convertCtoF(float c) { return c * 1.8 + 32; }
|
||||
|
||||
float DHT::convertFtoC(float f) {
|
||||
return (f - 32) * 0.55555;
|
||||
}
|
||||
/*!
|
||||
* @brief Converts Fahrenheit to Celcius
|
||||
* @param f
|
||||
* value in Fahrenheit
|
||||
* @return float value in Celcius
|
||||
*/
|
||||
float DHT::convertFtoC(float f) { return (f - 32) * 0.55555; }
|
||||
|
||||
/*!
|
||||
* @brief Read Humidity
|
||||
* @param force
|
||||
* force read mode
|
||||
* @return float value - humidity in percent
|
||||
*/
|
||||
float DHT::readHumidity(bool force) {
|
||||
float f = NAN;
|
||||
if (read(force)) {
|
||||
@ -91,46 +160,71 @@ float DHT::readHumidity(bool force) {
|
||||
return f;
|
||||
}
|
||||
|
||||
//boolean isFahrenheit: True == Fahrenheit; False == Celcius
|
||||
/*!
|
||||
* @brief Compute Heat Index
|
||||
* Simplified version that reads temp and humidity from sensor
|
||||
* @param isFahrenheit
|
||||
* true if fahrenheit, false if celcius (default
|
||||
*true)
|
||||
* @return float heat index
|
||||
*/
|
||||
float DHT::computeHeatIndex(bool isFahrenheit) {
|
||||
float hi = computeHeatIndex(readTemperature(isFahrenheit), readHumidity(),
|
||||
isFahrenheit);
|
||||
return isFahrenheit ? hi : convertFtoC(hi);
|
||||
isFahrenheit);
|
||||
return hi;
|
||||
}
|
||||
|
||||
//boolean isFahrenheit: True == Fahrenheit; False == Celcius
|
||||
/*!
|
||||
* @brief Compute Heat Index
|
||||
* Using both Rothfusz and Steadman's equations
|
||||
* (http://www.wpc.ncep.noaa.gov/html/heatindex_equation.shtml)
|
||||
* @param temperature
|
||||
* temperature in selected scale
|
||||
* @param percentHumidity
|
||||
* humidity in percent
|
||||
* @param isFahrenheit
|
||||
* true if fahrenheit, false if celcius
|
||||
* @return float heat index
|
||||
*/
|
||||
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
|
||||
bool isFahrenheit) {
|
||||
float hi;
|
||||
|
||||
if (!isFahrenheit)
|
||||
temperature = convertCtoF(temperature);
|
||||
|
||||
hi = 0.5 * (temperature + 61.0 + ((temperature - 68.0) * 1.2) + (percentHumidity * 0.094));
|
||||
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);
|
||||
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);
|
||||
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))
|
||||
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);
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Read value from sensor or return last one from less than two
|
||||
*seconds.
|
||||
* @param force
|
||||
* true if using force mode
|
||||
* @return float value
|
||||
*/
|
||||
bool DHT::read(bool force) {
|
||||
// Check if sensor was read less than two seconds ago and return early
|
||||
// to use last reading.
|
||||
@ -143,6 +237,10 @@ bool DHT::read(bool force) {
|
||||
// Reset 40 bits of received data to zero.
|
||||
data[0] = data[1] = data[2] = data[3] = data[4] = 0;
|
||||
|
||||
#if defined(ESP8266)
|
||||
yield(); // Handle WiFi / reset software watchdog
|
||||
#endif
|
||||
|
||||
// Send start signal. See DHT datasheet for full signal diagram:
|
||||
// http://www.adafruit.com/datasheets/Digital%20humidity%20and%20temperature%20sensor%20AM2302.pdf
|
||||
|
||||
@ -154,15 +252,15 @@ bool DHT::read(bool force) {
|
||||
// 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;
|
||||
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];
|
||||
@ -170,8 +268,10 @@ bool DHT::read(bool force) {
|
||||
// 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.
|
||||
delayMicroseconds(40); // Delay a bit to let sensor pull data line low.
|
||||
|
||||
// Turn off interrupts temporarily because the next sections
|
||||
// are timing critical and we don't want any interruptions.
|
||||
@ -196,29 +296,29 @@ bool DHT::read(bool force) {
|
||||
// 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);
|
||||
// 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];
|
||||
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;
|
||||
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;
|
||||
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
|
||||
@ -226,19 +326,23 @@ bool DHT::read(bool force) {
|
||||
}
|
||||
|
||||
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_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 {
|
||||
} else {
|
||||
DEBUG_PRINTLN(F("DHT checksum failure!"));
|
||||
_lastresult = false;
|
||||
return _lastresult;
|
||||
@ -258,24 +362,24 @@ uint32_t DHT::expectPulse(bool level) {
|
||||
#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.
|
||||
}
|
||||
// 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.
|
||||
}
|
||||
}
|
||||
// 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
|
||||
}
|
||||
#endif
|
||||
|
||||
return count;
|
||||
}
|
||||
|
61
DHT.h
61
DHT.h
@ -1,45 +1,53 @@
|
||||
/* DHT library
|
||||
/*!
|
||||
* @file DHT.h
|
||||
*
|
||||
* This is a library for DHT series of low cost temperature/humidity sensors.
|
||||
*
|
||||
* You must have Adafruit Unified Sensor Library library installed to use this class.
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit andopen-source hardware by purchasing products
|
||||
* from Adafruit!
|
||||
*
|
||||
* Written by Adafruit Industries.
|
||||
*
|
||||
* MIT license, all text above must be included in any redistribution
|
||||
*/
|
||||
|
||||
MIT license
|
||||
written by Adafruit Industries
|
||||
*/
|
||||
#ifndef DHT_H
|
||||
#define DHT_H
|
||||
|
||||
#if ARDUINO >= 100
|
||||
#include "Arduino.h"
|
||||
#else
|
||||
#include "WProgram.h"
|
||||
#endif
|
||||
#include "Arduino.h"
|
||||
|
||||
|
||||
// Uncomment to enable printing out nice debug messages.
|
||||
/* Uncomment to enable printing out nice debug messages. */
|
||||
//#define DHT_DEBUG
|
||||
|
||||
// Define where debug output will be printed.
|
||||
#define DEBUG_PRINTER Serial
|
||||
|
||||
// Setup debug printing macros.
|
||||
#define DEBUG_PRINTER Serial /**< Define where debug output will be printed. */
|
||||
|
||||
/* 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(...) {}
|
||||
#define DEBUG_PRINT(...) {} /**< Debug Print Placeholder if Debug is disabled */
|
||||
#define DEBUG_PRINTLN(...) {} /**< Debug Print Line Placeholder if Debug is disabled */
|
||||
#endif
|
||||
|
||||
// Define types of sensors.
|
||||
#define DHT11 11
|
||||
#define DHT12 12
|
||||
#define DHT22 22
|
||||
#define DHT21 21
|
||||
#define AM2301 21
|
||||
|
||||
/* Define types of sensors. */
|
||||
#define DHT11 11 /**< DHT TYPE 11 */
|
||||
#define DHT12 12 /**< DHY TYPE 12 */
|
||||
#define DHT22 22 /**< DHT TYPE 22 */
|
||||
#define DHT21 21 /**< DHT TYPE 21 */
|
||||
#define AM2301 21 /**< AM2301 */
|
||||
|
||||
/*!
|
||||
* @brief Class that stores state and functions for DHT
|
||||
*/
|
||||
class DHT {
|
||||
public:
|
||||
DHT(uint8_t pin, uint8_t type, uint8_t count=6);
|
||||
void begin(void);
|
||||
void begin(uint8_t usec=55);
|
||||
float readTemperature(bool S=false, bool force=false);
|
||||
float convertCtoF(float);
|
||||
float convertFtoC(float);
|
||||
@ -58,11 +66,15 @@ class DHT {
|
||||
#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);
|
||||
|
||||
};
|
||||
|
||||
/*!
|
||||
* @brief Class that defines Interrupt Lock Avaiability
|
||||
*/
|
||||
class InterruptLock {
|
||||
public:
|
||||
InterruptLock() {
|
||||
@ -75,7 +87,6 @@ class InterruptLock {
|
||||
interrupts();
|
||||
#endif
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
93
DHT_U.cpp
93
DHT_U.cpp
@ -1,26 +1,32 @@
|
||||
// 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.
|
||||
/*!
|
||||
* @file DHT_U.cpp
|
||||
*
|
||||
* Temperature & Humidity Unified Sensor Library
|
||||
*
|
||||
* This is a library for DHT series of low cost temperature/humidity sensors.
|
||||
*
|
||||
* You must have Adafruit Unified Sensor Library library installed to use this
|
||||
* class.
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit andopen-source hardware by purchasing products
|
||||
* from Adafruit!
|
||||
*/
|
||||
#include "DHT_U.h"
|
||||
|
||||
/*!
|
||||
* @brief Instantiates a new DHT_Unified class
|
||||
* @param pin
|
||||
* pin number that sensor is connected
|
||||
* @param type
|
||||
* type of sensor
|
||||
* @param count
|
||||
* number of sensors
|
||||
* @param tempSensorId
|
||||
* temperature sensor id
|
||||
* @param humiditySensorId
|
||||
* humidity sensor id
|
||||
*/
|
||||
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),
|
||||
@ -28,10 +34,18 @@ DHT_Unified::DHT_Unified(uint8_t pin, uint8_t type, uint8_t count, int32_t tempS
|
||||
_humidity(this, humiditySensorId)
|
||||
{}
|
||||
|
||||
/*!
|
||||
* @brief Setup sensor (calls begin on It)
|
||||
*/
|
||||
void DHT_Unified::begin() {
|
||||
_dht.begin();
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Sets sensor name
|
||||
* @param sensor
|
||||
* Sensor that will be set
|
||||
*/
|
||||
void DHT_Unified::setName(sensor_t* sensor) {
|
||||
switch(_type) {
|
||||
case DHT11:
|
||||
@ -55,6 +69,11 @@ void DHT_Unified::setName(sensor_t* sensor) {
|
||||
sensor->name[sizeof(sensor->name)- 1] = 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Sets Minimum Delay Value
|
||||
* @param sensor
|
||||
* Sensor that will be set
|
||||
*/
|
||||
void DHT_Unified::setMinDelay(sensor_t* sensor) {
|
||||
switch(_type) {
|
||||
case DHT11:
|
||||
@ -76,11 +95,23 @@ void DHT_Unified::setMinDelay(sensor_t* sensor) {
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Instantiates a new DHT_Unified Temperature Class
|
||||
* @param parent
|
||||
* Parent Sensor
|
||||
* @param id
|
||||
* Sensor id
|
||||
*/
|
||||
DHT_Unified::Temperature::Temperature(DHT_Unified* parent, int32_t id):
|
||||
_parent(parent),
|
||||
_id(id)
|
||||
{}
|
||||
|
||||
/*!
|
||||
* @brief Reads the sensor and returns the data as a sensors_event_t
|
||||
* @param event
|
||||
* @return always returns true
|
||||
*/
|
||||
bool DHT_Unified::Temperature::getEvent(sensors_event_t* event) {
|
||||
// Clear event definition.
|
||||
memset(event, 0, sizeof(sensors_event_t));
|
||||
@ -94,6 +125,10 @@ bool DHT_Unified::Temperature::getEvent(sensors_event_t* event) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Provides the sensor_t data for this sensor
|
||||
* @param sensor
|
||||
*/
|
||||
void DHT_Unified::Temperature::getSensor(sensor_t* sensor) {
|
||||
// Clear sensor definition.
|
||||
memset(sensor, 0, sizeof(sensor_t));
|
||||
@ -135,11 +170,23 @@ void DHT_Unified::Temperature::getSensor(sensor_t* sensor) {
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Instantiates a new DHT_Unified Humidity Class
|
||||
* @param parent
|
||||
* Parent Sensor
|
||||
* @param id
|
||||
* Sensor id
|
||||
*/
|
||||
DHT_Unified::Humidity::Humidity(DHT_Unified* parent, int32_t id):
|
||||
_parent(parent),
|
||||
_id(id)
|
||||
{}
|
||||
|
||||
/*!
|
||||
* @brief Reads the sensor and returns the data as a sensors_event_t
|
||||
* @param event
|
||||
* @return always returns true
|
||||
*/
|
||||
bool DHT_Unified::Humidity::getEvent(sensors_event_t* event) {
|
||||
// Clear event definition.
|
||||
memset(event, 0, sizeof(sensors_event_t));
|
||||
@ -153,6 +200,10 @@ bool DHT_Unified::Humidity::getEvent(sensors_event_t* event) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* @brief Provides the sensor_t data for this sensor
|
||||
* @param sensor
|
||||
*/
|
||||
void DHT_Unified::Humidity::getSensor(sensor_t* sensor) {
|
||||
// Clear sensor definition.
|
||||
memset(sensor, 0, sizeof(sensor_t));
|
||||
|
105
DHT_U.h
105
DHT_U.h
@ -1,68 +1,92 @@
|
||||
// DHT Temperature & Humidity Unified Sensor Library
|
||||
// Copyright (c) 2014 Adafruit Industries
|
||||
// Author: Tony DiCola
|
||||
/*!
|
||||
* @file DHT_U.h
|
||||
*
|
||||
* DHT Temperature & Humidity Unified Sensor Library<Paste>
|
||||
*
|
||||
* Adafruit invests time and resources providing this open source code,
|
||||
* please support Adafruit andopen-source hardware by purchasing products
|
||||
* from Adafruit!
|
||||
*
|
||||
* Written by Tony DiCola (Adafruit Industries) 2014.
|
||||
*
|
||||
* MIT license, all text above must be included in any redistribution
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
// 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
|
||||
#define DHT_SENSOR_VERSION 1 /**< Sensor Version */
|
||||
|
||||
/*!
|
||||
* @brief Class that stores state and functions for interacting with
|
||||
* DHT_Unified.
|
||||
*/
|
||||
class DHT_Unified {
|
||||
public:
|
||||
DHT_Unified(uint8_t pin, uint8_t type, uint8_t count=6, int32_t tempSensorId=-1, int32_t humiditySensorId=-1);
|
||||
DHT_Unified(uint8_t pin, uint8_t type, uint8_t count = 6,
|
||||
int32_t tempSensorId = -1, int32_t humiditySensorId = -1);
|
||||
void begin();
|
||||
|
||||
/*!
|
||||
* @brief Class that stores state and functions about Temperature
|
||||
*/
|
||||
class Temperature : public Adafruit_Sensor {
|
||||
public:
|
||||
Temperature(DHT_Unified* parent, int32_t id);
|
||||
bool getEvent(sensors_event_t* event);
|
||||
void getSensor(sensor_t* sensor);
|
||||
Temperature(DHT_Unified *parent, int32_t id);
|
||||
bool getEvent(sensors_event_t *event);
|
||||
void getSensor(sensor_t *sensor);
|
||||
|
||||
private:
|
||||
DHT_Unified* _parent;
|
||||
DHT_Unified *_parent;
|
||||
int32_t _id;
|
||||
|
||||
};
|
||||
|
||||
/*!
|
||||
* @brief Class that stores state and functions about Humidity
|
||||
*/
|
||||
class Humidity : public Adafruit_Sensor {
|
||||
public:
|
||||
Humidity(DHT_Unified* parent, int32_t id);
|
||||
bool getEvent(sensors_event_t* event);
|
||||
void getSensor(sensor_t* sensor);
|
||||
Humidity(DHT_Unified *parent, int32_t id);
|
||||
bool getEvent(sensors_event_t *event);
|
||||
void getSensor(sensor_t *sensor);
|
||||
|
||||
private:
|
||||
DHT_Unified* _parent;
|
||||
DHT_Unified *_parent;
|
||||
int32_t _id;
|
||||
|
||||
};
|
||||
|
||||
Temperature temperature() {
|
||||
return _temp;
|
||||
}
|
||||
/*!
|
||||
* @brief Returns temperature stored in _temp
|
||||
* @return Temperature value
|
||||
*/
|
||||
Temperature temperature() { return _temp; }
|
||||
|
||||
Humidity humidity() {
|
||||
return _humidity;
|
||||
}
|
||||
/*!
|
||||
* @brief Returns humidity stored in _humidity
|
||||
* @return Humidity value
|
||||
*/
|
||||
Humidity humidity() { return _humidity; }
|
||||
|
||||
private:
|
||||
DHT _dht;
|
||||
@ -70,9 +94,8 @@ private:
|
||||
Temperature _temp;
|
||||
Humidity _humidity;
|
||||
|
||||
void setName(sensor_t* sensor);
|
||||
void setMinDelay(sensor_t* sensor);
|
||||
|
||||
void setName(sensor_t *sensor);
|
||||
void setMinDelay(sensor_t *sensor);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
162
README.md
162
README.md
@ -1,14 +1,162 @@
|
||||
# Adafruit DHT Humidity & Temperature Sensor Library
|
||||
# Adafruit DHT Humidity & Temperature Sensor Library [](https://travis-ci.com/adafruit/DHT-sensor-library)
|
||||
|
||||
An Arduino library for the DHT series of low cost temperature/humidity sensors.
|
||||
## Description
|
||||
|
||||
Tutorial: https://learn.adafruit.com/dht
|
||||
An Arduino library for the DHT series of low-cost temperature/humidity sensors.
|
||||
|
||||
**You must have the following Arduino libraries installed to use this class:**
|
||||
You can find DHT tutorials [here](https://learn.adafruit.com/dht).
|
||||
|
||||
- [Adafruit Unified Sensor Library](https://github.com/adafruit/Adafruit_Sensor)
|
||||
## Installation
|
||||
|
||||
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.
|
||||
### First Method
|
||||
|
||||
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. In the Arduino IDE, navigate to Sketch > Include Library > Manage Libraries
|
||||
1. Then the Library Manager will open and you will find a list of libraries that are already installed or ready for installation.
|
||||
1. Then search for DHT-sensor using the search bar.
|
||||
1. Click on the text area and then select the specific version and install it.
|
||||
|
||||
### Second Method
|
||||
|
||||
1. Navigate to the Releases page.
|
||||
1. Download the latest release.
|
||||
1. Extract the zip file
|
||||
1. In the Arduino IDE, navigate to Sketch > Include Library > Add .ZIP Library
|
||||
|
||||
## Requirements
|
||||
|
||||
This library depends on [Adafruit Unified Sensor Library](https://github.com/adafruit/Adafruit_Sensor). To use this library the user must download the required library.
|
||||
|
||||
## Features
|
||||
|
||||
- ### Inexpensive
|
||||
|
||||
This library is used with low-cost temperature and humidity sensors, for example, DHT11 and DHT22. This library is free of cost and the only cost is of the sensors.
|
||||
|
||||
- ### Compatible
|
||||
|
||||
DHT sensor library is compatible with multiple low-cost temperature and humidity sensors like DHT11 and DHT22. A few examples are implemented just to demonstrate how to modify the code for different sensors.
|
||||
|
||||
- ### Function calls
|
||||
|
||||
Basic functions of the low-cost temperature/humidity sensors have been implemented in this library. There's no need to re-implement these functions from scratch. The user simply has to import the library in the project and can use any of its functions by just calling it.
|
||||
|
||||
- ### Give back
|
||||
|
||||
The library is free, you don’t have to pay for anything. However, if you want to support the development, or just thank the author of the library by purchasing products from Adafruit!
|
||||
|
||||
Not only you’ll encourage the development of the library, but you’ll also learn how to best use the library and probably some C++ too
|
||||
|
||||
- ### MIT License
|
||||
|
||||
DHT sensor library is open-source and uses one of the most permissive licenses so you can use it on any project.
|
||||
|
||||
- Commercial use
|
||||
- Modification
|
||||
- Distribution
|
||||
- Private use
|
||||
|
||||
## Functions
|
||||
|
||||
- begin()
|
||||
- readTemperature()
|
||||
- convertCtoF()
|
||||
- convertFtoC()
|
||||
- readHumidity()
|
||||
- computeHeatIndex()
|
||||
- read()
|
||||
- expectPulse()
|
||||
|
||||
## Example
|
||||
|
||||
Examples include both a "standalone" DHT example and one that works along with the Adafruit Unified Sensor Library. A Unified sensor library is required even if using the standalone version. You can find other examples from [Github-DHT-sensor-library](https://github.com/adafruit/DHT-sensor-library/tree/master/examples).
|
||||
|
||||
```Cpp
|
||||
#include "DHT.h"
|
||||
|
||||
#define DHTPIN 2
|
||||
#define DHTTYPE DHT22
|
||||
DHT dht(DHTPIN, DHTTYPE);
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
Serial.println(F("DHTxx test!"));
|
||||
|
||||
dht.begin();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
delay(2000);
|
||||
|
||||
float h = dht.readHumidity();
|
||||
float t = dht.readTemperature();
|
||||
float f = dht.readTemperature(true);
|
||||
|
||||
if (isnan(h) || isnan(t) || isnan(f)) {
|
||||
Serial.println(F("Failed to read from DHT sensor!"));
|
||||
return;
|
||||
}
|
||||
|
||||
float hif = dht.computeHeatIndex(f, h);
|
||||
float hic = dht.computeHeatIndex(t, h, false);
|
||||
|
||||
Serial.print(F("Humidity: "));
|
||||
Serial.print(h);
|
||||
Serial.print(F("% Temperature: "));
|
||||
Serial.print(t);
|
||||
Serial.print(F("°C "));
|
||||
Serial.print(f);
|
||||
Serial.print(F("°F Heat index: "));
|
||||
Serial.print(hic);
|
||||
Serial.print(F("°C "));
|
||||
Serial.print(hif);
|
||||
Serial.println(F("°F"));
|
||||
}
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
If you want to contribute to this project:
|
||||
|
||||
- Report bugs and errors
|
||||
- Ask for enhancements
|
||||
- Create issues and pull requests
|
||||
- Tell others about this library
|
||||
- Contribute new protocols
|
||||
|
||||
Please read [CONTRIBUTING.md](https://github.com/adafruit/DHT-sensor-library/blob/master/CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.
|
||||
|
||||
## Credits
|
||||
|
||||
The author and maintainer of this library is Adafruit <info@adafruit.com>
|
||||
|
||||
Based on previous work by:
|
||||
|
||||
- T. DiCola
|
||||
- P. Y. Dragon
|
||||
- L. Fried
|
||||
- J. Hoffmann
|
||||
- M. Kooijman
|
||||
- J. M. Dana
|
||||
- S. Conaway
|
||||
- S. IJskes
|
||||
- T. Forbes
|
||||
- B. C
|
||||
- T. J Myers
|
||||
- L. Sørup
|
||||
- per1234
|
||||
- O. Duffy
|
||||
- matthiasdanner
|
||||
- J. Lim
|
||||
- G. Ambrozio
|
||||
- chelmi
|
||||
- adams13x13
|
||||
- Spacefish
|
||||
- I. Scheller
|
||||
- C. Miller
|
||||
- 7eggert
|
||||
|
||||
## License
|
||||
|
||||
This library is licensed under [MIT license](https://opensource.org/licenses/MIT).
|
||||
|
@ -1,5 +1,5 @@
|
||||
name=DHT sensor library
|
||||
version=1.3.2
|
||||
version=1.3.8
|
||||
author=Adafruit
|
||||
maintainer=Adafruit <info@adafruit.com>
|
||||
sentence=Arduino library for DHT11, DHT22, etc Temp & Humidity Sensors
|
||||
@ -7,3 +7,4 @@ paragraph=Arduino library for DHT11, DHT22, etc Temp & Humidity Sensors
|
||||
category=Sensors
|
||||
url=https://github.com/adafruit/DHT-sensor-library
|
||||
architectures=*
|
||||
depends=Adafruit Unified Sensor
|
||||
|
Reference in New Issue
Block a user