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-树莓派pin2ground-树莓派pin6signal-树莓派pin7(gpio4)

只要连接的是树莓派上标有“5v”标识的引脚(pin2pin4),ground连接树莓派上标有“GND”标识的引脚

pin6,pin9,pin14,pin25,pin30,pin39),signal连接任意标有“GPIO”的引脚,但最后连接pin7,这样后⾯的代码直接复制粘贴的即可,建议

第⼀次连接的同学直接按照我的⽅式连接即可,避免后期不必要的错误。

三、Python代码实现

Python代码实现数据读取有很多现成的库可供使⽤,DHT系列传感器的库可以使⽤Adafruit DHT。在写代码之前,先把pythonAdafruit

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

3sudo apt-get install build-essential python-dev

4)下载python3sudo 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秒钟左右后报这个错误。在调试

过程中它是最常出现的,造成这个报错的原因⽐较多)

出现这个报错的根本原因是树莓派没有成功的拿到humiditytemperture参数,导致这两个值为none,从⽽使得.format⽅法出错。拿不到

dht11数值的可能性有:

1. 杜邦线与树莓派的连线问题。连线没有插紧、线序有问题、线有损坏、代码与使⽤的信号引脚不对应、没有插到树莓派5v电源引脚上(树

莓派与传感器的连接⽅式最好使⽤树莓派5v,电源,但确实存在使⽤3.3v电源最后得到数值的情况)

2. 传感器有问题(⼀直盯着查看代码排错,结果发现换了个传感器就好了,哭晕)

3. 电源供电不⾜(我这⾥是指树莓派引脚,在使⽤5V引脚和接地引脚给传感器供电时)我上次是就是控制继电器的同时想要拿到传感器读

数,导致DHT传感器供电不⾜报错。解决⽅法是接⼀个外接电源来保证电源电压的稳定。

(⼆)报错:SyntaxError: invalid syntax

这句话的意思是Python代码语法有问题。Python对语法的要求⾮常严格,有时候代码是⽹上直接找来复制粘贴的,就有可能导致明明看上去

没错,但就⼀直报语法错误,代码短的话可以重新打⼀遍,或者格式化后再粘贴。

另外需要注意的是Python2Python3的语法有区别,⽐如Python2print后⾯不⽤加括号,⽽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是树莓派4BCPU,它是四核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账户登录

最后祝⼤家都玩派顺利~~