Comments (16)
Thank you for reporting plus providing a simple solution.
from dhtnew.
Which processor do you use?
Which IDE version/ develop platform?
Thanks
from dhtnew.
There is a related issue with the delayMicroseconds(18000).
Some applications using RTOS need to call yield() for context switching, e.g. to handle a Wifi incoming buffer etc.
So the solution will be something more "complicated" than just splitting the call.
from dhtnew.
@arnowa
Created a Pull Request #73 with a rewrite of the wake-up delay.
Please verify if this fix works for you.
Replaced the delayMicroseconds(_wakeupDelay * 1100UL);
with a loop that calls yield() every iteration.
For a DHT22 alike it will be called only once, for the DHT11 alike it will be called 18 times.
// WAKE UP - add 10% extra for timing inaccuracies in sensor.
uint32_t startWakeup = micros();
do
{
// HANDLE PENDING IRQ
yield();
delayMicroseconds(1100UL);
}
while((micros() - startWakeup) < (_wakeupDelay * 1100UL));
Non-RTOS environments (e.g. UNO) implement yield() as an empty function which will be optimized away.
from dhtnew.
from dhtnew.
from dhtnew.
from dhtnew.
Good point, could make it 550.
from dhtnew.
Which board do you use?
Which IDE?
from dhtnew.
plain cheapduino Uno R3 clone (i.e. ATMega 328) and latest Arduino IDE 1.8.19 on 64 bit Linux.
from dhtnew.
Thanks.
Did some math and every 360 us would match 18 x 1100 = 19.800 exactly. Given the loop has some overhead it would at most 'overflow' 359 us.
3x better than 1100.
from dhtnew.
from dhtnew.
plain cheapduino Uno R3 clone (i.e. ATMega 328) and latest Arduino IDE 1.8.19 on 64 bit Linux.
Ok that allows me to recreate/test a bit
from dhtnew.
Did some more math/testruns and came to 180.
For DHT11 ==> 19808 us
For DHT22 ==> 1104 us
So quite a perfect (including loop overhead).
// WAKE UP - add 10% extra for timing inaccuracies in sensor.
uint32_t startWakeup = micros();
do
{
// HANDLE PENDING IRQ
yield();
delayMicroseconds(180UL);
}
while((micros() - startWakeup) < (_wakeupDelay * 1100UL));
from dhtnew.
The problem seems to be calling delayMicroseconds() with a value larger than 16383: https://www.arduino.cc/reference/en/language/functions/time/delaymicroseconds/
The parameter of delayMicros() is unsigned int that implies one could go up to 65535
(it is hand-tuned code, so I stop digging)
parameter us is multiplied by 4 here causing overflow...
// the following loop takes 1/4 of a microsecond (4 cycles)
// per iteration, so execute it four times for each microsecond of
// delay requested.
us <<= 2; // x4 us, = 4 cycles
from dhtnew.
Solution merged in master
from dhtnew.
Related Issues (20)
- Still problems with measuring negative values (AM2301) HOT 4
- Sensors getting stuck at a certain value HOT 37
- Fix negative temperature below -25.5°C HOT 1
- Humidity values higher than 100% HOT 17
- F_CPU not defined for Arduino Nano RP2040 Connect HOT 3
- read() hangs with MkrWiFi + MkrConnector Board HOT 66
- setTempOffset and setHumOffset HOT 3
- Support for SonOff Si7021 HOT 10
- ESP32 error HOT 13
- Test sketch HOT 4
- Si7021 by Sonoff HOT 16
- DHT22 registers as type 70 in 0.4.14 HOT 12
- Support for DS18B20 HOT 3
- Sonoff Si7021 gives wrong temperature and humidity HOT 5
- Compiler warning, conversion float to double HOT 7
- Ticker compatibility HOT 12
- Add support for the AM2320, AM2321 and AM2322.
- consider an enhancement to be able to compile this lib directly under espressif/platformio without Arduino layer HOT 4
- Parallel processing of multiple Sensors HOT 7
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from dhtnew.