2023年11月29日发(作者:)
在树莓派34上读取DHT11温湿度传感器-Python代码实现及常见
问题梳理
最近由于⾃⼰的课题需要,想要⽤在树莓派上使⽤DHT11温湿度传感器来读取空⽓中温湿度,遇到了⼏个问题,解决之后也对之前的知识进
⾏了回顾,总结,特整理如下,希望能给也在学习树莓派的⼩伙伴们带来⼀些帮助。总的来说操作很简单,但很容易出现细节⽅⾯的问题,
我也把我遇到的问题进⾏了简单整理,如果有其他问题可以直接在评论区提出,我看到了就会回答。
本篇⽂章主要对DHT11进⾏了简单梳理,主要分为四⼤模块,分别为:
⼀、DHT11温湿度传感器
⼆、实验所需设备与连线⽅式
三、Python代码实现
四、常见问题
(⼀)TypeError: unsupported format string passed to NoneType.__format__
(⼆)SyntaxError: invalid syntax
(三)ModuleNotFoundError: No module named 'Adafruit_DHT'
(四)ImportError: cannot import name 'Beaglebone_Black_Driver' from 'Adafruit_DHT'
(五)RuntimeError: Error accessing GPIO.
对哪个模块感兴趣也直接翻到相应部分阅读即可。
⼀、DHT11温湿度传感器
DHT11温湿度传感器是⼀个性能很棒的模块,它提供温度和湿度读数。价格低廉,精准度⾼使⽤简单,并且有python库可以直接导⼊使⽤,
应⽤也很⼴泛,在远程⽓象站、⼟壤监测器和家庭⾃动化系统都可以看见它的⾝影。
在⽇常⼯作学习中,我们接触到的DHT11主要有两种形式。⼀种是三引脚的焊有PCB的模块,另⼀款是是四引脚的独⽴模块。如下图所
⽰:
第⼀种传感器从左到右分别是信号引脚,VCC引脚(连接电源正极),ground接地引脚(连接电源负极)。需要注意的是,关于三引脚传
感器,不同⼚商的传感器引脚的顺序可能不同,⼤家在连接之前需要看准传感器上标的符号来进⾏判断,⽐如我的传感器就是这样的,从左
到右的第⼀个引脚(+)是连接电源正极的。
⼆、实验所需设备与连线⽅式
(⼀)实验所需设备
1. DHT11 温室度传感器
2. 树莓派 3 B+/树莓派 4 B
3. 三根杜邦线(母对母)
(⼆)软件环境:Thonny
(三)DHT11与树莓派连线⽅式
根据DHT11传感器两种形式不同,连线不太相同,却也⼤同⼩异,你有哪⼀种传感器都可以。此处的连线与后⾯的代码相关,直接按照图⽰
⽅式连接即可。
1.三针引脚DHT11温湿度传感器与树莓派的连接⽅式(我也把树莓派的引脚功能图放到下⽅了,不熟悉树莓派引脚功能的同学可以直接在本
2.四针引脚DHT11温湿度传感器与树莓派的连接⽅式
树莓派引脚对照图:树莓派3B(3B+)(下图左),树莓派3B(3B+)(下图右)
注意:
1.⼀定要看好传感器引脚的顺序再进⾏连接。(vcc-树莓派pin2,ground-树莓派pin6,signal-树莓派pin7(gpio4))
只要连接的是树莓派上标有“5v”标识的引脚(pin2或pin4),ground连接树莓派上标有“GND”标识的引脚
(pin6,pin9,pin14,pin25,pin30,pin39),signal连接任意标有“GPIO”的引脚,但最后连接pin7,这样后⾯的代码直接复制粘贴的即可,建议
第⼀次连接的同学直接按照我的⽅式连接即可,避免后期不必要的错误。
三、Python代码实现
Python代码实现数据读取有很多现成的库可供使⽤,DHT系列传感器的库可以使⽤Adafruit DHT。在写代码之前,先把python和Adafruit
DHT库下载下来。
sudo apt-get install git-core
git clone https:///adafruit/Adafruit_Python_
cd Adafruit_Python_DHT
sudo apt-get install build-essential python-dev
sudo python3 install
apt-get install git-core
(注意:如果下载失败,则先运⾏sudo apt-get update并且再试⼀遍,其实不管下载什么,都可以先update到最新)
2.安装Adafruit DHT11库
(2)使⽤cd命令进到 Adafruit_Python_DHT⽂件夹: cd Adafruit_Python_DHT
(3)sudo apt-get install build-essential python-dev
(4)下载python3:sudo python3 install
新建py⽂件
#!/usr/bin/python
import sys
import Adafruit_DHT
while True:
# “11”代表你使⽤的是DHT11传感器,如果你使⽤的是DHT22传感器,则把数字改成“22”即可。
#数字“4”代表你的信号引脚连接的是gpio4,⽽不是“pin4”
humidity, temperature = Adafruit__retry(11, 26)
#直接输出空⽓湿度和空⽓温度的值,如果没有拿到那么值是None
#print(humidity)
#print(temperature)
#空⽓温度以⼩数点后⼀位展⽰,加上℃单位,空⽓湿度加上%。注意,如果湿度或温度的值为None,这个语句就会报错。
print ('Temp: {0:0.1f} C Humidity: {1:0.1f} %'.format(temperature, humidity))
然后点运⾏就可以了
这是运⾏结果
代码解释:
(1)输出的温度以摄⽒度为单位,相对湿度是以百分⽐的形式呈现。
(2)在shell框中会连续不断的输出温度和相对湿度,暂停点击右上⾓的stop即可。
其实每个库的包都包含⽰例和相关⽂件,打开你下载的Adafruit_Python_DHT库,可以看到⾥⾯example⽂件夹,在⾥⾯可以查看⼀些⽰例
⽂件
你的库怎么⽤和相关代码细节都在⾥⾯,就不给⼤家赘述了,想深⼊了解的同学打开⽂件查看即可。
四、 常见问题:
其实整个过程下来,连线⽅式或者代码的编写都是没有多⼤难度的,但是细节的问题⼀旦忽视,就会报错。结合其他⽹友的经验和我⾃⼰的
问题总结如下。
(⼀)报错:
TypeError: unsupported format string passed to NoneType.__format__(出现情况⼀般是先没有读数,过10秒钟左右后报这个错误。在调试
过程中它是最常出现的,造成这个报错的原因⽐较多)
出现这个报错的根本原因是树莓派没有成功的拿到humidity和temperture参数,导致这两个值为none,从⽽使得.format⽅法出错。拿不到
dht11数值的可能性有:
1. 杜邦线与树莓派的连线问题。连线没有插紧、线序有问题、线有损坏、代码与使⽤的信号引脚不对应、没有插到树莓派5v电源引脚上(树
莓派与传感器的连接⽅式最好使⽤树莓派5v,电源,但确实存在使⽤3.3v电源最后得到数值的情况)
2. 传感器有问题(⼀直盯着查看代码排错,结果发现换了个传感器就好了,哭晕)
3. 电源供电不⾜(我这⾥是指树莓派引脚,在使⽤5V引脚和接地引脚给传感器供电时)我上次是就是控制继电器的同时想要拿到传感器读
数,导致DHT传感器供电不⾜报错。解决⽅法是接⼀个外接电源来保证电源电压的稳定。
(⼆)报错:SyntaxError: invalid syntax
这句话的意思是Python代码语法有问题。Python对语法的要求⾮常严格,有时候代码是⽹上直接找来复制粘贴的,就有可能导致明明看上去
没错,但就⼀直报语法错误,代码短的话可以重新打⼀遍,或者格式化后再粘贴。
另外需要注意的是Python2和Python3的语法有区别,⽐如Python2的print后⾯不⽤加括号,⽽Python3中就会报错。
(三)报错:ModuleNotFoundError: No module named 'Adafruit_DHT'
“import Adafruit_DHT ”语句错误,提⽰找不到Adafruit_DHT模块,但是在terminal⾥输⼊“import Adafruit_DHT”不报错,并且已经下载了相
关库。可能是python版本的问题,先明确你运⾏程序时使⽤的是哪个Python版本。
使⽤的是Python2使⽤的语句是:sudo pip install Adafruit_Python_DHT; sudo python install,
但使⽤的是Python3使⽤的语句是:sudo pip3 install Adafruit_Python_DHT; sudo python3 install
--------------假装我是分割线--------------
隔了⼀段时间,我⽤树莓派4B(我之前⽤的树莓派3B+)进⾏相同操作的时候出了新的问题,所以再更新⼀下
(四)报错:ImportError: cannot import name 'Beaglebone_Black_Driver' from 'Adafruit_DHT' (/usr/local/lib/python3.7/dist-
packages/Adafruit_DHT/__init__.py)
完整错误信息:
Traceback (most recent call last):
File "/home/pi/Desktop/ec and ph/", line 7, in
humidity,temperature = Adafruit__retry(11, 4)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/", line 94, in read_retry
humidity, temperature = read(sensor, pin, platform)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/", line 80, in read
platform = get_platform()
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/", line 60, in get_platform
from . import Beaglebone_Black
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/Beaglebone_", line 24, in
from . import Beaglebone_Black_Driver as driver
ImportError: cannot import name 'Beaglebone_Black_Driver' from 'Adafruit_DHT' (/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/__init__.py)
分析:通过报错信息,我们可以发现是库中的⾥引⽤get_latform有问题
再去platform_⾥查看发现树莓派的版本定义⾥没有4B,导致返回了None
解决:出现这个原因是AdaFruit不再更新这个旧的Adafruit_DHT库,所以⾥⾯没有更新树莓派4B对应的cpu。有两种解决⽅法,使⽤这个传
感器的新库“”,或者在你原来的Adadruit_DHT库中⾃⼰⼿动更新,具体操作如下:
(1)找到Adafruit_DHT⽂件夹,有时候可能时间久远忘记保存到哪个⽂件夹⾥了,可以通过报错信息查看是“/usr/local/lib/python3.7/dist-
packages/Adafruit_DHT/”,
(2)打开⽂件夹⾥的platform_⽂件,可以看到把下⾯这两⾏代码添加到最后。
elif (1) == 'BCM2711':
return 3
其中BCM2711是树莓派4B的CPU,它是四核Cortex-A72 64位。其它的BCMxxxx是其它树莓派版本的CPU。
修改完⽂件保存的时候可能遇见permission denied的情况:
需要你打开Terminal运⾏这条命令,最后的库的位置需要你根据⾃⼰库存放的位置修改。更详细的可以看这⾥
sudo chmod -R 777 /usr/local/lib/python3.7/dist-packages/Adafruit_DHT
成功保存之后再运⾏原代码就可以顺利拿到读数啦!
(五)报错:RuntimeError: Error accessing GPIO.
Traceback (most recent call last):
File "/home/pi/", line 8, in
humidity, temperature = Adafruit__retry(11, 4)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_/Adafruit_DHT/", line 94, in read_retry
humidity, temperature = read(sensor, pin, platform)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_/Adafruit_DHT/", line 81, in read
return (sensor, pin)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_/Adafruit_DHT/Beaglebone_", line 213, in
read
raise RuntimeError('Error accessing GPIO. Make sure program is run as root with sudo!')
RuntimeError: Error accessing GPIO. Make sure program is run as root with sudo!
raise RuntimeError('Error accessing GPIO. Make sure program is run as root with sudo!')
RuntimeError: Error accessing GPIO. Make sure program is run as root with sudo!、
分析:报错的原因是你当前登录的账户不是root账户,所以Adafruit_DHT库⾥需要拿GPIO数据的时候被阻⽌了。你可以在terminal中测试⼀
下,先使⽤cd进⼊你代码所在⽂件夹,再执⾏“sudo python3 你的⽂件名.py”(如“sudo python3 ”)。如果你使⽤的是python2, 那
么就⽤“sudo python 你的⽂件名.py”。如果不报错,就说明是这个问题。
解决:两种解决⽅法。
1. 把当前⽤户授权所有root的权限,再执⾏代码
2. 直接使⽤root账户登录
最后祝⼤家都玩派顺利~~


发布评论