文章目录

  • 温湿度传感器DHT11介绍
  • 使用DHT11测试温湿度


温湿度传感器DHT11介绍

树莓派 python 湿度传感器 树莓派温度湿度传感器_树莓派 python 湿度传感器

数字温湿度传感器DHT11是一种复合传感器,包含温度和湿度的校准数字信号输出。采用专用数字模块采集技术和温湿度传感技术,确保产品具有高可靠性和优异的长期稳定性。
   该传感器包含一个电阻湿感元件和一个NTC温度测量设备,并与一个高性能8位微控制器连接。其精度:湿度±5%RH, 温度±2℃。量程:湿度20-90%RH, 温度0~50℃。采样周期:大于等于1秒/次。
注意:DHT11一次通讯时间最大3ms,主机连续采样间隔建议不小于100ms。
DHT11只有三个引脚:DATA、GND、VCC。通信过程从DATA线发送开始信号到DHT11开始,DHT11接收信号并返回应答信号。然后主机接收应答信号并开始接收40位温湿度数据(8位湿度整数+8位湿度小数+8位温度整数+8位温度小数+8位校验和)。

使用DHT11测试温湿度

(注:我这里使用的是python语言)

用DHT11测试温湿度一般有三种方法:

1、通过自己编写程序读取DHT11传感器的温湿度值。

这种方法比较麻烦,要求对DHT11的工作原理比较理解。可以参考文章树莓派基础实验27:温湿度传感器DHT11 实验

2、使用github上Adafruit_DHT库测试。

可以参考文章树莓派通过Python读取DHT11温湿度传感器数据或者直接按照github上Adafriut_DHT库的指导使用。但是现在github上的库已经弃用了,也就是说不会随python版本以及传感器的更新而更新了,具有历史参考价值。现在或许还可以使用,但是之后就不得而知了。

树莓派 python 湿度传感器 树莓派温度湿度传感器_github_02


3、使用python中的adafruit-circuitpython-dht库读取DHT11的温湿度值。

github上的库弃用后好像是迁移到了python库中,可以通过pip进行安装使用。

这里我只介绍第三种方法来通过DHT11测试温湿度。
首先安装adafruit-circuitpython-dht库和相关依赖

pip3 install adafruit-circuitpython-dht
sudo apt-get install libgpiod2

编写代码(网上的代码一般如下):

import adafruit_dht
import time

DHTpin=17
dht_device = adafruit_dht.DHT11(DHTpin)
while True:
	try:
		temperature = dht_device.temperature
		humidity = dht_device.humidity
		print("temperature:{} C|humidity:{}".format(temperature,humidity))
	except RuntimeError as error:
		print(error)
	except Exception as error:
		dht_device.exit()
		raise error
	time.sleep(2.0)

因为经常会出现因为校验和错误而报错的情况,所以要设置 except RuntimeError 的错误,继续下一次读取即可(adafruit-circuitpython-dht库好像已经实现了如果校验和错误就自动再次读取的功能)。
注意: 此代码很大可能会出现如下错误:

Unable to set line 17 to input

经在网上查找发现是libgpiod_pulsei进程的原因,通过 gprep libgpiod命令可获取对应进程pid,然后通过kill pid可以杀死进程。kill掉libgpiod进程后就可以再次运行代码,不过之后代码停止运行后再次运行还是会报同样的错误,还得再kill掉libgpiod进程。反正就是每成功运行一次就得杀死libgpiod进程一次,很烦人。在网上查找解决办法后发现每次代码结束前都要执行dht_device.exit()语句才能多次运行上面的代码,而上面的代码在你手动停止代码运行时是不会执行dht_device.exit()语句的,它只会在报错时执行。所以我对代码进行了改写:

import adafruit_dht
import time

DHTpin=17
dht_device = adafruit_dht.DHT11(DHTpin)
try:
	while True:
		try:
			temperature = dht_device.temperature
			humidity = dht_device.humidity
			print("temperature:{} C|humidity:{}".format(temperature,humidity))
		except RuntimeError as error:
			print(error)
		except Exception as error:
			dht_device.exit()
			raise error
		time.sleep(2.0)
finally:
	dht_device.exit()

经测试,上面代码依旧无法在你手动点击停止运行时执行finally中的dht_device.exit()语句,但是在你通过ctrl+c的方法终止代码时是可以执行dht_device.exit()语句的。所以,如果你想停止代码运行,可以先点击编译器输出框,再按ctrl+c停止代码执行。
经考虑,发现还可以在执行dht_device = adafruit_dht.DHT11(DHTpin)语句前通过os库的相关函数来先把libgpiod相关的进程kill掉。通过进程名来杀死进程的语句为:

pkill -f processname

可以通过os.system(cmd)来执行cmd语句,把cmd语句换成pkill -f processname即可。代码如下:

import adafruit_dht
import time
import os

DHTpin=17
cmd='pkill -f libgpiod'
os.system(cmd)
dht_device = adafruit_dht.DHT11(DHTpin)
try:
	while True:
		try:
			temperature = dht_device.temperature
			humidity = dht_device.humidity
			print("temperature:{} C|humidity:{}".format(temperature,humidity))
		except RuntimeError as error:
			print(error)
		except Exception as error:
			dht_device.exit()
			raise error
		time.sleep(2.0)
finally:
	dht_device.exit()

这样无论怎么退出或终止代码,应该都不会再出现上述错误了。