在樹莓派3/4上讀取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))

2.vcc只要連接的是樹莓派上標有“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://github.com/adafruit/Adafruit_Python_DHT.git

cd Adafruit_Python_DHT

sudo apt-get install build-essential python-dev

sudo python3 setup.py install

1.sudo apt-get install git-core

(注意:如果下載失敗,則先運行sudo apt-get update並且再試一遍,其實不管下載什么,都可以先update到最新) 

2.安裝Adafruit DHT11庫

(1)下載庫: git clone https://github.com/adafruit/Adafruit_Python_DHT.git

(2)使用cd命令進到 Adafruit_Python_DHT文件夾: cd Adafruit_Python_DHT

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

(4)下載python3:sudo python3 setup.py install

新建py文件

#!/usr/bin/python
import sys
import Adafruit_DHT

while True:
    # “11”代表你使用的是DHT11傳感器,如果你使用的是DHT22傳感器,則把數字改成“22”即可。
    #數字“4”代表你的信號引腳連接的是gpio4,而不是“pin4”
       humidity, temperature = Adafruit_DHT.read_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 setup.py install,

但使用的是Python3使用的語句是:sudo pip3 install Adafruit_Python_DHT; sudo python3 setup.py 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/temp.py", line 7, in <module>

    humidity,temperature = Adafruit_DHT.read_retry(11, 4)

  File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/common.py", line 94, in read_retry

    humidity, temperature = read(sensor, pin, platform)

  File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/common.py", line 80, in read

    platform = get_platform()

  File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/common.py", line 60, in get_platform

    from . import Beaglebone_Black

  File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/Beaglebone_Black.py", line 24, in <module>

    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)

分析:通過報錯信息,我們可以發現是庫中的common.py里引用get_latform有問題

 

再去platform_detect.py里查看發現樹莓派的版本定義里沒有4B,導致返回了None

 

解決:出現這個原因是AdaFruit不再更新這個舊的Adafruit_DHT庫,所以里面沒有更新樹莓派4B對應的cpu。有兩種解決方法,使用這個傳感器的新庫“Adafruit_CircuitPython_DHT”,或者在你原來的Adadruit_DHT庫中自己手動更新,具體操作如下:

(1)找到Adafruit_DHT文件夾,有時候可能時間久遠忘記保存到哪個文件夾里了,可以通過報錯信息查看是“/usr/local/lib/python3.7/dist-packages/Adafruit_DHT/”,

(2)打開文件夾里的platform_detect.py文件,可以看到把下面這兩行代碼添加到最后。 

elif match.group(1) == 'BCM2711':
    return 3

 

其中BCM2711是樹莓派4B的CPU,它是四核Cortex-A72 64位。其它的BCMxxxx是其它樹莓派版本的CPU。

 

 

修改完文件保存的時候可能遇見permission denied的情況:

需要你打開Terminal運行這條命令,最后的庫的位置需要你根據自己庫存放的位置修改。更詳細的可以看這里樹莓派里常用的Linux命令——在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/shan.py", line 8, in <module>
humidity, temperature = Adafruit_DHT.read_retry(11, 4)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT-1.4.0-py3.7-linux-armv7l.egg/Adafruit_DHT/common.py", line 94, in read_retry
humidity, temperature = read(sensor, pin, platform)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT-1.4.0-py3.7-linux-armv7l.egg/Adafruit_DHT/common.py", line 81, in read
return platform.read(sensor, pin)
File "/usr/local/lib/python3.7/dist-packages/Adafruit_DHT-1.4.0-py3.7-linux-armv7l.egg/Adafruit_DHT/Beaglebone_Black.py", 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 temp.py”)。如果你使用的是python2, 那么就用“sudo python 你的文件名.py”。如果不報錯,就說明是這個問題。

解決:兩種解決方法。

1. 把當前用戶授權所有root的權限,再執行代碼

2. 直接使用root賬戶登錄

 

最后祝大家都玩派順利~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM