Raspberry pi connect temperature and humidity to onenet (移動雲平臺)

工具

樹莓派3 modelB 一個
dht11溫溼度傳感器一個 
onenet平臺
安裝好requests庫的python(必定要安裝好否則代碼不能正確運行,能夠參考個人另外一篇博文 點擊打開連接

樹莓派鏈接溫度傳感器

將樹莓派鏈接好溫度傳感器,而且獲得數據,首先要運行代碼,將傳感器測得的溫溼度數據分別用兩個文件夾保存起來,代碼一共分爲兩部分,一部分是測得傳感器數據並將數據顯示出來,第二部分是將數據以必定的格式儲存起來,爲後面上傳作準備,廢話不說直接上代碼,博主比較懶,代碼沒什麼註釋,請見諒
  1. #!/usr/bin/python  
  2. import RPi.GPIO as GPIO  
  3. import time  
  4.   
  5. channel =4   
  6. data = []  
  7. j = 0  
  8.   
  9. GPIO.setmode(GPIO.BCM)  
  10.   
  11. time.sleep(1)  
  12.   
  13. GPIO.setup(channel, GPIO.OUT)  
  14. GPIO.output(channel, GPIO.LOW)  
  15. time.sleep(0.02)  
  16. GPIO.output(channel, GPIO.HIGH)  
  17. GPIO.setup(channel, GPIO.IN)  
  18.   
  19. while GPIO.input(channel) == GPIO.LOW:  
  20.   continue  
  21. while GPIO.input(channel) == GPIO.HIGH:  
  22.   continue  
  23.   
  24. while j < 40:  
  25.   k = 0  
  26.   while GPIO.input(channel) == GPIO.LOW:  
  27.     continue  
  28.   while GPIO.input(channel) == GPIO.HIGH:  
  29.     k += 1  
  30.     if k > 100:  
  31.       break  
  32.   if k < 8:  
  33.     data.append(0)  
  34.   else:  
  35.     data.append(1)  
  36.   
  37.   j += 1  
  38.   
  39. print "sensor is working."  
  40. print data  
  41.   
  42. humidity_bit = data[0:8]  
  43. humidity_point_bit = data[8:16]  
  44. temperature_bit = data[16:24]  
  45. temperature_point_bit = data[24:32]  
  46. check_bit = data[32:40]  
  47.   
  48. humidity = 0  
  49. humidity_point = 0  
  50. temperature = 0  
  51. temperature_point = 0  
  52. check = 0  
  53.   
  54. for i in range(8):  
  55.   humidity += humidity_bit[i] * 2 ** (7-i)  
  56.   humidity_point += humidity_point_bit[i] * 2 ** (7-i)  
  57.   temperature += temperature_bit[i] * 2 ** (7-i)  
  58.   temperature_point += temperature_point_bit[i] * 2 ** (7-i)  
  59.   check += check_bit[i] * 2 ** (7-i)  
  60.   
  61. tmp = humidity + humidity_point + temperature + temperature_point  
  62.   
  63. if check == tmp:  
  64.   print "temperature :", temperature, "*C, humidity :", humidity, "%"  
  65. else:  
  66.   print "wrong"  
  67.   print "temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmp  
  68. #從這裏開始是第二部分  
  69. mytemp = '%f' %temperature  
  70. myhumi = '%f' %humidity  
  71.   
  72. tmp_output = open('/home/pi/pi/test/dht11/tmp_data.txt', 'w')  
  73. hud_output = open('/home/pi/pi/test/dht11/hum_data.txt', 'w')  
  74.   
  75. tmp_output.write(mytemp)  
  76. hud_output.write(myhumi)  
  77.   
  78. tmp_output.close  
  79. hud_output.close  
  80. 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

這樣一來溫溼度的數據就保存下來了,而後就是讀取並上傳了json

上傳數據至雲端

上傳以前,首先要將雲物聯網平臺,如今的免費的雲物聯網平臺有不少onenet、機智雲、ubidots、yeelink,我選擇的是onenet平臺。首先你要註冊好onenet平臺帳號,而後創建一個產品,如圖所示
 
建立好以後有兩個東西比較重要,一個是你的APIKey,還有一個是你的設備ID,設備ID能夠在你的設備管理中看見,如圖:
有了這兩個東西后你還能夠建立你的應用,這個應用能夠接收到上傳的數據並進行處理,使得數據更加直觀,在你的應用管理裏面能夠建立,建立好的應用如圖:

經過代碼上傳數據

上傳溫度數據代碼
  1. <span style="font-size: 18px;">import urllib2  
  2. import json  
  3. import time  
  4. import datetime  
  5.   
  6. APIKEY = '你的APIKey'    
  7.           
  8.           
  9. def http_put():  
  10.         file = open("/home/pi/pi/test/dht11/tmp_data.txt")  
  11.         temperature= float(file.read())  
  12.         CurTime = datetime.datetime.now()  
  13.         url='http://api.heclouds.com/devices/你的設備ID/datapoints'  
  14.         values={'datastreams':[{"id":"temp","datapoints":[{"at":CurTime.isoformat(),"value":temperature}]}]}  
  15.   
  16.         print "the time is: %s" %CurTime.isoformat()  
  17.         print "The upload temperature value is: %.3f" %temperature  
  18.   
  19.         jdata = json.dumps(values)  
  20.         print jdata  
  21.         request = urllib2.Request(url, jdata)  
  22.         request.add_header('api-key', APIKEY)  
  23.         request.get_method = lambda:'POST'  
  24.         request = urllib2.urlopen(request)  
  25.         return request.read()  
  26.   
  27. while True:  
  28.         time.sleep(5)  
  29.         resp = http_put()  
  30.         print "OneNET result:\n %s" %resp  
  31.         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)
上傳溼度數據代碼:
  1. import urllib2  
  2. import json  
  3. import time  
  4. import datetime  
  5.   
  6. APIKEY = '你的APIKey'    
  7.           
  8.           
  9. def http_put():  
  10.         file = open("/home/pi/pi/test/dht11/hum_data.txt")  
  11.         humidity= float(file.read())  
  12.         CurTime = datetime.datetime.now()  
  13.         url='http://api.heclouds.com/devices/11302038/datapoints'  
  14.         values={'datastreams':[{"id":"hum","datapoints":[{"at":CurTime.isoformat(),"value":humidity}]}]}  
  15.   
  16.         print "the time is: %s" %CurTime.isoformat()  
  17.         print "The upload humidity value is: %.3f" %humidity  
  18.   
  19.         jdata = json.dumps(values)  
  20.         print jdata  
  21.         request = urllib2.Request(url, jdata)  
  22.         request.add_header('api-key', APIKEY)  
  23.         request.get_method = lambda:'POST'  
  24.         request = urllib2.urlopen(request)  
  25.         return request.read()  
  26.   
  27.   
  28. time.sleep(5)  
  29. resp = http_put()  
  30. print "OneNET result:\n %s" %resp  
  31. 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命令,打開樹莓派命令行界面輸入:
  1. sudo crontab -e  
 sudo crontab -e
選擇nano,也就是2,而後在最後幾行添加這麼幾句話
  1. */1 * * * * python /home/pi/pi/test/dht11/transfer_tmp.py  
  2. */1 * * * * python /home/pi/pi/test/dht11/transfer_hum.py  
  3. */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必定要準確。
相關文章
相關標籤/搜索