0.4.20 DHTNEW

This commit is contained in:
Rob Tillaart 2024-03-24 16:51:11 +01:00
parent 38a0039428
commit 5e1c7a2145
27 changed files with 376 additions and 311 deletions

View File

@ -1,4 +1,5 @@
# These are supported funding model platforms # These are supported funding model platforms
github: RobTillaart GitHub: RobTillaart
custom: "https://www.paypal.me/robtillaart"

View File

@ -1,13 +1,13 @@
name: Arduino-lint name: Arduino-lint
on: [push, pull_request] on: [push, pull_request]
jobs: jobs:
lint: lint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 5
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: arduino/arduino-lint-action@v1 - uses: arduino/arduino-lint-action@v1
with: with:
library-manager: update library-manager: update
compliance: strict compliance: strict

View File

@ -6,12 +6,14 @@ on: [push, pull_request]
jobs: jobs:
runTest: runTest:
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 20
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- uses: ruby/setup-ruby@v1 - uses: ruby/setup-ruby@v1
with: with:
ruby-version: 2.6 ruby-version: 2.6
- run: | - run: |
sudo sysctl vm.mmap_rnd_bits=28
gem install arduino_ci gem install arduino_ci
arduino_ci.rb arduino_ci.rb

View File

@ -9,10 +9,10 @@ on:
jobs: jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 5
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: json-syntax-check - name: json-syntax-check
uses: limitusus/json-syntax-check@v1 uses: limitusus/json-syntax-check@v2
with: with:
pattern: "\\.json$" pattern: "\\.json$"

View File

