工具
樹莓派3 modelB 一個
dht11溫溼度傳感器一個
onenet平臺
安裝好requests庫的python(必定要安裝好否則代碼不能正確運行,能夠參考個人另外一篇博文
點擊打開連接)
樹莓派鏈接溫度傳感器
將樹莓派鏈接好溫度傳感器,而且獲得數據,首先要運行代碼,將傳感器測得的溫溼度數據分別用兩個文件夾保存起來,代碼一共分爲兩部分,一部分是測得傳感器數據並將數據顯示出來,第二部分是將數據以必定的格式儲存起來,爲後面上傳作準備,廢話不說直接上代碼,博主比較懶,代碼沒什麼註釋,請見諒
- import RPi.GPIO as GPIO
- import time
-
- channel =4
- data = []
- j = 0
-
- 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, "*C, humidity :", humidity, "%"
- else:
- print "wrong"
- print "temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmp
- mytemp = '%f' %temperature
- myhumi = '%f' %humidity
-
- tmp_output = open('/home/pi/pi/test/dht11/tmp_data.txt', 'w')
- hud_output = open('/home/pi/pi/test/dht11/hum_data.txt', 'w')
-
- tmp_output.write(mytemp)
- hud_output.write(myhumi)
-
- tmp_output.close
- hud_output.close
- GPIO.cleanup()
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
channel =4
data = []
j = 0
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, "*C, humidity :", humidity, "%"
else:
print "wrong"
print "temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmp
#從這裏開始是第二部分
mytemp = '%f' %temperature
myhumi = '%f' %humidity
tmp_output = open('/home/pi/pi/test/dht11/tmp_data.txt', 'w')
hud_output = open('/home/pi/pi/test/dht11/hum_data.txt', 'w')
tmp_output.write(mytemp)
hud_output.write(myhumi)
tmp_output.close
hud_output.close
GPIO.cleanup()
運行代碼後會出現兩個文件分別來保存溫度和溼度,以下圖:python
![](http://static.javashuo.com/static/loading.gif)
這樣一來溫溼度的數據就保存下來了,而後就是讀取並上傳了json
上傳數據至雲端
上傳以前,首先要將雲物聯網平臺,如今的免費的雲物聯網平臺有不少onenet、機智雲、ubidots、yeelink,我選擇的是onenet平臺。首先你要註冊好onenet平臺帳號,而後創建一個產品,如圖所示
建立好以後有兩個東西比較重要,一個是你的APIKey,還有一個是你的設備ID,設備ID能夠在你的設備管理中看見,如圖:
有了這兩個東西后你還能夠建立你的應用,這個應用能夠接收到上傳的數據並進行處理,使得數據更加直觀,在你的應用管理裏面能夠建立,建立好的應用如圖:
經過代碼上傳數據
上傳溫度數據代碼
- <span style="font-size: 18px;">import urllib2
- import json
- import time
- import datetime
-
- APIKEY = '你的APIKey'
-
-
- def http_put():
- file = open("/home/pi/pi/test/dht11/tmp_data.txt")
- temperature= float(file.read())
- CurTime = datetime.datetime.now()
- url='http://api.heclouds.com/devices/你的設備ID/datapoints'
- values={'datastreams':[{"id":"temp","datapoints":[{"at":CurTime.isoformat(),"value":temperature}]}]}
-
- print "the time is: %s" %CurTime.isoformat()
- print "The upload temperature value is: %.3f" %temperature
-
- jdata = json.dumps(values)
- print jdata
- request = urllib2.Request(url, jdata)
- request.add_header('api-key', APIKEY)
- request.get_method = lambda:'POST'
- request = urllib2.urlopen(request)
- return request.read()
-
- while True:
- time.sleep(5)
- resp = http_put()
- print "OneNET result:\n %s" %resp
- time.sleep(5)</span>
import urllib2
import json
import time
import datetime
APIKEY = '你的APIKey'
def http_put():
file = open("/home/pi/pi/test/dht11/tmp_data.txt")
temperature= float(file.read())
CurTime = datetime.datetime.now()
url='http://api.heclouds.com/devices/你的設備ID/datapoints'
values={'datastreams':[{"id":"temp","datapoints":[{"at":CurTime.isoformat(),"value":temperature}]}]}
print "the time is: %s" %CurTime.isoformat()
print "The upload temperature value is: %.3f" %temperature
jdata = json.dumps(values)
print jdata
request = urllib2.Request(url, jdata)
request.add_header('api-key', APIKEY)
request.get_method = lambda:'POST'
request = urllib2.urlopen(request)
return request.read()
while True:
time.sleep(5)
resp = http_put()
print "OneNET result:\n %s" %resp
time.sleep(5)
上傳溼度數據代碼:
- import urllib2
- import json
- import time
- import datetime
-
- APIKEY = '你的APIKey'
-
-
- def http_put():
- file = open("/home/pi/pi/test/dht11/hum_data.txt")
- humidity= float(file.read())
- CurTime = datetime.datetime.now()
- url='http://api.heclouds.com/devices/11302038/datapoints'
- values={'datastreams':[{"id":"hum","datapoints":[{"at":CurTime.isoformat(),"value":humidity}]}]}
-
- print "the time is: %s" %CurTime.isoformat()
- print "The upload humidity value is: %.3f" %humidity
-
- jdata = json.dumps(values)
- print jdata
- request = urllib2.Request(url, jdata)
- request.add_header('api-key', APIKEY)
- request.get_method = lambda:'POST'
- request = urllib2.urlopen(request)
- return request.read()
-
-
- time.sleep(5)
- resp = http_put()
- print "OneNET result:\n %s" %resp
- file.closes
import urllib2
import json
import time
import datetime
APIKEY = '你的APIKey'
def http_put():
file = open("/home/pi/pi/test/dht11/hum_data.txt")
humidity= float(file.read())
CurTime = datetime.datetime.now()
url='http://api.heclouds.com/devices/11302038/datapoints'
values={'datastreams':[{"id":"hum","datapoints":[{"at":CurTime.isoformat(),"value":humidity}]}]}
print "the time is: %s" %CurTime.isoformat()
print "The upload humidity value is: %.3f" %humidity
jdata = json.dumps(values)
print jdata
request = urllib2.Request(url, jdata)
request.add_header('api-key', APIKEY)
request.get_method = lambda:'POST'
request = urllib2.urlopen(request)
return request.read()
time.sleep(5)
resp = http_put()
print "OneNET result:\n %s" %resp
file.closes
數據流問題
上傳以後咱們必定要注意的是數據流的問題,就是咱們有兩種數據,一種是humidity,一種是temperature,你在編輯應用的時候就要注意數據流的選擇如圖
這個選擇以前要在數據流管理那裏建立溫度和溼度數據流,你的代碼的相應的數據那裏也要改爲和數據流名稱同樣的,溼度數據流t同理,必定要保證名字同樣,否則就不會自動識別了,如圖:
自動執行代碼並上傳數據
要實現代碼的自動上傳和運行,須要用到crontab命令,打開樹莓派命令行界面輸入:
sudo crontab -e
選擇nano,也就是2,而後在最後幾行添加這麼幾句話
- */1 * * * * python /home/pi/pi/test/dht11/transfer_tmp.py
- */1 * * * * python /home/pi/pi/test/dht11/transfer_hum.py
- */1 * * * * python /home/pi/pi/test/dht11/cpdht11.py
*/1 * * * * python /home/pi/pi/test/dht11/transfer_tmp.py
*/1 * * * * python /home/pi/pi/test/dht11/transfer_hum.py
*/1 * * * * python /home/pi/pi/test/dht11/cpdht11.py
如圖:
添加以後保存,而後代碼就能每隔一分鐘運行一次,實現了自動上傳功能,最後注意的的是在建立產品的過程當中,傳輸協議必定要選
HTTP協議,鏈接是
移動蜂窩網,還有就是必定要安裝好requests庫模塊,APIKey 和設備ID必定要準確。