樹莓派+DHT11溫溼度感測器+yeelink物聯網雲
一、配置準備
1.DHT11簡介
DHT11是一款有已校準數字訊號輸出的溫溼度感測器。 精度溼度+-5%RH, 溫度+-2℃,量程溼度20-90%RH, 溫度0~50℃。
DHT11有四個引腳,分別是VCC,DATA,NC,GND
2.電路連線
本博文中python程式使用的是BCM編號方式,17號即pin11接DHT11的DATA,VCC接3.3V,NC懸空,GND接0V,可通過下圖找到對應引腳,進行連線。
二、用python讀取溫溼度資料
關於DHT11具體的時序,以及如何操作,在我的部落格《 51微控制器DHT11溫溼度感測器》中有詳細分析,有興趣可以去了解一下,以便你可以看懂下面的python程式。
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
#BCM編號方式的17對應樹莓派的pin11
channel = 17
data = []
j = 0
#I/O口使用BCM編號方式
GPIO.setmode(GPIO.BCM)
time.sleep(1)
#設定資料線為輸出
GPIO.setup(channel, GPIO.OUT)
GPIO.output(channel, GPIO.LOW)
time.sleep(0.02)
GPIO.output(channel, GPIO.HIGH)
#設定資料線為輸入
GPIO.setup(channel, GPIO .IN)
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
continue
while j < 40:
k = 0
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
k += 1
if k > 100:
break
if k < 8:
data.append(0)
else:
data.append(1)
j += 1
print "sensor is working."
print data
#讀取數值
humidity_bit = data[0:8]
humidity_point_bit = data[8:16]
temperature_bit = data[16:24]
temperature_point_bit = data[24:32]
check_bit = data[32:40]
humidity = 0
humidity_point = 0
temperature = 0
temperature_point = 0
check = 0
#轉換數值
for i in range(8):
humidity += humidity_bit[i] * 2 ** (7 - i)
humidity_point += humidity_point_bit[i] * 2 ** (7 - i)
temperature += temperature_bit[i] * 2 ** (7 - i)
temperature_point += temperature_point_bit[i] * 2 ** (7 - i)
check += check_bit[i] * 2 ** (7 - i)
tmp = humidity + humidity_point + temperature + temperature_point
#資料校驗
if check == tmp:
print "temperature : ", temperature, ", humidity : " , humidity
else:
print "wrong"
print "temperature : ", temperature, ", humidity : " , humidity, " check : ", check, " tmp : ", tmp
GPIO.cleanup()
在python檔案的路徑下輸入命令:
sudo python ./dht11.py
即可獲得資料,效果如圖:
可以看到,當校驗不正確時會打印出“wrong”,表示資料錯誤,在讀取一次得到正常的資料。
三、上傳資料到yeelink
1.修改python程式碼
在上面的程式碼後新增如下程式碼,即將溫度和溼度資料儲存到txt檔案裡:
#資料轉換成JSON格式
mytemp = '{"value":%f}' %temperature
myhumi = '{"value":%f}' %humidity
#開啟檔案
tmp_output = open('/home/pi/mytest/DHT11/tmp_data.txt', 'w')
hud_output = open('/home/pi/mytest/DHT11/hud_data.txt', 'w')
#寫資料到文字檔案中
tmp_output.write(mytemp)
hud_output.write(myhumi)
#關閉檔案
tmp_output.close
hud_output.close
2.新增yeelink.sh指令碼
yeelink是一個開源的硬體資料平臺,我喜歡把它定義為一個物聯網雲平臺,因為它給我們提供了API介面,我們可以把資料傳送到雲平臺儲存起來,也可以隨時檢視,真的很棒。具體的操作可以檢視博主的部落格:《 樹莓派+USB攝像頭+yeelink實現雲監控》。
sudo python /home/pi/mytest/DHT11/dht11.py
curl --request POST --data-binary @"/home/pi/mytest/DHT11/tmp_data.txt" --header "U-ApiKey:XXXXXXXXXXXXXXXX" http://api.yeelink.net/v1.0/device/裝置號/sensor/感測器號/datapoints
sleep 10s
curl --request POST --data-binary @"/home/pi/mytest/DHT11/hud_data.txt" --header "U-ApiKey:XXXXXXXXXXXXXXXX" http://api.yeelink.net/v1.0/device/裝置號/sensor/感測器號/datapoints
“/home/pi/mytest/DHT11/tmp_data.txt”是需要上傳到yeelink上的檔案的路徑,將XXXXXXXXXXXXXXXX替換為自已賬戶的API Key,後面的URL也需要替換為自己申請的感測器URL。
注意:因為DHT11可以獲得溫度和溼度兩種值,所以我在yeelink添加了兩個感測器,便於觀察,在這裡有兩次上傳資料,分別是把儲存溫度值得txt文字和儲存溼度值得txt文字通過HTTP協議上傳到雲端。
3.為指令碼增加可執行許可權
sudo chmod +x yeelink.sh
4.將指令碼加入cronjob定時任務
sudo crontab -e
5.讓指令碼自動執行
加入下面一行, 讓指令碼每1分鐘執行一次,即每1分鐘上傳一次資料,然後儲存退出
*/1 * * * * /home/pi/mytest/yeelink.sh
注:我給自己的實驗新建了幾個資料夾,路徑如下:/home/pi/mytest/DHT11/,很多操作都是在這個路徑下完成的。
實驗效果:
溫度:
溼度: