使用樹莓派3b+和DHT11監控溫溼度。

wangccsy發表於2018-09-20

DHT11整合了溫度和溼度感測器,通過度娘能找到一大堆關於樹莓派+DHT11進行溫溼度監控的文章,其中程式碼不乏C系列的,Python系統的,我基本上也編輯實踐了。C系列的程式基本上沒有讀取成功的,Python系列的也基本上沒有成功的,在不斷實踐中終於發現一個好用的Python程式碼,記錄下來以備後用。

#! /usr/bin/env python3
# encoding=utf-8
# power by : FUNCO_小風

import RPi.GPIO as GPIO
import time

# 延時函式
def delay(i):
    while i:
        i -= 1

# 初始化dht11連線引腳
# dht11_pin - dht11連線的引腳號
def init_dht11(dht11_pin):
    # 輸出模式 初始狀態給高電平
    GPIO.setup(dht11_pin, GPIO.OUT)
    GPIO.output(dht11_pin, 1)

# 用於獲取
# dht11_pin - dht11連線的引腳號
# 返回二元組 [ 溼度 , 溫度 ]
def get_dht11(dht11_pin):
    buff=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

    GPIO.output(dht11_pin,0)
    time.sleep(0.02)                    # 拉低20ms

    GPIO.output(dht11_pin,1)

    GPIO.setup(dht11_pin,GPIO.IN)        # 這裡需要拉高20-40us,但更改模式需要50us,因此不呼叫延時


    while not GPIO.input(dht11_pin):    # 檢測返回訊號 檢測到啟示訊號的高電平結束
        pass


    while GPIO.input(dht11_pin):        # 檢測到啟示訊號的高電平則迴圈
        pass

    i=40

    while i:
        start=time.time()*1000000        # 為了嚴格時序 迴圈開始便計時
        i-=1
        while not GPIO.input(dht11_pin):
            pass
        while GPIO.input(dht11_pin):
            pass
        buff[i]=time.time()*1000000-start# 為了嚴格時序 每次測得資料後都不馬上處理 先儲存
 
    GPIO.setup(dht11_pin,GPIO.OUT)        # 讀取結束 復位引腳
    GPIO.output(dht11_pin,1)

    # print "buff - ",buff

    # 開始處理資料
    for i in range(len(buff)):            # 將時間轉換為 0 1
        if buff[i]>100:                    # 上方測試時是測試整個位的時間
                                        # 因此是與100比較 大於100為1(位週期中 低電平50us)
            buff[i]=1
        else:
            buff[i]=0
    # print "After - ",buff

    i=40
    hum_int=0
    while i>32:                # 溼度整數部分
        i-=1
        hum_int<<=1
        hum_int+=buff[i]
    # print "hum - ",hum_int

    tmp_int=0
    i=24
    while i>16:                # 溫度整數部分
        i-=1
        tmp_int<<=1
        tmp_int+=buff[i]
    # print "tmp - ",tmp_int
    return [hum_int,tmp_int]

GPIO.setmode(GPIO.BOARD)
init_dht11(7)
print get_dht11(7)
GPIO.cleanup()

# 注意
# 若非連續測量 可以不延時 但連續測量時建議每次測量間間隔0.2s以上再呼叫get_dht11(dht11_pin)獲取資料(樹莓派不穩定)
# DHT11雖然有40位 實際溫度和溼度的小數部分讀數總為0
# 如果程式無法正常讀取,可以考慮是否起始部分的延時不準確,可以參考註釋以及實際環境的測量結果調整延時
# 程式測試環境為 $樹莓派3代B+$ $python2.7.9 $Raspbian GNU/Linux 8$


相關文章