diff service/thermostat/rpi_buttons.py @ 56:517bd1407ed6

thermostat program and raspberry pi buttons reader Ignore-this: aed325a19554a509a19747c89079597b
author drewp@bigasterisk.com
date Sun, 10 Feb 2013 02:22:08 -0800
parents
children cbc557c35121
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/thermostat/rpi_buttons.py	Sun Feb 10 02:22:08 2013 -0800
@@ -0,0 +1,64 @@
+#!/usr/bin/python3
+"""
+read button and knob on rpi, send back to thermostat program
+"""
+from RPi.GPIO import setmode, PUD_UP, setup, BCM, IN, input as pinInput
+import time, json
+# using a copy of urllib/request.py from py3.3 which supports 'method'
+from request import urlopen, Request
+
+requestedTemperature = 'http://bang.bigasterisk.com:10001/requestedTemperature'
+requestOpts = dict(headers={'user-agent': 'rpi buttons'})
+
+def getRequestedTemp():
+    return (json.loads(urlopen(
+        Request(requestedTemperature, **requestOpts)).read().decode('utf-8'))
+    )['tempF']
+
+def setRequestedTemp(f):
+    urlopen(Request(url=requestedTemperature,
+            method='PUT',
+            data=json.dumps({'tempF' : f}).encode('utf-8'),
+            **requestOpts))
+
+PIN_KNOB_A = 1
+PIN_KNOB_B = 4
+PIN_BUTTON = 0
+
+setmode(BCM)
+setup(PIN_KNOB_A, IN, PUD_UP)
+setup(PIN_KNOB_B, IN, PUD_UP)
+setup(PIN_BUTTON, IN, PUD_UP)
+
+print("reading knob and button, writing to %s" % requestedTemperature)
+prev = None
+prevButton = 0
+buttonHold = 0
+step = .05
+while True:
+    a, b = pinInput(PIN_KNOB_A), pinInput(PIN_KNOB_B)
+    button = not pinInput(PIN_BUTTON)
+    pos = (b * 2) + (a ^ b)
+
+    if prev is None:
+        prev = pos
+    dpos = (pos - prev) % 4
+
+    if dpos == 1:
+        print ("up")
+        setRequestedTemp(getRequestedTemp() + 1)
+    elif dpos == -1 % 4:
+        print ("down")
+        setRequestedTemp(getRequestedTemp() - 1)
+    else:
+        pass # 0 or unknown
+    prev = pos
+    
+    if button:
+        buttonHold += 1
+        if buttonHold == int(.1 / step):
+            print ("button to", button)
+    else:
+        buttonHold = 0
+
+    time.sleep(step)