天天看點

樹莓派讀取DHT11溫濕度資料 Python

樹莓派4使用Python通過GPIO從DHT11溫濕度傳感器讀取資料

介紹

DHT11是一款有已校準數字信号輸出的溫濕度傳感器。 其精度濕度±5%RH, 溫度±2℃,量程濕度20-90%RH, 溫度0~ 50℃。精度不高,但價格低廉。 DHT11使用單總線通信。供電電壓3.3~5V。

樹莓派讀取DHT11溫濕度資料 Python

Arduino讀取DHT11,DHT22,SHTC3溫濕度資料:

https://blog.zeruns.tech/archives/527.html

Python實作微秒級延時的方法:

https://blog.zeruns.tech/archives/623.html

DHT11資料手冊下載下傳位址:

https://url.zeruns.tech/DHT11

提取碼: qefk

源碼

線路連接配接:

我使用的是樹莓派4,其他版本請自行查詢更改。

樹莓派4GPIO接口介紹:

https://url.zeruns.tech/RPI4_GPIO
DHT11        樹莓派
 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()           

效果圖

樹莓派讀取DHT11溫濕度資料 Python
樹莓派讀取DHT11溫濕度資料 Python

推薦閱讀