樹莓派4使用Python通過GPIO從DHT11溫濕度傳感器讀取資料
介紹
DHT11是一款有已校準數字信号輸出的溫濕度傳感器。 其精度濕度±5%RH, 溫度±2℃,量程濕度20-90%RH, 溫度0~ 50℃。精度不高,但價格低廉。 DHT11使用單總線通信。供電電壓3.3~5V。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmLuETMUhERvwlNw8CX1AzLcBjMwIzLcNXZnFWbp9CXoNWZ05ycuVnclpnLjR3Lc9CX6MHc0RHaiojIsJye.jpg)
Arduino讀取DHT11,DHT22,SHTC3溫濕度資料:
https://blog.zeruns.tech/archives/527.htmlPython實作微秒級延時的方法:
https://blog.zeruns.tech/archives/623.htmlDHT11資料手冊下載下傳位址:
https://url.zeruns.tech/DHT11提取碼: qefk
源碼
線路連接配接:
我使用的是樹莓派4,其他版本請自行查詢更改。
樹莓派4GPIO接口介紹:
https://url.zeruns.tech/RPI4_GPIODHT11 樹莓派
VCC---------5V(第2引腳)
DATA-------BCM18(CM編号的18号引腳,也就是第12号引腳)
GND--------Ground(第6引腳)
源碼:
import RPi.GPIO as GPIO
import time
def delayMicrosecond(t): # 微秒級延時函數
start,end=0,0 # 聲明變量
start=time.time() # 記錄開始時間
t=(t-3)/1000000 # 将輸入t的機關轉換為秒,-3是時間補償
while end-start<t: # 循環至時間內插補點大于或等于設定值時
end=time.time() # 記錄結束時間
tmp=[] # 用來存放讀取到的資料
data = 18 # DHT11的data引腳連接配接到的樹莓派的GPIO引腳,使用BCM編号
# https://blog.zeruns.tech
a,b=0,0
def DHT11():
GPIO.setup(data, GPIO.OUT) # 設定GPIO口為輸出模式
GPIO.output(data,GPIO.HIGH) # 設定GPIO輸出高電平
delayMicrosecond(10*1000) # 延時10毫秒
GPIO.output(data,GPIO.LOW) # 設定GPIO輸出低電平
delayMicrosecond(25*1000) # 延時25毫秒
GPIO.output(data,GPIO.HIGH) # 設定GPIO輸出高電平
GPIO.setup(data, GPIO.IN) # 設定GPIO口為輸入模式
# https://blog.zeruns.tech
a=time.time() # 記錄循環開始時間
while GPIO.input(data): # 一直循環至輸入為低電平
b=time.time() # 記錄結束時間
if (b-a)>0.1: # 判斷循環時間是否超過0.1秒,避免程式進入死循環卡死
break # 跳出循環
a=time.time()
while GPIO.input(data)==0: # 一直循環至輸入為高電平
b=time.time()
if (b-a)>0.1:
break
a=time.time()
while GPIO.input(data): # 一直循環至輸入為低電平
b=time.time()
if (b-a)>=0.1:
break
for i in range(40): # 循環40次,接收溫濕度資料
a=time.time()
while GPIO.input(data)==0: #一直循環至輸入為高電平
b=time.time()
if (b-a)>0.1:
break
# https://blog.zeruns.tech
delayMicrosecond(28) # 延時28微秒
if GPIO.input(data): # 超過28微秒後判斷是否還處于高電平
tmp.append(1) # 記錄接收到的bit為1
a=time.time()
while GPIO.input(data): # 一直循環至輸入為低電平
b=time.time()
if (b-a)>0.1:
break
else:
tmp.append(0) # 記錄接收到的bit為0
while True:
GPIO.setmode(GPIO.BCM) # 設定為BCM編号模式
GPIO.setwarnings(False)
del tmp[0:] # 删除清單
time.sleep(1) # 延時1秒
# https://blog.zeruns.tech
DHT11()
humidity_bit=tmp[0:8] # 分隔清單,第0到7位是濕度整數資料
humidity_point_bit=tmp[8:16]# 濕度小數
temperature_bit=tmp[16:24] # 溫度整數
temperature_point_bit=tmp[24:32] # 溫度小數
check_bit=tmp[32:40] # 校驗資料
humidity_int=0
humidity_point=0
temperature_int=0
temperature_point=0
check=0
# https://blog.zeruns.tech
for i in range(8): # 二進制轉換為十進制
humidity_int+=humidity_bit[i]*2**(7-i)
humidity_point+=humidity_point_bit[i]*2**(7-i)
temperature_int+=temperature_bit[i]*2**(7-i)
temperature_point+=temperature_point_bit[i]*2**(7-i)
check+=check_bit[i]*2**(7-i)
humidity=humidity_int+humidity_point/10
temperature=temperature_int+temperature_point/10
check_tmp=humidity_int+humidity_point+temperature_int+temperature_point
if check==check_tmp and temperature!=0 and temperature!=0: # 判斷資料是否正常
print("Temperature is ", temperature,"C\nHumidity is ",humidity,"%")# 列印溫濕度資料
print("https://blog.zeruns.tech")
else:
print("error")
time.sleep(1)
GPIO.cleanup()
效果圖
推薦閱讀
- 高成本效益和便宜的VPS/雲伺服器推薦: https://blog.zeruns.tech/archives/383.html
- Python類文章: https://blog.zeruns.tech/category/Python/
- 學生專屬優惠權益大全,教育優惠: https://blog.zeruns.tech/archives/557.html
- 怎樣搭建個人部落格: https://blog.zeruns.tech/archives/218.html
- ESP8266開發環境搭建及項目示範: https://blog.zeruns.tech/archives/526.html