diff --git a/gpiozero/__init__.py b/gpiozero/__init__.py new file mode 100644 index 0000000..d1aa32c --- /dev/null +++ b/gpiozero/__init__.py @@ -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, +) diff --git a/gpiozero/input_devices.py b/gpiozero/input_devices.py new file mode 100644 index 0000000..68f8738 --- /dev/null +++ b/gpiozero/input_devices.py @@ -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 diff --git a/gpiozero/output_devices.py b/gpiozero/output_devices.py new file mode 100644 index 0000000..6129423 --- /dev/null +++ b/gpiozero/output_devices.py @@ -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