@ -6,10 +6,18 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/). and this project adheres to [Semantic Versioning](http://semver.org/).
## [0.4.20] - 2024-03-24
- fix #95, units of T & H
- update GitHub actions
- refactor **setType()** map invalid types to 0
- update readme.md
- update unit test (minor)
- minor edits
## [0.4.19] - 2023-10-25 ## [0.4.19] - 2023-10-25
- update readme.md - update readme.md
## [0.4.18] - 2023-01-09 ## [0.4.18] - 2023-01-09
- update license to 2023 - update license to 2023
- update GitHub actions - update GitHub actions

View File

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2017-2023 Rob Tillaart Copyright (c) 2017-2024 Rob Tillaart
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1,7 +1,7 @@
// //
// FILE: dhtnew.cpp // FILE: dhtnew.cpp
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// VERSION: 0.4.19 // VERSION: 0.4.20
// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino // PURPOSE: DHT Temperature & Humidity Sensor library for Arduino
// URL: https://github.com/RobTillaart/DHTNEW // URL: https://github.com/RobTillaart/DHTNEW
// //
@ -47,10 +47,10 @@ void DHTNEW::reset()
_wakeupDelay = 0; _wakeupDelay = 0;
_type = 0; _type = 0;
_humOffset = (float)0.0; _humOffset = 0.0;
_tempOffset = (float)0.0; _tempOffset = 0.0;
_humidity = (float)0.0; _humidity = 0.0;
_temperature = (float)0.0; _temperature = 0.0;
_lastRead = 0; _lastRead = 0;
_disableIRQ = true; _disableIRQ = true;
_waitForRead = false; _waitForRead = false;
@ -74,18 +74,22 @@ uint8_t DHTNEW::getType()
void DHTNEW::setType(uint8_t type) void DHTNEW::setType(uint8_t type)
{ {
if ((type == 0) || (type == 11)) // default type == 0 or unsupported
{ _type = 0;
_type = type; _wakeupDelay = DHTLIB_DHT11_WAKEUP;
_wakeupDelay = DHTLIB_DHT11_WAKEUP;
}
if ((type == 22) || (type == 23)) if ((type == 22) || (type == 23))
{ {
_type = type; _type = type;
_wakeupDelay = DHTLIB_DHT_WAKEUP; _wakeupDelay = DHTLIB_DHT_WAKEUP;
} }
else if (type == 11)
{
_type = type;
_wakeupDelay = DHTLIB_DHT11_WAKEUP;
}
// experimental 0.4.14 // experimental 0.4.14
if (type == 70) else if (type == 70)
{ {
_type = type; _type = type;
_wakeupDelay = DHTLIB_SI7021_WAKEUP; _wakeupDelay = DHTLIB_SI7021_WAKEUP;
@ -192,7 +196,7 @@ int DHTNEW::_read()
int16_t t = ((_bits[2] & 0x7F) * 256 + _bits[3]); int16_t t = ((_bits[2] & 0x7F) * 256 + _bits[3]);
if (t == 0) if (t == 0)
{ {
_temperature = (float)0.0; // prevent -0.0; _temperature = 0.0; // prevent -0.0;
} }
else else
{ {
@ -205,14 +209,14 @@ int DHTNEW::_read()
} }
// HEXDUMP DEBUG // HEXDUMP DEBUG
/* /*
Serial.println(); Serial.println();
// CHECKSUM // CHECKSUM
if (_bits[4] < 0x10) Serial.print(0); if (_bits[4] < 0x10) Serial.print(0);
Serial.print(_bits[4], HEX); Serial.print(_bits[4], HEX);
Serial.print(" "); Serial.print(" ");
// TEMPERATURE // TEMPERATURE
if (_bits[2] < 0x10) Serial.print(0); if (_bits[2] < 0x10) Serial.print(0);
Serial.print(_bits[2], HEX); Serial.print(_bits[2], HEX);
if (_bits[3] < 0x10) Serial.print(0); if (_bits[3] < 0x10) Serial.print(0);
@ -220,7 +224,7 @@ int DHTNEW::_read()
Serial.print(" "); Serial.print(" ");
Serial.print(_temperature, 1); Serial.print(_temperature, 1);
Serial.print(" "); Serial.print(" ");
// HUMIDITY // HUMIDITY
if (_bits[0] < 0x10) Serial.print(0); if (_bits[0] < 0x10) Serial.print(0);
Serial.print(_bits[0], HEX); Serial.print(_bits[0], HEX);
if (_bits[1] < 0x10) Serial.print(0); if (_bits[1] < 0x10) Serial.print(0);
@ -241,13 +245,13 @@ int DHTNEW::_read()
} }
#endif #endif
if (_humOffset != (float)0.0) if (_humOffset != 0.0)
{ {
_humidity += _humOffset; _humidity += _humOffset;
if (_humidity < 0) _humidity = 0; if (_humidity > 100) _humidity = 100;
if (_humidity > 100) _humidity = 100; else if (_humidity < 0) _humidity = 0;
} }
if (_tempOffset != (float)0.0) if (_tempOffset != 0.0)
{ {
_temperature += _tempOffset; _temperature += _tempOffset;
} }
@ -266,7 +270,7 @@ int DHTNEW::_read()
void DHTNEW::powerUp() void DHTNEW::powerUp()
{ {
digitalWrite(_dataPin, HIGH); digitalWrite(_dataPin, HIGH);
// do a dummy read to sync the sensor // do a dummy read to synchronise the sensor
read(); read();
}; };
@ -298,7 +302,10 @@ int DHTNEW::_readSensor()
uint8_t idx = 0; uint8_t idx = 0;
// EMPTY BUFFER // EMPTY BUFFER
for (uint8_t i = 0; i < 5; i++) _bits[i] = 0; for (uint8_t i = 0; i < 5; i++)
{
_bits[i] = 0;
}
// REQUEST SAMPLE - SEND WAKEUP TO SENSOR // REQUEST SAMPLE - SEND WAKEUP TO SENSOR
pinMode(_dataPin, OUTPUT); pinMode(_dataPin, OUTPUT);
@ -412,7 +419,7 @@ bool DHTNEW::_waitFor(uint8_t state, uint32_t timeout)
uint8_t count = 2; uint8_t count = 2;
while ((micros() - start) < timeout) while ((micros() - start) < timeout)
{ {
// d elayMicroseconds(1); // less # reads ==> minimizes # glitch reads // delayMicroseconds(1); // less # reads ==> minimizes # glitch reads
if (digitalRead(_dataPin) == state) if (digitalRead(_dataPin) == state)
{ {
count--; count--;

View File

@ -2,7 +2,7 @@
// //
// FILE: dhtnew.h // FILE: dhtnew.h
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// VERSION: 0.4.19 // VERSION: 0.4.20
// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino // PURPOSE: DHT Temperature & Humidity Sensor library for Arduino
// URL: https://github.com/RobTillaart/DHTNEW // URL: https://github.com/RobTillaart/DHTNEW
// //
@ -18,7 +18,7 @@
#include "Arduino.h" #include "Arduino.h"
#define DHTNEW_LIB_VERSION (F("0.4.19")) #define DHTNEW_LIB_VERSION (F("0.4.20"))
#define DHTLIB_OK 0 #define DHTLIB_OK 0
@ -59,12 +59,13 @@ public:
DHTNEW(uint8_t pin); DHTNEW(uint8_t pin);
// resets all internals to construction time // resets all internals to construction time
// might help to reset a sensor behaving badly.. // might help to reset a sensor behaving badly
void reset(); void reset();
// 0 = unknown // 0 = unknown
// 11 = DHT11 and compatibles // 11 = DHT11 and compatibles
// 22 = DHT22 and compatibles // 22 = DHT22 and compatibles
// 23 = mapped to 22 for now (AM23xx)
// 70 = Sonoff Si7021 // 70 = Sonoff Si7021
uint8_t getType(); uint8_t getType();
void setType(uint8_t type = 0); void setType(uint8_t type = 0);
@ -108,10 +109,10 @@ private:
uint8_t _dataPin = 0; uint8_t _dataPin = 0;
uint32_t _wakeupDelay = 0; uint32_t _wakeupDelay = 0;
uint8_t _type = 0; uint8_t _type = 0;
float _humOffset = (float)0.0; float _humOffset = 0.0;
float _tempOffset = (float)0.0; float _tempOffset = 0.0;
float _humidity = (float)0.0; float _humidity = 0.0;
float _temperature = (float)0.0; float _temperature = 0.0;
uint32_t _lastRead = 0; uint32_t _lastRead = 0;
bool _disableIRQ = true; bool _disableIRQ = true;
bool _waitForRead = false; bool _waitForRead = false;

View File

@ -6,30 +6,30 @@
// //
// //
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
// Note: // Note:
// Adaptive delay makes no sense anymore as the DHTNEW lib catches reads that // Adaptive delay makes no sense anymore as the DHTNEW lib catches reads that
// are done faster than READ_DELAY apart (see dhtnew.cpp file). // are done faster than READ_DELAY apart (see dhtnew.cpp file).
// that said it is the goal to get this adaptability into the library one day. // that said it is the goal to get this adaptability into the library one day.
// A way to do this is to add a function auto_calibrate() that finds the timing // A way to do this is to add a function auto_calibrate() that finds the timing
// where reading fails and use that value + safety margin (20%?) // where reading fails and use that value + safety margin (20%?)
#include <dhtnew.h> #include <dhtnew.h>
DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5 DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5
void setup() void setup()
{ {
while(!Serial); // MKR1010 needs this while(!Serial); // MKR1010 needs this
Serial.begin(115200); Serial.begin(115200);
Serial.println("dhtnew_adaptive_delay.ino"); Serial.println("dhtnew_adaptive_delay.ino");
@ -37,8 +37,8 @@ void setup()
Serial.println(DHTNEW_LIB_VERSION); Serial.println(DHTNEW_LIB_VERSION);
Serial.println(); Serial.println();
// MKR1010 needs this // MKR1010 needs this
// mySensor.setDisableIRQ(false); // mySensor.setDisableIRQ(false);
Serial.println("\n1. Type detection test, first run might take longer to determine type"); Serial.println("\n1. Type detection test, first run might take longer to determine type");
Serial.println("STAT\tHUMI\tTEMP\tTIME\tTYPE"); Serial.println("STAT\tHUMI\tTEMP\tTIME\tTYPE");
@ -97,7 +97,7 @@ void loop()
void test() void test()
{ {
static uint16_t dht_delay = 600; static uint16_t dht_delay = 600;
// READ DATA // READ DATA
uint32_t start = micros(); uint32_t start = micros();
int chk = mySensor.read(); int chk = mySensor.read();
uint32_t stop = micros(); uint32_t stop = micros();
@ -144,7 +144,7 @@ void test()
} }
dht_delay = constrain(dht_delay, 100, 5000); dht_delay = constrain(dht_delay, 100, 5000);
// DISPLAY DATA // DISPLAY DATA
Serial.print(mySensor.getHumidity(), 1); Serial.print(mySensor.getHumidity(), 1);
Serial.print(",\t"); Serial.print(",\t");
Serial.print(mySensor.getTemperature(), 1); Serial.print(mySensor.getTemperature(), 1);
@ -159,5 +159,5 @@ void test()
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -55,7 +55,7 @@ void loop()
void test(int idx) void test(int idx)
{ {
// READ DATA // READ DATA
uint32_t start = micros(); uint32_t start = micros();
int chk = ar[idx].read(); int chk = ar[idx].read();
uint32_t stop = micros(); uint32_t stop = micros();
@ -99,7 +99,7 @@ void test(int idx)
break; break;
} }
// DISPLAY DATA // DISPLAY DATA
Serial.print(ar[idx].getHumidity(), 1); Serial.print(ar[idx].getHumidity(), 1);
Serial.print(",\t"); Serial.print(",\t");
Serial.print(ar[idx].getTemperature(), 1); Serial.print(ar[idx].getTemperature(), 1);
@ -112,5 +112,5 @@ void test(int idx)
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -4,18 +4,18 @@
// PURPOSE: DHTNEW library debug sketch for Arduino // PURPOSE: DHTNEW library debug sketch for Arduino
// URL: https://github.com/RobTillaart/DHTNew // URL: https://github.com/RobTillaart/DHTNew
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
#include <dhtnew.h> #include <dhtnew.h>
DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5 DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5
void setup() void setup()
@ -26,17 +26,17 @@ void setup()
Serial.println(DHTNEW_LIB_VERSION); Serial.println(DHTNEW_LIB_VERSION);
Serial.println(); Serial.println();
// MKR1010 needs this // MKR1010 needs this
// mySensor.setDisableIRQ(false); // mySensor.setDisableIRQ(false);
} }
void loop() void loop()
{ {
delay(2000); delay(2000);
mySensor.read(); // put print statements in core lib (see read()) mySensor.read(); // put print statements in core lib (see read())
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -5,18 +5,18 @@
// DATE: 2020-06-04 // DATE: 2020-06-04
// (c) : MIT // (c) : MIT
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
#include <dhtnew.h> #include <dhtnew.h>
DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5 DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5
uint32_t count = 0; uint32_t count = 0;
uint32_t start, stop; uint32_t start, stop;
@ -26,7 +26,7 @@ uint32_t errors[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
void setup() void setup()
{ {
while(!Serial); // MKR1010 needs this while(!Serial); // MKR1010 needs this
Serial.begin(115200); Serial.begin(115200);
Serial.println("DHT_endless.ino"); Serial.println("DHT_endless.ino");
@ -34,15 +34,15 @@ void setup()
Serial.println(DHTNEW_LIB_VERSION); Serial.println(DHTNEW_LIB_VERSION);
Serial.println(); Serial.println();
// MKR1010 needs this // MKR1010 needs this
// mySensor.setDisableIRQ(false); // mySensor.setDisableIRQ(false);
} }
void loop() void loop()
{ {
count++; count++;
// show counters for OK and errors. // show counters for OK and errors.
if (count % 50 == 0) if (count % 50 == 0)
{ {
Serial.println(); Serial.println();
@ -115,7 +115,7 @@ void loop()
errors[9]++; errors[9]++;
break; break;
} }
// DISPLAY DATA // DISPLAY DATA
Serial.print(mySensor.getHumidity(), 1); Serial.print(mySensor.getHumidity(), 1);
Serial.print(",\t"); Serial.print(",\t");
Serial.print(mySensor.getTemperature(), 1); Serial.print(mySensor.getTemperature(), 1);
@ -128,5 +128,5 @@ void loop()
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -5,13 +5,13 @@
// DATE: 2021-02-19 // DATE: 2021-02-19
// (c) : MIT // (c) : MIT
// DHT PINs' layout from left to right // DHT PINs' layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
#include <dhtnew.h> #include <dhtnew.h>
@ -25,7 +25,7 @@ uint32_t errors[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
void setup() void setup()
{ {
while(!Serial); // MKR1010 needs this while(!Serial); // MKR1010 needs this
Serial.begin(115200); Serial.begin(115200);
Serial.println("DHT_endless.ino"); Serial.println("DHT_endless.ino");
@ -33,8 +33,8 @@ void setup()
Serial.println(DHTNEW_LIB_VERSION); Serial.println(DHTNEW_LIB_VERSION);
Serial.println(); Serial.println();
// MKR1010 needs this // MKR1010 needs this
// mySensor.setDisableIRQ(false); // mySensor.setDisableIRQ(false);
} }
@ -47,7 +47,7 @@ void DHTt(const uint8_t pin)
DHTNEW mySensor(pin); DHTNEW mySensor(pin);
count++; count++;
// show counters for OK and errors. // show counters for OK and errors.
if (count % 50 == 0) if (count % 50 == 0)
{ {
Serial.println(); Serial.println();
@ -120,7 +120,7 @@ void DHTt(const uint8_t pin)
errors[9]++; errors[9]++;
break; break;
} }
// DISPLAY DATA // DISPLAY DATA
Serial.print(mySensor.getHumidity(), 1); Serial.print(mySensor.getHumidity(), 1);
Serial.print(",\t"); Serial.print(",\t");
Serial.print(mySensor.getTemperature(), 1); Serial.print(mySensor.getTemperature(), 1);
@ -138,6 +138,6 @@ void loop()
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -4,30 +4,30 @@
// PURPOSE: DHTNEW library test sketch // PURPOSE: DHTNEW library test sketch
// URL: https://github.com/RobTillaart/DHTNew // URL: https://github.com/RobTillaart/DHTNew
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
#include <dhtnew.h> #include <dhtnew.h>
DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5 DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5
void setup() void setup()
{ {
while(!Serial); // MKR1010 needs this while(!Serial); // MKR1010 needs this
Serial.begin(115200); Serial.begin(115200);
Serial.println(__FILE__); Serial.println(__FILE__);
Serial.println(); Serial.println();
// MKR1010 needs this // MKR1010 needs this
// mySensor.setDisableIRQ(false); // mySensor.setDisableIRQ(false);
Serial.println("BEFORE OFFSET"); Serial.println("BEFORE OFFSET");
delay(2000); delay(2000);
@ -55,5 +55,5 @@ void loop()
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -4,13 +4,13 @@
// PURPOSE: DHTNEW library test sketch // PURPOSE: DHTNEW library test sketch
// URL: https://github.com/RobTillaart/DHTNew // URL: https://github.com/RobTillaart/DHTNew
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
#include <dhtnew.h> #include <dhtnew.h>
@ -20,7 +20,7 @@ uint64_t previousMillis;
void setup() void setup()
{ {
while(!Serial); // MKR1010 needs this while(!Serial); // MKR1010 needs this
Serial.begin(115200); Serial.begin(115200);
Serial.println(__FILE__); Serial.println(__FILE__);
@ -32,8 +32,8 @@ void DHTt(uint8_t pin)
{ {
DHTNEW mySensor(pin); DHTNEW mySensor(pin);
// MKR1010 needs this // MKR1010 needs this
// mySensor.setDisableIRQ(false); // mySensor.setDisableIRQ(false);
if (millis() - mySensor.lastRead() > 2000) if (millis() - mySensor.lastRead() > 2000)
{ {
@ -52,5 +52,5 @@ void loop()
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -4,17 +4,17 @@
// PURPOSE: DHTNEW library test sketch for Arduino // PURPOSE: DHTNEW library test sketch for Arduino
// URL: https://github.com/RobTillaart/DHTNew // URL: https://github.com/RobTillaart/DHTNew
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
// to see the effect one must apply a voltmeter to the data pin of the sensor // to see the effect one must apply a voltmeter to the data pin of the sensor
// during the low power mode. Measuring during communication will disrupt the // during the low power mode. Measuring during communication will disrupt the
// data transfer. // data transfer.
#include <dhtnew.h> #include <dhtnew.h>
@ -24,15 +24,15 @@ DHTNEW mySensor(16);
void setup() void setup()
{ {
while(!Serial); // MKR1010 needs this while(!Serial); // MKR1010 needs this
Serial.begin(115200); Serial.begin(115200);
Serial.println("dhtnew_test.ino"); Serial.println("dhtnew_test.ino");
Serial.print("LIBRARY VERSION: "); Serial.print("LIBRARY VERSION: ");
Serial.println(DHTNEW_LIB_VERSION); Serial.println(DHTNEW_LIB_VERSION);
// MKR1010 needs this // MKR1010 needs this
// mySensor.setDisableIRQ(false); // mySensor.setDisableIRQ(false);
Serial.println("\nstartup"); Serial.println("\nstartup");
delay(2000); delay(2000);
@ -43,7 +43,7 @@ void setup()
int rv = mySensor.read(); int rv = mySensor.read();
if (rv != DHTLIB_OK) if (rv != DHTLIB_OK)
{ {
Serial.println(rv); // will print -7 when measuring voltage Serial.println(rv); // will print -7 when measuring voltage
} }
Serial.print(mySensor.getHumidity(), 1); Serial.print(mySensor.getHumidity(), 1);
Serial.print(",\t"); Serial.print(",\t");
@ -58,7 +58,7 @@ void setup()
Serial.println("switch sensor on (and wait 2 seconds)"); Serial.println("switch sensor on (and wait 2 seconds)");
mySensor.powerUp(); mySensor.powerUp();
// wait for 2 seconds. // wait for 2 seconds.
delay(2000); delay(2000);
Serial.println("read sensor with 2 second interval"); Serial.println("read sensor with 2 second interval");
@ -80,5 +80,5 @@ void loop()
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -4,13 +4,13 @@
// PURPOSE: DHTNEW library pulse measurement tool - diagnostics // PURPOSE: DHTNEW library pulse measurement tool - diagnostics
// URL: https://github.com/RobTillaart/DHTNew // URL: https://github.com/RobTillaart/DHTNew
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
#include "Arduino.h" #include "Arduino.h"
@ -28,13 +28,13 @@ uint8_t idx = 0;
void setup() void setup()
{ {
while(!Serial); // MKR1010 needs this while(!Serial); // MKR1010 needs this
Serial.begin(115200); Serial.begin(115200);
Serial.println("dhtnew_pulse_diag.ino"); Serial.println("dhtnew_pulse_diag.ino");
Serial.println(); Serial.println();
// default should be HIGH // default should be HIGH
pinMode(_dataPin, OUTPUT); pinMode(_dataPin, OUTPUT);
digitalWrite(_dataPin, HIGH); digitalWrite(_dataPin, HIGH);
} }
@ -104,61 +104,61 @@ void dump()
void measure() void measure()
{ {
count++; count++;
// yield(); // handle pending interrupts // yield(); // handle pending interrupts
// reset measurements table // reset measurements table
idx = 0; idx = 0;
t = micros(); t = micros();
for (int i = 0; i < 100; i++) times[i] = 0; for (int i = 0; i < 100; i++) times[i] = 0;
times[idx++] = micros(); times[idx++] = micros();
// REQUEST SAMPLE - SEND WAKEUP TO SENSOR // REQUEST SAMPLE - SEND WAKEUP TO SENSOR
pinMode(_dataPin, OUTPUT); pinMode(_dataPin, OUTPUT);
digitalWrite(_dataPin, LOW); digitalWrite(_dataPin, LOW);
// add 10% extra for timing inaccuracies in sensor. // add 10% extra for timing inaccuracies in sensor.
delayMicroseconds(_wakeupDelay * 1100UL); delayMicroseconds(_wakeupDelay * 1100UL);
Serial.print("awake "); Serial.print("awake ");
times[idx++] = micros(); times[idx++] = micros();
// HOST GIVES CONTROL TO SENSOR // HOST GIVES CONTROL TO SENSOR
pinMode(_dataPin, INPUT_PULLUP); pinMode(_dataPin, INPUT_PULLUP);
// DISABLE INTERRUPTS when clock in the bits // DISABLE INTERRUPTS when clock in the bits
// noInterrupts(); // gives problems on AVR // noInterrupts(); // gives problems on AVR
times[idx++] = micros(); times[idx++] = micros();
// SENSOR PULLS LOW after 20-40 us => if stays HIGH ==> device not ready // SENSOR PULLS LOW after 20-40 us => if stays HIGH ==> device not ready
while (digitalRead(_dataPin) == HIGH); while (digitalRead(_dataPin) == HIGH);
Serial.print("2 "); Serial.print("2 ");
times[idx++] = micros(); times[idx++] = micros();
// SENSOR STAYS LOW for ~80 us => or TIMEOUT // SENSOR STAYS LOW for ~80 us => or TIMEOUT
while (digitalRead(_dataPin) == LOW); while (digitalRead(_dataPin) == LOW);
Serial.print("3 "); Serial.print("3 ");
times[idx++] = micros(); times[idx++] = micros();
// SENSOR STAYS HIGH for ~80 us => or TIMEOUT // SENSOR STAYS HIGH for ~80 us => or TIMEOUT
while (digitalRead(_dataPin) == HIGH); while (digitalRead(_dataPin) == HIGH);
times[idx++] = micros(); times[idx++] = micros();
Serial.print("4 "); Serial.print("4 ");
// SENSOR HAS NOW SEND ACKNOWLEDGE ON WAKEUP // SENSOR HAS NOW SEND ACKNOWLEDGE ON WAKEUP
// NOW IT SENDS THE BITS // NOW IT SENDS THE BITS
// READ THE OUTPUT - 40 BITS => 5 BYTES // READ THE OUTPUT - 40 BITS => 5 BYTES
uint32_t start = micros(); uint32_t start = micros();
uint8_t i = 40; uint8_t i = 40;
for (i = 40; i != 0; i--) for (i = 40; i != 0; i--)
{ {
times[idx++] = micros(); times[idx++] = micros();
// EACH BIT START WITH ~50 us LOW // EACH BIT START WITH ~50 us LOW
while (digitalRead(_dataPin) == LOW) while (digitalRead(_dataPin) == LOW)
{ {
if (micros() - start > 10000) if (micros() - start > 10000)
@ -171,9 +171,9 @@ void measure()
} }
times[idx++] = micros(); times[idx++] = micros();
// DURATION OF HIGH DETERMINES 0 or 1 // DURATION OF HIGH DETERMINES 0 or 1
// 26-28 us ==> 0 // 26-28 us ==> 0
// 70 us ==> 1 // 70 us ==> 1
while (digitalRead(_dataPin) == HIGH) while (digitalRead(_dataPin) == HIGH)
{ {
if (micros() - start > 10000) if (micros() - start > 10000)
@ -187,8 +187,8 @@ void measure()
Serial.print("5 "); Serial.print("5 ");
times[idx++] = micros(); times[idx++] = micros();
// After 40 bits the sensor pulls the line LOW for 50 us // After 40 bits the sensor pulls the line LOW for 50 us
// TODO: should we wait? // TODO: should we wait?
while (digitalRead(_dataPin) == LOW); while (digitalRead(_dataPin) == LOW);
Serial.print("6 "); Serial.print("6 ");
@ -206,4 +206,4 @@ void measure()
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -4,33 +4,33 @@
// PURPOSE: DHTNEW library test sketch // PURPOSE: DHTNEW library test sketch
// URL: https://github.com/RobTillaart/DHTNew // URL: https://github.com/RobTillaart/DHTNew
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
#include <dhtnew.h> #include <dhtnew.h>
DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5 DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5
uint32_t lastTime = 0; uint32_t lastTime = 0;
void setup() void setup()
{ {
while(!Serial); // MKR1010 needs this while(!Serial); // MKR1010 needs this
Serial.begin(115200); Serial.begin(115200);
Serial.println(__FILE__); Serial.println(__FILE__);
Serial.print("DHTNEW_LIB_VERSION: "); Serial.print("DHTNEW_LIB_VERSION: ");
Serial.println(DHTNEW_LIB_VERSION); Serial.println(DHTNEW_LIB_VERSION);
// MKR1010 needs this // MKR1010 needs this
// mySensor.setDisableIRQ(false); // mySensor.setDisableIRQ(false);
} }
@ -52,9 +52,9 @@ void loop()
} }
} }
// Do other things here // Do other things here
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -4,23 +4,23 @@
// PURPOSE: DHTNEW library waitForRead example sketch for Arduino // PURPOSE: DHTNEW library waitForRead example sketch for Arduino
// URL: https://github.com/RobTillaart/DHTNew // URL: https://github.com/RobTillaart/DHTNew
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
#include <dhtnew.h> #include <dhtnew.h>
DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5 DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5
void setup() void setup()
{ {
while(!Serial); // MKR1010 needs this while(!Serial); // MKR1010 needs this
Serial.begin(115200); Serial.begin(115200);
Serial.println(__FILE__); Serial.println(__FILE__);
@ -28,10 +28,10 @@ void setup()
Serial.println(DHTNEW_LIB_VERSION); Serial.println(DHTNEW_LIB_VERSION);
Serial.println(); Serial.println();
// MKR1010 needs this // MKR1010 needs this
// mySensor.setDisableIRQ(false); // mySensor.setDisableIRQ(false);
delay(2000); // boot time delay(2000); // boot time
mySensor.setWaitForReading(true); mySensor.setWaitForReading(true);
@ -60,7 +60,7 @@ void setup()
} }
} }
// safety margin of 100 uSec // safety margin of 100 uSec
rd += 100; rd += 100;
mySensor.setReadDelay(rd); mySensor.setReadDelay(rd);
Serial.print("\nreadDelay set to (ms) : "); Serial.print("\nreadDelay set to (ms) : ");
@ -71,8 +71,8 @@ void setup()
void loop() void loop()
{ {
// Note: the library prevents reads faster than readDelay... // Note: the library prevents reads faster than readDelay...
// it will return previous values for T & H // it will return previous values for T & H
int chk = mySensor.read(); int chk = mySensor.read();
Serial.print(millis()); Serial.print(millis());
Serial.print("\t"); Serial.print("\t");
@ -127,5 +127,5 @@ void printStatus(int chk)
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -4,16 +4,16 @@
// PURPOSE: DHTNEW library test sketch // PURPOSE: DHTNEW library test sketch
// URL: https://github.com/RobTillaart/DHTNew // URL: https://github.com/RobTillaart/DHTNew
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
// run sketch without connected sensor to see effect // run sketch without connected sensor to see effect
#include <dhtnew.h> #include <dhtnew.h>

View File

@ -4,23 +4,23 @@
// PURPOSE: DHTNEW library test sketch for Arduino // PURPOSE: DHTNEW library test sketch for Arduino
// URL: https://github.com/RobTillaart/DHTNew // URL: https://github.com/RobTillaart/DHTNew
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
#include <dhtnew.h> #include <dhtnew.h>
DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5 DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5
void setup() void setup()
{ {
while(!Serial); // MKR1010 needs this while(!Serial); // MKR1010 needs this
Serial.begin(115200); Serial.begin(115200);
Serial.println("dhtnew_test.ino"); Serial.println("dhtnew_test.ino");
@ -28,8 +28,8 @@ void setup()
Serial.println(DHTNEW_LIB_VERSION); Serial.println(DHTNEW_LIB_VERSION);
Serial.println(); Serial.println();
// MKR1010 // MKR1010
// mySensor.setDisableIRQ(false); // mySensor.setDisableIRQ(false);
Serial.println("\n1. Type detection test, first run might take longer to determine type"); Serial.println("\n1. Type detection test, first run might take longer to determine type");
Serial.println("STAT\tHUMI\tTEMP\tTIME\tTYPE"); Serial.println("STAT\tHUMI\tTEMP\tTIME\tTYPE");
@ -86,7 +86,7 @@ void loop()
void test() void test()
{ {
// READ DATA // READ DATA
uint32_t start = micros(); uint32_t start = micros();
int chk = mySensor.read(); int chk = mySensor.read();
uint32_t stop = micros(); uint32_t stop = micros();
@ -127,7 +127,7 @@ void test()
break; break;
} }
// DISPLAY DATA // DISPLAY DATA
Serial.print(mySensor.getHumidity(), 1); Serial.print(mySensor.getHumidity(), 1);
Serial.print(",\t"); Serial.print(",\t");
Serial.print(mySensor.getTemperature(), 1); Serial.print(mySensor.getTemperature(), 1);
@ -140,5 +140,5 @@ void test()
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -4,23 +4,23 @@
// PURPOSE: DHTNEW library waitForRead example sketch for Arduino // PURPOSE: DHTNEW library waitForRead example sketch for Arduino
// URL: https://github.com/RobTillaart/DHTNew // URL: https://github.com/RobTillaart/DHTNew
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
#include <dhtnew.h> #include <dhtnew.h>
DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5 DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5
void setup() void setup()
{ {
while(!Serial); // MKR1010 needs this while(!Serial); // MKR1010 needs this
Serial.begin(115200); Serial.begin(115200);
Serial.println("\n"); Serial.println("\n");
@ -29,8 +29,8 @@ void setup()
Serial.println(DHTNEW_LIB_VERSION); Serial.println(DHTNEW_LIB_VERSION);
Serial.println(); Serial.println();
// MKR1010 needs this // MKR1010 needs this
// mySensor.setDisableIRQ(false); // mySensor.setDisableIRQ(false);
Serial.println("This sketch shows the use of the setWaitForReading() flag (default value is false)."); Serial.println("This sketch shows the use of the setWaitForReading() flag (default value is false).");
Serial.println("Setting the flag to true will make the sketch wait until the sensor is ready to take another reading."); Serial.println("Setting the flag to true will make the sketch wait until the sensor is ready to take another reading.");
@ -66,16 +66,16 @@ void loop()
void test() void test()
{ {
// READ DATA // READ DATA
uint32_t start = micros(); uint32_t start = micros();
int chk = mySensor.read(); int chk = mySensor.read();
uint32_t stop = micros(); uint32_t stop = micros();
uint32_t duration = stop - start; uint32_t duration = stop - start;
// DISPLAY IF OLD OR NEW DATA // DISPLAY IF OLD OR NEW DATA
if (duration > 50){Serial.print("NEW\t");}else{Serial.print("OLD\t");} if (duration > 50){Serial.print("NEW\t");}else{Serial.print("OLD\t");}
// DISPLAY DATA // DISPLAY DATA
Serial.print(mySensor.getHumidity(), 1); Serial.print(mySensor.getHumidity(), 1);
Serial.print(",\t"); Serial.print(",\t");
Serial.print(mySensor.getTemperature(), 1); Serial.print(mySensor.getTemperature(), 1);
@ -122,5 +122,5 @@ void test()
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -4,23 +4,23 @@
// PURPOSE: DHTNEW non-blocking wait for read example sketch for Arduino // PURPOSE: DHTNEW non-blocking wait for read example sketch for Arduino
// URL: https://github.com/RobTillaart/DHTNew // URL: https://github.com/RobTillaart/DHTNew
// DHT PIN layout from left to right // DHT PIN layout from left to right
// ================================= // =================================
// FRONT : DESCRIPTION // FRONT : DESCRIPTION
// pin 1 : VCC // pin 1 : VCC
// pin 2 : DATA // pin 2 : DATA
// pin 3 : Not Connected // pin 3 : Not Connected
// pin 4 : GND // pin 4 : GND
#include <dhtnew.h> #include <dhtnew.h>
DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5 DHTNEW mySensor(5); // ESP 16 UNO 5 MKR1010 5
void setup() void setup()
{ {
while(!Serial); // MKR1010 needs this while(!Serial); // MKR1010 needs this
Serial.begin(115200); Serial.begin(115200);
Serial.println("\n"); Serial.println("\n");
@ -29,8 +29,8 @@ void setup()
Serial.println(DHTNEW_LIB_VERSION); Serial.println(DHTNEW_LIB_VERSION);
Serial.println(); Serial.println();
// MKR1010 needs this // MKR1010 needs this
// mySensor.setDisableIRQ(false); // mySensor.setDisableIRQ(false);
Serial.println("This example shows how you can use the output of the read() function to implement non-blocking waiting for read."); Serial.println("This example shows how you can use the output of the read() function to implement non-blocking waiting for read.");
Serial.println("In this example, Arduino continuously polls the read() function and returns fresh data (or an error) only when the read delay is over."); Serial.println("In this example, Arduino continuously polls the read() function and returns fresh data (or an error) only when the read delay is over.");
@ -42,7 +42,7 @@ void setup()
void loop() void loop()
{ {
// READ DATA // READ DATA
uint32_t start = micros(); uint32_t start = micros();
int chk = mySensor.read(); int chk = mySensor.read();
uint32_t stop = micros(); uint32_t stop = micros();
@ -81,7 +81,7 @@ void loop()
break; break;
} }
// DISPLAY DATA // DISPLAY DATA
Serial.print(mySensor.getHumidity(), 1); Serial.print(mySensor.getHumidity(), 1);
Serial.print(",\t"); Serial.print(",\t");
Serial.print(mySensor.getTemperature(), 1); Serial.print(mySensor.getTemperature(), 1);
@ -92,10 +92,10 @@ void loop()
Serial.println(mySensor.getType()); Serial.println(mySensor.getType());
} }
// do some other stuff // do some other stuff
delay(100); delay(100);
} }
// -- END OF FILE -- // -- END OF FILE --

View File

@ -13,7 +13,7 @@
"type": "git", "type": "git",
"url": "https://github.com/RobTillaart/DHTNEW.git" "url": "https://github.com/RobTillaart/DHTNEW.git"
}, },
"version": "0.4.19", "version": "0.4.20",
"license": "MIT", "license": "MIT",
"frameworks": "*", "frameworks": "*",
"platforms": "*", "platforms": "*",

View File

@ -1,5 +1,5 @@
name=DHTNEW name=DHTNEW
version=0.4.19 version=0.4.20
author=Rob Tillaart <rob.tillaart@gmail.com> author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com> maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence=Arduino library for DHT temperature and humidity sensor, with automatic sensortype recognition. sentence=Arduino library for DHT temperature and humidity sensor, with automatic sensortype recognition.

View File

@ -22,6 +22,9 @@ This is the main development library of all my DHT libraries.
Supports DHT11, DHT22, DHT33, DHT44, AM2301, AM2302, AM2303 as these all have the same protocol. Supports DHT11, DHT22, DHT33, DHT44, AM2301, AM2302, AM2303 as these all have the same protocol.
Note there are differences e.g. DHT11 has no negative temperature, no decimals, and a longer wakeup time. Note there are differences e.g. DHT11 has no negative temperature, no decimals, and a longer wakeup time.
The DHTNew library returns Temperature in degrees Celsius and Humidity in 0.0 - 100.0 %RH.
For converting temperature to Fahrenheit or Kelvin, see https://github.com/RobTillaart/Temperature.
#### Sonoff Si7021 #### Sonoff Si7021
@ -43,7 +46,7 @@ Not tested myself, but AM2320 is confirmed to work, see https://github.com/RobTi
As the AM2321 and AM2322 are quite identical according to the datasheet, those are expected to work too. As the AM2321 and AM2322 are quite identical according to the datasheet, those are expected to work too.
To use the library one should call **setType(22)** as the protocol is identical to the DHT22. To use the library one should call **setType(22)** as the protocol is identical to the DHT22.
If there are differences in operation type (23) will be implemented. If there are differences in operation type (23) will be elaborated.
The value 23 is now mapped upon 22 code. The value 23 is now mapped upon 22 code.
Feedback (both positive and negative) about the AM232X sensors is welcome. Feedback (both positive and negative) about the AM232X sensors is welcome.
@ -56,36 +59,38 @@ Feedback (both positive and negative) about the AM232X sensors is welcome.
- https://github.com/RobTillaart/DHTNew - https://github.com/RobTillaart/DHTNew
- https://github.com/RobTillaart/DHTStable - https://github.com/RobTillaart/DHTStable
- https://github.com/RobTillaart/DHT_Simulator - https://github.com/RobTillaart/DHT_Simulator
- https://www.kandrsmith.org/RJS/Misc/Hygrometers/calib_many.html (interesting)
- https://github.com/RobTillaart/Temperature (conversions, dewPoint, heatindex etc)
## DHT PIN layout from left to right ## DHT PIN layout from left to right
| Front | | Description | | Front | | Description |
|:------|:----:|:--------------| |:--------|:----:|:----------------|
| pin 1 | | VCC | | pin 1 | | VCC |
| pin 2 | | DATA | | pin 2 | | DATA |
| pin 3 | | Not Connected | | pin 3 | | Not Connected |
| pin 4 | | GND | | pin 4 | | GND |
**Note: check the datasheet how to connect!** **Note: check the datasheet how to connect!**
## Specification DHT22 ## Specification DHT22
| Model | DHT22 | Notes | | Model | DHT22 | Notes |
|:--------------------------|:-----------------------|:------| |:----------------------------|:-------------------------|:--------|
| Power supply | 3.3 - 6 V DC | | Power supply | 3.3 - 6.0 V DC |
| Output signal | digital signal via single-bus | | Output signal | digital signal via single-bus |
| Sensing element | Polymer capacitor | | Sensing element | polymer capacitor |
| Operating range | humidity 0-100% RH | temperature -40° - 80° Celsius | Operating range | humidity 0.0-100.0% RH | temperature -40° - 80° Celsius
| Accuracy humidity | ±2% RH(Max ±5% RH) | temperature < ±0.5° Celsius | Accuracy humidity | ±2% RH(Max ±5% RH) | temperature < ±0.5° Celsius
| Resolution or sensitivity | humidity 0.1% RH | temperature 0.1° Celsius | Resolution or sensitivity | humidity 0.1% RH | temperature 0.1° Celsius
| Repeatability humidity | ±1% RH | temperature ±0.2° Celsius | Repeatability humidity | ±1.0% RH | temperature ±0.2° Celsius
| Humidity hysteresis | ±0.3% RH | | Humidity hysteresis | ±0.3% RH |
| Long-term Stability | ±0.5% RH/year | | Long-term Stability | ±0.5% RH/year |
| Sensing period | Average: 2s | | Sensing period | average: 2 s |
| Interchangeability | fully interchangeable | | Interchangeability | fully interchangeable |
| Dimensions | small 14 x 18 x 5.5 mm | big 22 x 28 x 5 mm | | Dimensions | small 14 x 18 x 5.5 mm | big 22 x 28 x 5 mm |
## Interface ## Interface
@ -104,28 +109,37 @@ In case of 0, **getType()** will try to determine type.
Since 0.4.14 type 70 is added for **experimental** Sonoff Si7021 support. Since 0.4.14 type 70 is added for **experimental** Sonoff Si7021 support.
- **void setType(uint8_t type = 0)** allows to force the type of the sensor. - **void setType(uint8_t type = 0)** allows to force the type of the sensor.
| type | sensors | notes | | Type | Sensors | Notes |
|:------:|:---------------:|:---------------| |:-------:|:---------------:|:--------|
| 0 | not defined | | | 0 | not defined |
| 11 | DHT11 | | | 11 | DHT11 |
| 22 | DHT22 a.o | most others | | 22 | DHT22 a.o | most others
| 70 | Sonoff Si7021 | experimental | | 23 | DHT22 a.o | mapped to 22 for now
| 70 | Sonoff Si7021 | experimental
| other | sets to 0 | 0.4.20
### Base interface ### Base interface
- **int read()** reads a new temperature and humidity from the sensor - **int read()** reads a new temperature (Celsius) and humidity (%RH) from the sensor.
- **uint32_t lastRead()** returns milliseconds since last **read()** - **uint32_t lastRead()** returns milliseconds since last **read()**
- **float getHumidity()** returns last read value (float) or -999 in case of error. - **float getHumidity()** returns last read humidity = 0.0 - 100.0 %RH.
In case of an error it returns **DHTLIB_INVALID_VALUE** == -999.
Note this error value can be suppressed by **setSuppressError(bool)**. Note this error value can be suppressed by **setSuppressError(bool)**.
- **float getTemperature()** returns last read value (float) or -999 in case of error. - **float getTemperature()** returns last read temperature in Celsius.
Range depends on the sensor.
In case of an error it returns **DHTLIB_INVALID_VALUE** == -999.
Note this error value can be suppressed by **setSuppressError(bool)**. Note this error value can be suppressed by **setSuppressError(bool)**.
### Offset ### Offset
Adding offsets works well in normal range however they might introduce under- or overflow at the ends of the sensor range. Adding offsets works well in normal range however they might introduce
humidity is constrained to 0..100% in the code. For temperature such constrain would be type dependant, so not done. under- or overflow at the ends of the sensor range.
Humidity is in % RH.
Humidity is constrained to 0.0 - 100.0 % in the code.
Temperature is in degrees Celsius.
For temperature such constrain would be type dependant, so it is not done.
- **void setHumOffset(float offset)** typical < ±5% RH. - **void setHumOffset(float offset)** typical < ±5% RH.
- **void setTempOffset(float offset)** typical < ±2°C. - **void setTempOffset(float offset)** typical < ±2°C.
@ -137,18 +151,21 @@ humidity is constrained to 0..100% in the code. For temperature such constrain w
Functions to adjust the communication with the sensor. Functions to adjust the communication with the sensor.
- **void setDisableIRQ(bool b )** allows or suppresses interrupts during core read function to keep timing as correct as possible. **Note AVR + MKR1010** - **void setDisableIRQ(bool b )** allows or suppresses interrupts during core
read function to keep timing as correct as possible. **Note AVR + MKR1010**
- **bool getDisableIRQ()** returns the above setting. Default **true**. - **bool getDisableIRQ()** returns the above setting. Default **true**.
- **void setWaitForReading(bool b )** flag to enforce a blocking wait. - **void setWaitForReading(bool b )** flag to enforce a blocking wait.
- **bool getWaitForReading()** returns the above setting. - **bool getWaitForReading()** returns the above setting.
- **void setReadDelay(uint16_t rd = 0)** To tune the time it waits before actual read. This reduces the blocking time. - **void setReadDelay(uint16_t rd = 0)** To tune the time it waits before actual read.
This reduces the blocking time.
Default depends on type. 1000 ms (dht11) or 2000 ms (dht22). Default depends on type. 1000 ms (dht11) or 2000 ms (dht22).
set readDelay to 0 will reset to datasheet values AFTER a call to **read()**. set readDelay to 0 will reset to datasheet values AFTER a call to **read()**.
- **uint16_t getReadDelay()** returns the above setting. - **uint16_t getReadDelay()** returns the above setting.
- **void powerDown()** pulls dataPin down to reduce power consumption - **void powerDown()** pulls dataPin down to reduce power consumption
- **void powerUp()** restarts the sensor, note one must wait up to two seconds. - **void powerUp()** restarts the sensor, note one must wait up to two seconds.
- **void setSuppressError(bool b)** suppress error values of -999 => you need to check the return value of read() instead. - **void setSuppressError(bool b)** suppress error values of -999 =>
This is used to keep spikes out of your graphs / logs. You need to check the return value of read() instead.
This is used to keep spikes out of your plotter / graphs / logs.
- **bool getSuppressError()** returns the above setting. - **bool getSuppressError()** returns the above setting.
@ -298,6 +315,8 @@ fix #86, define constants explicit as float.
Update readme.md and library.\* about support for AM2320/21/22. Update readme.md and library.\* about support for AM2320/21/22.
35. (0.4.19) 35. (0.4.19)
Update readme.md Update readme.md
36. (0.4.20)
Update GitHub actions and readme.md
## Future ## Future
@ -318,13 +337,20 @@ Update readme.md
#### Could #### Could
- improve unit test - test compatibility => table.
- investigate temperature constraining (type dependant) - investigate temperature constraining (type dependant)
- fix DHTLIB_VALUE_OUT_OF_RANGE code
- move all code from .h to .cpp ```cpp
if (type == 11) temp = constrain(temp, 0, 100);
if (type == 22) temp = constrain(temp, -40, 80);
etc.
```
#### Wont #### Wont
- move all code from .h to .cpp
## Support ## Support

View File

@ -21,7 +21,6 @@
#include <ArduinoUnitTests.h> #include <ArduinoUnitTests.h>
#include "Arduino.h"
#include "dhtnew.h" #include "dhtnew.h"
@ -46,10 +45,12 @@ unittest(test_constants)
assertEqual(-6, DHTLIB_ERROR_TIMEOUT_D ); assertEqual(-6, DHTLIB_ERROR_TIMEOUT_D );
assertEqual(-7, DHTLIB_ERROR_TIMEOUT_B ); assertEqual(-7, DHTLIB_ERROR_TIMEOUT_B );
assertEqual(-8, DHTLIB_WAITING_FOR_READ ); assertEqual(-8, DHTLIB_WAITING_FOR_READ );
assertEqual(-100, DHTLIB_HUMIDITY_OUT_OF_RANGE ); assertEqual(-100, DHTLIB_HUMIDITY_OUT_OF_RANGE );
assertEqual(-101, DHTLIB_TEMPERATURE_OUT_OF_RANGE); assertEqual(-101, DHTLIB_TEMPERATURE_OUT_OF_RANGE);
assertEqual(50, DHTLIB_BIT_THRESHOLD);
assertEqual(-999, DHTLIB_INVALID_VALUE); assertEqual(-999, DHTLIB_INVALID_VALUE);
} }
@ -58,17 +59,24 @@ unittest(test_constructor)
{ {
DHTNEW dht(4); DHTNEW dht(4);
// verify default flags // verify default flags
// assertEqual(0, dht.getType()); // calls read which blocks. // assertEqual(0, dht.getType()); // calls read which blocks.
assertEqual(0.0, dht.getHumidity());
assertEqual(0.0, dht.getTemperature());
assertEqual(0, dht.getHumOffset()); assertEqual(0, dht.getHumOffset());
assertEqual(0, dht.getTempOffset()); assertEqual(0, dht.getTempOffset());
#if defined(__AVR__)
assertEqual(0, dht.lastRead());
#if defined(__AVR__)
fprintf(stderr, "__AVR__ defined."); fprintf(stderr, "__AVR__ defined.");
assertFalse(dht.getDisableIRQ()); assertFalse(dht.getDisableIRQ());
#else #else
fprintf(stderr, "__AVR__ not defined."); fprintf(stderr, "__AVR__ not defined.");
assertTrue(dht.getDisableIRQ()); assertTrue(dht.getDisableIRQ());
#endif #endif
assertFalse(dht.getWaitForReading()); assertFalse(dht.getWaitForReading());
assertEqual(0, dht.getReadDelay()); assertEqual(0, dht.getReadDelay());
assertFalse(dht.getSuppressError()); assertFalse(dht.getSuppressError());
@ -83,7 +91,7 @@ unittest(test_hum_temp)
assertEqual(0, dht.getHumOffset()); assertEqual(0, dht.getHumOffset());
dht.setHumOffset(1.5); dht.setHumOffset(1.5);
assertEqual(1.5, dht.getHumOffset()); assertEqual(1.5, dht.getHumOffset());
assertEqual(0, dht.getTemperature()); assertEqual(0, dht.getTemperature());
assertEqual(0, dht.getTempOffset()); assertEqual(0, dht.getTempOffset());
dht.setTempOffset(-1.5); dht.setTempOffset(-1.5);
@ -91,7 +99,7 @@ unittest(test_hum_temp)
} }
unittest(test_process_flags) unittest(test_setType)
{ {
DHTNEW dht(4); DHTNEW dht(4);
@ -99,17 +107,27 @@ unittest(test_process_flags)
assertEqual(11, dht.getType()); assertEqual(11, dht.getType());
dht.setType(22); dht.setType(22);
assertEqual(22, dht.getType()); assertEqual(22, dht.getType());
dht.setType(23);
assertEqual(23, dht.getType());
dht.setType(70);
assertEqual(70, dht.getType());
}
unittest(test_process_flags)
{
DHTNEW dht(4);
dht.setDisableIRQ(true); dht.setDisableIRQ(true);
assertTrue(dht.getDisableIRQ()); assertTrue(dht.getDisableIRQ());
dht.setDisableIRQ(false); dht.setDisableIRQ(false);
assertFalse(dht.getDisableIRQ()); assertFalse(dht.getDisableIRQ());
dht.setWaitForReading(true); dht.setWaitForReading(true);
assertTrue(dht.getWaitForReading()); assertTrue(dht.getWaitForReading());
dht.setWaitForReading(false); dht.setWaitForReading(false);
assertFalse(dht.getWaitForReading()); assertFalse(dht.getWaitForReading());
dht.setReadDelay(1500); dht.setReadDelay(1500);
assertEqual(1500, dht.getReadDelay()); assertEqual(1500, dht.getReadDelay());
dht.setType(11); dht.setType(11);
@ -118,7 +136,7 @@ unittest(test_process_flags)
dht.setType(22); dht.setType(22);
dht.setReadDelay(); dht.setReadDelay();
assertEqual(0, dht.getReadDelay()); assertEqual(0, dht.getReadDelay());
dht.setSuppressError(true); dht.setSuppressError(true);
assertTrue(dht.getSuppressError()); assertTrue(dht.getSuppressError());
dht.setSuppressError(false); dht.setSuppressError(false);
@ -131,13 +149,15 @@ unittest(test_read)
DHTNEW dht(4); DHTNEW dht(4);
fprintf(stderr, "\tread() cannot be tested GODMODE?\n"); fprintf(stderr, "\tread() cannot be tested GODMODE?\n");
// int rc = dht.read(); // int rc = dht.read();
// fprintf(stderr, "%d\n", rc); // fprintf(stderr, "%d\n", rc);
long lr = dht.lastRead(); long lr = dht.lastRead();
fprintf(stderr, "\ttime since lastRead %ld\n", lr); fprintf(stderr, "\ttime since lastRead %ld\n", lr);
} }
unittest_main() unittest_main()
// --------
// -- END OF FILE --