樹莓派使用DHT11獲取房間溫濕度信息

剛接觸這類GPIO口子的插件,先拿這個比較簡單的模塊練練手。別看這模塊簡單,可以拓展的方向挺多的。比如配上斷路器,可以做成智能家居,當達到多少溫度的時候打開空調,多少濕度的時候打開加濕器等等。據說DHT11是相對來說比較廉價的溫濕度模塊。這點我在之後的應用中也感覺到了-_-///,後面我再提。

DHT11模塊一般淘寶上買的有兩種,一種就是我下圖這樣的,一個藍色小盒子帶上一個電路板,有三個針腳,配上一個電源指示燈。另外一種就光禿禿一個藍色的小盒子,沒電路板,更加廉價。這種就要配上電阻使用了。

多的就不提了,講下這三個針腳該怎麼接:

vcc的引腳接入樹莓派中的3.3V針腳(那兩個5V針腳也是可以接的)。

DATA引腳接入下面的 GPIO4 針腳。

剩下一個GND引腳就接入Ground針腳即可。

接入完成後別急著開機。同樣跟之前的VGA666模塊一樣,要對/boot/config.txt進行配置。這個文件可以在樹莓派中打開,也可以把SD卡插入WIN機器上打開。

值得一提的是,在/boot/文件夾中,還有個說明文件/boot/overlay/README。應該是介紹支持的各種模塊該如何配置的信息。反正我沒仔細看。

編輯/boot/config.txt文件,加入以下內容:

device_tree=bcm2710-rpi-3-b.dtb
dtoverlay=dht11

可以跟我一樣加在這個位置,以後加的代碼多了,可以保持整齊,不容易亂。

加完代碼後,開啟樹莓派。

創建一個dht11_info.sh文件,代碼如下:

#!/bin/bash
# Get information from DHT11 Temperature and Humidity Sensor
# /sys/bus/iio/devices/iio:device0
while true
do
TEMP=`cat /sys/bus/iio/devices/iio:device0/in_temp_input`
echo "Current TEMP is: `expr $TEMP / 1000` C"
HUMIDITY=`cat /sys/bus/iio/devices/iio:device0/in_humidityrelative_input`
echo "Current Humidityrelative is: `expr $HUMIDITY / 1000` %"
sleep 10
clear
done

保存,進行賦權:

chmod a+x dht11_info.sh

到目前位置,一切都大功告成了,執行下程序看看:

./dht11_info.sh

如果運行成功的話,會有如下代碼返回:

然而,經常實際上,會出現下面的錯誤代碼:

這是為啥呢?

傳說是因為 1-wire 協議本身的緣故,有時候 1bit 數據丟失就會導致數據無法讀出,另外還有 可能是杜邦線線纜鬆動或者質量不好導致。-_-///

好吧,這麼坑,這就是前面我提到的感覺這個模塊很廉價的原因,本人測試,運行30次,大概只能取到5-6次值。線也換了好幾根,依然沒啥改變,不知道其他價格高點的溫濕度模塊,這種情況會不會好一點。

建議把sleep 的值改的小一點,可以改成1,這樣加快刷新的速度,能看到值的頻率也高點。另外代碼可以修改下,改成把取到的值賦給一個變數A,假如拋出異常了,沒取到值,那就用上次取的值(變數A)來進行顯示。這樣從運行的美觀程度上,感覺得到了很大的改善。畢竟溫濕度這個值即使一個小時取到一次值也是可以的。

分享一段自己寫的python代碼,當感測器獲取不到知的時候,會延用上一次獲取到的值,作為區分標記會將值加0.01,最後以json的格式輸出。

import json
import time

def currentTEMP( temp ):
tmp = float( temp )
if tmp != 0:
tmp = tmp / 1000
return tmp

def currentHumidity( humidity ):
tmp = float( humidity )
if tmp != 0:
tmp = tmp / 1000
return tmp

def main():
info = {}
TEMP = 0
HUMIDITY = 0
while True:
try:
TEMP = open(/sys/bus/iio/devices/iio:device0/in_temp_input).read( )
HUMIDITY = open(/sys/bus/iio/devices/iio:device0/in_humidityrelative_input).read( )
TEMP = currentTEMP( TEMP )
HUMIDITY = currentHumidity( HUMIDITY )
except:
TEMP = TEMP + 0.01
HUMIDITY = HUMIDITY + 0.01

info["TEMP"] = "%.2f" % TEMP
info["HUMIDITY"] = "%.2f" % HUMIDITY

jsonstr = json.dumps(info)
print jsonstr
time.sleep(1)

if __name__==__main__:

main()

-- End --


推薦閱讀:

TAG:樹莓派(RaspberryPi) |