Rename to gpiozero and tidy up

This commit is contained in:
Ben Nuttall
2015-09-15 17:53:08 +01:00
parent 90aed0e925
commit abdc215175
3 changed files with 139 additions and 0 deletions

20
gpiozero/__init__.py Normal file
View File

@@ -0,0 +1,20 @@
from __future__ import absolute_import
from RPi import GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
from .input_devices import (
InputDeviceError,
InputDevice,
Button,
MotionSensor,
LightSensor,
TemperatureSensor,
)
from .output_devices import (
OutputDevice,
LED,
Buzzer,
Motor,
)

94
gpiozero/input_devices.py Normal file
View File

@@ -0,0 +1,94 @@
from RPi import GPIO
from w1thermsensor import W1ThermSensor
class InputDevice(object):
def __init__(self, pin=None):
if pin is None:
raise InputDeviceError('No GPIO pin number given')
self.pin = pin
self._pull = GPIO.PUD_UP
self._edge = GPIO.FALLING
self._active_state = 0
self._inactive_state = 1
GPIO.setup(pin, GPIO.IN, self._pull)
@property
def is_active(self):
return GPIO.input(self.pin) == self._active_state
def wait_for_input(self):
GPIO.wait_for_edge(self.pin, self._edge)
def add_callback(self, callback=None, bouncetime=1000):
if callback is None:
raise InputDeviceError('No callback function given')
GPIO.add_event_detect(self.pin, self._edge, callback, bouncetime)
def remove_callback(self):
GPIO.remove_event_detect(self.pin)
class Button(InputDevice):
pass
class MotionSensor(InputDevice):
def _is_active_with_pause(self):
sleep(0.1)
return self.is_active
@property
def motion_detected(self):
n = 20
return sum(self._is_active_with_pause() for i in range(n)) > n/2
class LightSensor(object):
def __init__(self, pin=None, darkness_level=0.01):
if pin is None:
raise InputDeviceError('No GPIO pin number given')
self.pin = pin
self.darkness_level = darkness_level
@property
def value(self):
return self._get_average_light_level(5)
def _get_light_level(self):
time_taken = self._time_charging_light_capacitor()
value = 100 * time_taken / self.darkness_level
return 100 - value
def _time_charging_light_capacitor(self):
GPIO.setup(self.pin, GPIO.OUT)
GPIO.output(self.pin, GPIO.LOW)
sleep(0.1)
GPIO.setup(self.pin, GPIO.IN)
start_time = time()
end_time = time()
while (
GPIO.input(self.pin) == GPIO.LOW and
time() - start_time < self.darkness_level
):
end_time = time()
time_taken = end_time - start_time
return min(time_taken, self.darkness_level)
def _get_average_light_level(self, num):
values = [self._get_light_level() for n in range(num)]
average_value = sum(values) / len(values)
return average_value
class TemperatureSensor(W1ThermSensor):
@property
def value(self):
return self.get_temperature()
class InputDeviceError(Exception):
pass

View File

@@ -0,0 +1,25 @@
from RPi import GPIO
class OutputDevice(object):
def __init__(self, pin):
self.pin = pin
GPIO.setup(pin, GPIO.OUT)
def on(self):
GPIO.output(self.pin, True)
def off(self):
GPIO.output(self.pin, False)
class LED(OutputDevice):
pass
class Buzzer(OutputDevice):
pass
class Motor(OutputDevice):
pass