zoukankan      html  css  js  c++  java
  • 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()

    运行代码后会出现两个文件分别来保存温度和湿度,如下图:

    这样一来温湿度的数据就保存下来了,然后就是读取并上传了

    上传数据至云端

    上传之前,首先要将云物联网平台,现在的免费的云物联网平台有很多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:  %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:
     %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:  %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:
     %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一定要准确。
     
  • 相关阅读:
    2016年 IT 趋势大预测!
    怎样创建合适的告警处理流程?
    如何解决 Java 安全问题?
    程序员:如何成为一个全栈的工程师?
    安全防护:你是否正在追逐一个不可能实现的目标?
    如何使用 Python 创建一个 NBA 得分图?
    如何对 Android 库进行依赖管理?
    减少 WAF 漏报的 8 种方法 !
    第69节:Java中数据库的多表操作
    第69节:Java中数据库的多表操作
  • 原文地址:https://www.cnblogs.com/Javi/p/8649739.html
Copyright © 2011-2022 走看看