-
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
2cfa3f2
commit d4477fa
Showing
8 changed files
with
537 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,179 @@ | ||
// | ||
// FILE: dht.cpp | ||
// AUTHOR: Rob Tillaart | ||
// VERSION: 0.2.5 | ||
// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino | ||
// URL: https://github.com/RobTillaart/Arduino/tree/master/libraries/DHTstable | ||
// | ||
// HISTORY: | ||
// 0.2.5 2020-06-30 move to own repository; update headers mainly. | ||
// 0.2.4 2018-04-03 add get-/setDisableIRQ(bool b) | ||
// 0.2.3 2018-02-21 change #defines in const int to enforce return types. | ||
// https://github.com/RobTillaart/Arduino/issues/94 | ||
// 0.2.2 2017-12-12 add support for AM23XX types more explicitly | ||
// 0.2.1 2017-09-20 fix https://github.com/RobTillaart/Arduino/issues/80 | ||
// 0.2.0 2017-07-24 fix https://github.com/RobTillaart/Arduino/issues/31 + 33 | ||
// 0.1.13 fix negative temperature | ||
// 0.1.12 support DHT33 and DHT44 initial version | ||
// 0.1.11 renamed DHTLIB_TIMEOUT | ||
// 0.1.10 optimized faster WAKEUP + TIMEOUT | ||
// 0.1.09 optimize size: timeout check + use of mask | ||
// 0.1.08 added formula for timeout based upon clockspeed | ||
// 0.1.07 added support for DHT21 | ||
// 0.1.06 minimize footprint (2012-12-27) | ||
// 0.1.05 fixed negative temperature bug (thanks to Roseman) | ||
// 0.1.04 improved readability of code using DHTLIB_OK in code | ||
// 0.1.03 added error values for temp and humidity when read failed | ||
// 0.1.02 added error codes | ||
// 0.1.01 added support for Arduino 1.0, fixed typos (31/12/2011) | ||
// 0.1.0 by Rob Tillaart (01/04/2011) | ||
// | ||
// inspired by DHT11 library | ||
// | ||
|
||
#include "dht.h" | ||
|
||
///////////////////////////////////////////////////// | ||
// | ||
// PUBLIC | ||
// | ||
|
||
// return values: | ||
// DHTLIB_OK | ||
// DHTLIB_ERROR_CHECKSUM | ||
// DHTLIB_ERROR_TIMEOUT | ||
int dht::read11(uint8_t pin) | ||
{ | ||
// READ VALUES | ||
if (_disableIRQ) noInterrupts(); | ||
int rv = _readSensor(pin, DHTLIB_DHT11_WAKEUP); | ||
if (_disableIRQ) interrupts(); | ||
if (rv != DHTLIB_OK) | ||
{ | ||
humidity = DHTLIB_INVALID_VALUE; // invalid value, or is NaN prefered? | ||
temperature = DHTLIB_INVALID_VALUE; // invalid value | ||
return rv; | ||
} | ||
|
||
// CONVERT AND STORE | ||
humidity = bits[0] + bits[1] * 0.1; | ||
temperature = (bits[2] & 0x7F) + bits[3] * 0.1; | ||
if (bits[2] & 0x80) // negative temperature | ||
{ | ||
temperature = -temperature; | ||
} | ||
|
||
// TEST CHECKSUM | ||
uint8_t sum = bits[0] + bits[1] + bits[2] + bits[3]; | ||
if (bits[4] != sum) | ||
{ | ||
return DHTLIB_ERROR_CHECKSUM; | ||
} | ||
return DHTLIB_OK; | ||
} | ||
|
||
// return values: | ||
// DHTLIB_OK | ||
// DHTLIB_ERROR_CHECKSUM | ||
// DHTLIB_ERROR_TIMEOUT | ||
int dht::read(uint8_t pin) | ||
{ | ||
// READ VALUES | ||
if (_disableIRQ) noInterrupts(); | ||
int rv = _readSensor(pin, DHTLIB_DHT_WAKEUP); | ||
if (_disableIRQ) interrupts(); | ||
if (rv != DHTLIB_OK) | ||
{ | ||
humidity = DHTLIB_INVALID_VALUE; // NaN prefered? | ||
temperature = DHTLIB_INVALID_VALUE; // NaN prefered? | ||
return rv; // propagate error value | ||
} | ||
|
||
// CONVERT AND STORE | ||
humidity = word(bits[0], bits[1]) * 0.1; | ||
temperature = word(bits[2] & 0x7F, bits[3]) * 0.1; | ||
if (bits[2] & 0x80) // negative temperature | ||
{ | ||
temperature = -temperature; | ||
} | ||
|
||
// TEST CHECKSUM | ||
uint8_t sum = bits[0] + bits[1] + bits[2] + bits[3]; | ||
if (bits[4] != sum) | ||
{ | ||
return DHTLIB_ERROR_CHECKSUM; | ||
} | ||
return DHTLIB_OK; | ||
} | ||
|
||
///////////////////////////////////////////////////// | ||
// | ||
// PRIVATE | ||
// | ||
|
||
// return values: | ||
// DHTLIB_OK | ||
// DHTLIB_ERROR_TIMEOUT | ||
int dht::_readSensor(uint8_t pin, uint8_t wakeupDelay) | ||
{ | ||
// INIT BUFFERVAR TO RECEIVE DATA | ||
uint8_t mask = 128; | ||
uint8_t idx = 0; | ||
|
||
// EMPTY BUFFER | ||
for (uint8_t i = 0; i < 5; i++) bits[i] = 0; | ||
|
||
// REQUEST SAMPLE | ||
pinMode(pin, OUTPUT); | ||
digitalWrite(pin, LOW); | ||
delay(wakeupDelay); | ||
pinMode(pin, INPUT); | ||
delayMicroseconds(40); | ||
|
||
// GET ACKNOWLEDGE or TIMEOUT | ||
uint16_t loopCnt = DHTLIB_TIMEOUT; | ||
while(digitalRead(pin) == LOW) | ||
{ | ||
if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT; | ||
} | ||
|
||
loopCnt = DHTLIB_TIMEOUT; | ||
while(digitalRead(pin) == HIGH) | ||
{ | ||
if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT; | ||
} | ||
|
||
// READ THE OUTPUT - 40 BITS => 5 BYTES | ||
for (uint8_t i = 40; i != 0; i--) | ||
{ | ||
loopCnt = DHTLIB_TIMEOUT; | ||
while(digitalRead(pin) == LOW) | ||
{ | ||
if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT; | ||
} | ||
|
||
uint32_t t = micros(); | ||
|
||
loopCnt = DHTLIB_TIMEOUT; | ||
while(digitalRead(pin) == HIGH) | ||
{ | ||
if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT; | ||
} | ||
|
||
if ((micros() - t) > 40) | ||
{ | ||
bits[idx] |= mask; | ||
} | ||
mask >>= 1; | ||
if (mask == 0) // next byte? | ||
{ | ||
mask = 128; | ||
idx++; | ||
} | ||
} | ||
|
||
return DHTLIB_OK; | ||
} | ||
// | ||
// END OF FILE | ||
// |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
// | ||
// FILE: dht.h | ||
// AUTHOR: Rob Tillaart | ||
// VERSION: 0.2.5 | ||
// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino | ||
// URL: https://github.com/RobTillaart/DHTstable | ||
// | ||
// HISTORY: | ||
// see dht.cpp file | ||
// | ||
|
||
#ifndef dht_h | ||
#define dht_h | ||
|
||
#if ARDUINO < 100 | ||
#include <WProgram.h> | ||
#else | ||
#include <Arduino.h> | ||
#endif | ||
|
||
#define DHT_LIB_VERSION "0.2.5 - dhtstable" | ||
|
||
const int DHTLIB_OK = 0; | ||
const int DHTLIB_ERROR_CHECKSUM = -1; | ||
const int DHTLIB_ERROR_TIMEOUT = -2; | ||
const int DHTLIB_INVALID_VALUE = -999; | ||
|
||
const int DHTLIB_DHT11_WAKEUP = 18; | ||
const int DHTLIB_DHT_WAKEUP = 1; | ||
|
||
// max timeout is 100usec. | ||
// For a 16Mhz proc that is max 1600 clock cycles | ||
// loops using TIMEOUT use at least 4 clock cycli | ||
// so 100 us takes max 400 loops | ||
// so by dividing F_CPU by 40000 we "fail" as fast as possible | ||
const int DHTLIB_TIMEOUT = (F_CPU/40000); | ||
|
||
class dht | ||
{ | ||
public: | ||
// return values: | ||
// DHTLIB_OK | ||
// DHTLIB_ERROR_CHECKSUM | ||
// DHTLIB_ERROR_TIMEOUT | ||
int read11(uint8_t pin); // DHT11 & DHT12 | ||
int read(uint8_t pin); // DHT22 | ||
|
||
inline int read12(uint8_t pin) { return read11(pin); }; // ok | ||
inline int read21(uint8_t pin) { return read(pin); }; // ok | ||
inline int read22(uint8_t pin) { return read(pin); }; // ok | ||
inline int read33(uint8_t pin) { return read(pin); }; // ok | ||
inline int read44(uint8_t pin) { return read(pin); }; // ok | ||
inline int read2301(uint8_t pin) { return read(pin); }; // ok | ||
inline int read2302(uint8_t pin) { return read(pin); }; // ok | ||
inline int read2320(uint8_t pin) { return read(pin); }; //.ok | ||
inline int read2322(uint8_t pin) { return read(pin); }; // ok | ||
|
||
float humidity; | ||
float temperature; | ||
|
||
bool getDisableIRQ() { return _disableIRQ; }; | ||
void setDisableIRQ(bool b ) { _disableIRQ = b; }; | ||
|
||
private: | ||
uint8_t bits[5]; // buffer to receive data | ||
int _readSensor(uint8_t pin, uint8_t wakeupDelay); | ||
bool _disableIRQ = false; | ||
}; | ||
#endif | ||
// | ||
// END OF FILE | ||
// |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
// | ||
// FILE: dht11_test.ino | ||
// AUTHOR: Rob Tillaart | ||
// VERSION: 0.1.2 | ||
// PURPOSE: DHT library test sketch for DHT11 && Arduino | ||
// URL: https://github.com/RobTillaart/DHTstable | ||
// | ||
// HISTORY: | ||
// 0.1.2 add URL in header | ||
|
||
#include <dht.h> | ||
|
||
dht DHT; | ||
|
||
#define DHT11_PIN 5 | ||
|
||
void setup() | ||
{ | ||
Serial.begin(115200); | ||
Serial.println("DHT TEST PROGRAM "); | ||
Serial.print("LIBRARY VERSION: "); | ||
Serial.println(DHT_LIB_VERSION); | ||
Serial.println(); | ||
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)"); | ||
} | ||
|
||
void loop() | ||
{ | ||
// READ DATA | ||
Serial.print("DHT11, \t"); | ||
int chk = DHT.read11(DHT11_PIN); | ||
switch (chk) | ||
{ | ||
case DHTLIB_OK: | ||
Serial.print("OK,\t"); | ||
break; | ||
case DHTLIB_ERROR_CHECKSUM: | ||
Serial.print("Checksum error,\t"); | ||
break; | ||
case DHTLIB_ERROR_TIMEOUT: | ||
Serial.print("Time out error,\t"); | ||
break; | ||
default: | ||
Serial.print("Unknown error,\t"); | ||
break; | ||
} | ||
// DISPLAY DATA | ||
Serial.print(DHT.humidity, 1); | ||
Serial.print(",\t"); | ||
Serial.println(DHT.temperature, 1); | ||
|
||
delay(2000); | ||
} | ||
// | ||
// END OF FILE | ||
// |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
// | ||
// FILE: dht12_test.ino | ||
// AUTHOR: Rob Tillaart | ||
// VERSION: 0.1.1 | ||
// PURPOSE: DHT library test sketch for DHT12 && Arduino | ||
// URL: https://github.com/RobTillaart/DHTstable | ||
// | ||
// HISTORY: | ||
// 0.1.1 add URL in header | ||
|
||
#include <dht.h> | ||
|
||
dht DHT; | ||
|
||
#define DHT12_PIN 5 | ||
|
||
void setup() | ||
{ | ||
Serial.begin(115200); | ||
Serial.println("DHT TEST PROGRAM "); | ||
Serial.print("LIBRARY VERSION: "); | ||
Serial.println(DHT_LIB_VERSION); | ||
Serial.println(); | ||
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)"); | ||
} | ||
|
||
void loop() | ||
{ | ||
// READ DATA | ||
Serial.print("DHT12, \t"); | ||
int chk = DHT.read12(DHT12_PIN); | ||
switch (chk) | ||
{ | ||
case DHTLIB_OK: | ||
Serial.print("OK,\t"); | ||
break; | ||
case DHTLIB_ERROR_CHECKSUM: | ||
Serial.print("Checksum error,\t"); | ||
break; | ||
case DHTLIB_ERROR_TIMEOUT: | ||
Serial.print("Time out error,\t"); | ||
break; | ||
default: | ||
Serial.print("Unknown error,\t"); | ||
break; | ||
} | ||
// DISPLAY DATA | ||
Serial.print(DHT.humidity, 1); | ||
Serial.print(",\t"); | ||
Serial.println(DHT.temperature, 1); | ||
|
||
delay(2000); | ||
} | ||
// | ||
// END OF FILE | ||
// |
Oops, something went wrong.