Open brlnr23 opened 3 years ago
@brlnr23 Hello, I adapted a little the code in the webpage that you mentioned. Could you try this code, changing DHT11 for DHT22, unfortunately I do not have that Sensor for testing. It worked for mi Using a Raspberry PI 3. I can tested also in a ZERO W if needed.
import Adafruit_DHT as dht
from time import sleep
DHT = 4 # Set DATA pin
while True:
# Read Temp and Hum from DHT11
h, t = dht.read_retry(dht.DHT11, DHT) # If using DHT22, change the Value here
print('Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(t, h))
sleep(5) # Wait 5 seconds and read again
Could you test with this code again?
I'm a bit confused by this discussion -- Adafruit_DHT is a deprecated library https://github.com/adafruit/Adafruit_Python_DHT and is not the same as Adafruit_CircuitPython_DHT https://github.com/adafruit/Adafruit_CircuitPython_DHT
Adafruit_CircuitPython_DHT "should" handle negative temperatures properly for a DHT22. The DHT11 cannot measure negative temperatures.
I am confused now as well .oO
The docs for CircuitPython mention import Adafruit
(https://github.com/adafruit/Adafruit_CircuitPython_DHT#basics)
I would be happy to test and help, but I would need some more details how I could make use of the non-deprecated library.
@jposada202020 , thanks for this snippet. It runs but unfortunately the current temp is - believe it or not - above 0 ;) Nevertheless I will closely monitor this and post updates if any.
Hello, just to clarify:
Sorry for the confusion. And you are lucky @brlnr23 regarding the temp here today is -14 ;)
@jposada202020, now I can confirm that the snippet does not work. As soon as it's below 0°C the values are way off :/ If the new library fixes this, I would be happy if someone could highlight how I can use the new library (ideally besides the old one which is used in separate other scripts)
@brlnr23. You should try the simple test in the examples. https://github.com/adafruit/Adafruit_CircuitPython_DHT/blob/master/examples/dht_simpletest.py. This example use the new library. And as jerryneedell mentioned before it should be working for below 0 temperatures..
If you are using a Raspberry Pi, then you will have to also install the "Blinka" compatibility system as descried here https://learn.adafruit.com/circuitpython-on-raspberrypi-linux
not sure what I am doing wrong, but I can't manage to get negative values :/ Is there any possibility for further checks?
This is the script I used after installing blinka.
#!/usr/bin/env python3
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
import time
import board
import adafruit_dht
# Initial the dht device, with data pin connected to:
dhtDevice = adafruit_dht.DHT22(board.D4)
# you can pass DHT22 use_pulseio=False if you wouldn't like to use pulseio.
# This may be necessary on a Linux single board computer like the Raspberry Pi,
# but it will not work in CircuitPython.
dhtDevice = adafruit_dht.DHT22(board.D4, use_pulseio=False)
while True:
try:
# Print the values to the serial port
temperature_c = dhtDevice.temperature
temperature_f = temperature_c * (9 / 5) + 32
humidity = dhtDevice.humidity
print(
"Temp: {:.1f} F / {:.1f} C Humidity: {}% ".format(
temperature_f, temperature_c, humidity
)
)
except RuntimeError as error:
# Errors happen fairly often, DHT's are hard to read, just keep going
print(error.args[0])
time.sleep(2.0)
continue
except Exception as error:
dhtDevice.exit()
raise error
time.sleep(2.0)
called from CLI via
./dht_simpletest.py
and this is the output I got
Temp: -5865.9 F / -3276.6 C Humidity: 75.2%
just out of curiosity I ran the blinkatest.py which gave the following output
python3 blinkatest.py
Hello blinka!
Digital IO ok!
I2C ok!
SPI ok!
done!
Do you still have the old adafruit_DHT library installed? Possibly some confusion...
do you see at glance which are old and which are new modules? Possibly capital/lower adafruit
?
$ pip list
Package Version
-------------------------- ---------
Adafruit-Blinka 6.2.0
adafruit-circuitpython-dht 3.5.4
Adafruit-DHT 1.4.0
Adafruit-PlatformDetect 2.28.0
Adafruit-PureIO 1.1.8
adafruit-python-shell 1.2.3
args 0.1.0
asn1crypto 0.24.0
certifi 2018.8.24
chardet 3.0.4
clint 0.5.1
cryptography 2.6.1
entrypoints 0.3
idna 2.6
keyring 17.1.1
keyrings.alt 3.1.1
pip 18.1
pycrypto 2.6.1
pyftdi 0.52.9
PyGObject 3.30.4
pyserial 3.5
python-apt 1.8.4.3
pyusb 1.1.1
pyxdg 0.25
requests 2.21.0
rpi-ws281x 4.2.5
RPi.GPIO 0.7.0
SecretStorage 2.3.1
setuptools 53.0.0
six 1.12.0
ssh-import-id 5.7
sysv-ipc 1.1.0
urllib3 1.24.1
wheel 0.32.3
uninstall adafruit-DHT -- it is the deprecated library
I just uninstalled it - now waiting for negative values ;) Thanks anyways so far for your support! I really appreciate it. I will keep you posted
Just FYI, I am doing some test on my side also with interesting results. I just do not want to spam this issue. if you want to further we can discuss the in the Adafruit Discord channel. Anyway, all this and reading through the current and past issues made me order some DHT22 :) to test.
@brlnr23 I did my tests with the DHT22: This was with a RP4 running Buster with the Adafruit_Circuit_Python library. It is not perfect but this sensor will never be :)
Python 3.7.3 (/usr/bin/python3)
>>> %Run Testing_DHT22.py
Temp: 9.3 F / -12.6 C Humidity: 43.4%
Temp: 9.3 F / -12.6 C Humidity: 45.0%
Temp: 9.1 F / -12.7 C Humidity: 45.0%
Checksum did not validate. Try again.
Temp: 9.0 F / -12.8 C Humidity: 46.6%
Temp: 8.8 F / -12.9 C Humidity: 46.7%
A full buffer was not returned. Try again.
Temp: 8.8 F / -12.9 C Humidity: 47.4%
Temp: 8.8 F / -12.9 C Humidity: 47.5%
@jposada202020 thanks for testing this on behalf! Two questions I have atm:
Testing_DHT22.py
exact the same what I use (see above: dht_simpletest.py
)Two reasons I could imagine which might cause the fail is probably the missing resistor, or something got messed up with the old/new lib installation (which would require a clean Buster setup)
@brlnr23 I did my tests with the DHT22: This was with a RP4 running Buster with the Adafruit_Circuit_Python library. It is not perfect but this sensor will never be :)
Python 3.7.3 (/usr/bin/python3) >>> %Run Testing_DHT22.py Temp: 9.3 F / -12.6 C Humidity: 43.4% Temp: 9.3 F / -12.6 C Humidity: 45.0% Temp: 9.1 F / -12.7 C Humidity: 45.0% Checksum did not validate. Try again. Temp: 9.0 F / -12.8 C Humidity: 46.6% Temp: 8.8 F / -12.9 C Humidity: 46.7% A full buffer was not returned. Try again. Temp: 8.8 F / -12.9 C Humidity: 47.4% Temp: 8.8 F / -12.9 C Humidity: 47.5%
FYI - This is typical of what I have seen with DHT22 sensors on RPi 4 as well. Errors are common.
@jposada202020 thanks for testing this on behalf! Two questions I have atm:
* Have you wired your sensor with a resistor or without? * Is `Testing_DHT22.py` exact the same what I use (see above: `dht_simpletest.py`)
Two reasons I could imagine which might cause the fail is probably the missing resistor, or something got messed up with the old/new lib installation (which would require a clean Buster setup)
@brlnr23
I did indeed use a new SD card. I just did not want to make my same mistake again :). Then I installed Buster, Installed Blinka, Installed the Adafruit-Circuitpython-dht, download the code. So fresh from the box installation.
Good morning, long time listener, first time caller:
I am also experiencing this issue with a DHT22. As soon as the temperature crosses 0C it becomes -3276.7C (-5866.1 F)
Fri Nov 19 06:14:34 2021 -- Temp: 32.0 F / -0.0 C Humidity: 37.5% Fri Nov 19 06:14:45 2021 -- Temp: 32.0 F / -0.0 C Humidity: 37.5% Fri Nov 19 06:14:55 2021 -- Temp: 32.0 F / -0.0 C Humidity: 37.5% Checksum did not validate. Try again. Fri Nov 19 06:15:16 2021 -- Temp: -5866.1 F / -3276.7 C Humidity: 37.5% Fri Nov 19 06:15:26 2021 -- Temp: -5866.1 F / -3276.7 C Humidity: 37.6%
Package Version
-------------------------- ---------
Adafruit-Blinka 6.15.0
adafruit-circuitpython-dht 3.6.4
Adafruit-PlatformDetect 3.17.2
Adafruit-PureIO 1.1.9
adafruit-python-shell 1.3.3
arandr 0.1.10
args 0.1.0
astroid 2.5.1
asttokens 2.0.4
I am using import adafruit_dht
module path: /usr/local/lib/python3.9/dist-packages/adafruit_dht.py
I really can't explain why this is happening. I have tried with and without 10k pullup resistor.
Can anyone with a freezer check and see if it's just me?
Hi everyone!
I had this issue too. I just did some try&error testing and found out that with my python script I can add the wrong value at the actual -0.1˚C to the wrong number (ex: temperature_c+3276.6) and then multiply that with -1 to get the actual negative temperature.
For this you have to get your reported value at -0.1˚C and write it down. Then go into your code and add it there as the correction value.
I don't have an other DHT22 for testing but I'm not sure if every one has the same reported value at -0.1˚C. So be aware of that.
Tested it for a week and compared it the an actual thermometer and it worked for me.
There is my code:
import time
import board
import adafruit_dht
dhtDevice = adafruit_dht.DHT22(board.D6)
dhtDevice._trig_wait = 1500
temperature_c = dhtDevice.temperature
humidity = dhtDevice.humidity
try:
if temperature_c < -1:
temperature_c = round((temperature_c+3276.6)*(-1), 2)
if (humidity != None) and (temperature_c != None) and (100 > temperature_c > -100):
# do something with the correct temperature
print(temperature_c, humidity)
else:
print("None value")
except RuntimeError as error:
# Errors happen fairly often, DHT's are hard to read, just keep going
print(error.args[0])
except Exception as error:
dhtDevice.exit()
raise error
This gives the correct output: -0.1 99.9
Yes, there is fog outside :)
It seems some DHT22 sensors act different at negative temperatures; my ones returns a twos compliment value. I adapt the adafruit_dht.py to my needs (maybe a solution for further versions?!)
here's my patch for the actual 3.7.8
246,249c246,247
< new_temperature = (((buf[2] & 0x7F) << 8) | buf[3]) / 10
< # set sign
< if buf[2] & 0x80:
< new_temperature = -new_temperature
---
> new_temperature = int.from_bytes(buf[2:4], byteorder="big", signed=True) / 10
>
I solve the problem using this code in DHT.cpp file at the switch clause for DHT21 and DHT22 cases :
case DHT22: case DHT21: uint16_t val = ((uint16_t)(data[2] & 0x07) << 8) | (uint16_t)data[3];
if (data[2] & 0x08) { val |= 0xF800; val = ~val + 0x0001; f = -1.0(float)val; } else{ f = (float)val; } f = 0.1;
if (S) { f = convertCtoF(f); } break;
As you can see, the data sended by the hardware has a length of 12 bits, not 16. Therefore, the negative value must be extended up to the remaining 4 bits. This worked for me.
First off: it sounds like the bug which has been reported here: https://github.com/adafruit/Adafruit_CircuitPython_DHT/issues/9 but it happend to me with the latest version as well.
I have recently migrated from the old Adafruit lib to this one, because I hoped that the bug which occurred in the old lib as well has been fixed in the new one. Unfortunately it seems as if there is an issue with the new lib in my setup as well.
Unfortunately I am not really familiar which informtation I might need to provide for this bug report nor I have no clue what I could try next.
Therefore: any help is appreciated :)
Side note: the sensor I have in use does not require a pull up resistor - and I assume that this is correct - as said: all values except negative temperatures are pretty much accurate.