一、项目背景
想使用树莓派和dht11模块实现室内温湿度检测,获取温度Temp和湿度Humidity数据,原先尝试使用Adafruit_Python_DHT的库,但是发现因为老旧不再维护不能使用,且总是会报错如:not platform
,没有找到有效解决办法。
后来发现存在新库Adafruit_CircuitPython_DHT,但是使用pip3下载时出现与系统自带apt下载不兼容的问题。踩坑比较多,在此记录一下。
最后尝试用python虚拟环境来解决,也感受到了python虚拟环境的便捷。
二、实现步骤
- 创建工程目录,命名Temp_hum_detect_RPi;
- 在该目录下创建python虚拟环境:
python3 -m venv venv1;
- 创建完成后进入venv1虚拟环境目录;;
- 在bin目录下,执行
source activate
,激活python虚拟环境venv1; - 使用pip命令获得adafruit最新库:
pip3 install adafruit-circuitpython-dht
,这将会将该库下载到该venv1虚拟环境中,而不影响原系统; - 返回Temp_hum_detect_RPi工程目录,在该目录下新建src文件夹来编辑存放示例程序:
mkdir src;
- 编辑示例程序如下,命名为dht_simpletest.py即可;
- 修改程序模板,根据自己使用的数据端口来修改,比如我使用4端口(BCM),将第9行D18改为D4,如果使用DHT11温湿度检测模块,还需要将该行DHT22改为DHT11,然后保存退出;
- 在src目录下运行该程序:```python3 dht_simpletest.py```,正常情况下可看到温湿度检测结果;
- 最后可使用```deactivate```命令退出该虚拟环境。
#这里直接套用官方库的examples模板
import time
import board
import adafruit_dht
# 此处需要修改数据引脚端口,如果使用DHT11模块,需要将DHT22改为DHT11
dhtDevice = adafruit_dht.DHT22(board.D18)
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)
# 程序正常运行后,会以特定格式不断打印温度和湿度数据,