Raspberry Pi GPIO到Xively python的例子?

时间:2014-10-07 18:18:32

标签: python raspberry-pi gpio xively

我是一名非程序员,通过运行Python的Raspberry Pi感受Xively。我已经成功完成了在这里给出的xively网站上给出的教程:https://xively.com/dev/tutorials/pi/

我的项目的下一步是不断地从其中一个GPIO引脚读取数据(无论是高还是低)进行一些计算,每分钟一次为Xively数据提供一个数字。

我将GPIO部分放在一个单独的程序中。但是当我尝试将其合并到我运行的Xively教程示例程序中时,我遇到了问题。

我现在认为我应该让GPIO程序和Xively程序​​同时运行GPIO程序将数据写入文件,并从该文件中读取Xively程序​​并将数据上传到feed。所以我的问题是:这是否可行并且相当容易执行?

或者,如果有人可以指出我修改Xively教程示例以接受GPIO输入的示例,那也会有所帮助。

如果有更好/更简单的方法来完成我所追求的目标,我愿意接受建议......

1 个答案:

答案 0 :(得分:0)

你需要:

首先下载并安装Xively Python Library。 下载并安装httplib2模块。

您可以将“GPIO传感器”脚本与“将数据发送到Xively”脚本结合使用。

以下是您的示例代码(适用于Raspberry Pi和DHT 11):

#!/usr/bin/python

# Import required Python libraries
import RPi.GPIO as GPIO
import time
import random
import datetime
import json
import sys
import Adafruit_DHT
# Custom HTTP Library
import httplib2

# Use BCM GPIO references
# instead of physical pin numbers
#GPIO.setmode(GPIO.BCM)

# Define GPIO to use on Pi

# Set pin as input
#GPIO.setup(GPIO_PIR,GPIO.IN)

# Define sensor state (1 by default)
SENSOR_STATE = 1

DHT_TYPE = Adafruit_DHT.DHT11
DHT_PIN  = 22
# Define URLs and API key for sending and receiving requests
sensorURL = ""
temperatureURL = ""
humidityURL = ""
API_KEY = ""

# Retrieve latest sensor state from Xively via GET request
def retrieve_sensor_state():
  try:

    global SENSOR_STATE  
    print "\nRetrieving from Xively"

    h = httplib2.Http(disable_ssl_certificate_validation=True)
    (resp_headers, content) = h.request(sensorURL, "GET", headers={'X-ApiKey':API_KEY})
    jsonData = json.loads(content)
    SENSOR_STATE = jsonData["current_value"]
    print "Sensor state: " + SENSOR_STATE
    if (SENSOR_STATE == str(1)):
       upload_to_xively()
       print "continuing!"
    else:
       print "sensor is disabled!"  

  except:
    print "Error occurred!"

# Upload sensor data to Xively via PUT request
def upload_to_xively():
  try:

    print "Uploading to Xively"

    now = str(datetime.datetime.now())
    humidity, value = Adafruit_DHT.read(DHT_TYPE, DHT_PIN)
    if humidity is not None and value is not None:
        print "temperature value :" + str(value) + "    |    " + str(now)
        print "humidity value :" + str(humidity) + "    |    " + str(now)

        jsonString = {"id":"temperature","tags":[],"unit":{},"current_value":value}
        publishString = json.dumps(jsonString)

        h = httplib2.Http(disable_ssl_certificate_validation=True)
        (resp, content) = h.request(temperatureURL, "PUT", body=publishString, headers={'X-ApiKey':API_KEY})

        jsonString1 = {"id":"humidity","tags":[],"unit":{},"current_value":humidity}
        publishString1 = json.dumps(jsonString1)
        g = httplib2.Http(disable_ssl_certificate_validation=True)
        (resp, content) = g.request(humidityURL, "PUT", body=publishString1, headers={'X-    ApiKey':API_KEY})
    else:
    print "failed to read data! Trying again"

  except:
    print "Error occurred!"

# Callback function from event handler when motion is detected
#def motion_callback(GPIO_PIR):

#  global SENSOR_STATE
  # Log the sensor data down only if sensor state = 1 (enabled)
#  if SENSOR_STATE == str(1):
#    if GPIO.input(GPIO_PIR):
#        print "\nMotion Detected! @ " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
#        upload_to_xively()
#        time.sleep(1)
#    else:
#        print "\nBack to Normal"

# Main program
print "DHT Module Test (Ctrl+C to exit)"
time.sleep(2)
print "Ready"

try:
  while True: 
    retrieve_sensor_state()
    time.sleep(10)
    continue

except KeyboardInterrupt:
  print "Quit"
  GPIO.cleanup()