diff --git a/gpiozero/__init__.py b/gpiozero/__init__.py index e1ed84a..e2a3336 100644 --- a/gpiozero/__init__.py +++ b/gpiozero/__init__.py @@ -8,7 +8,7 @@ from .devices import ( _gpio_threads_shutdown, GPIODeviceError, GPIODevice, - ) +) from .input_devices import ( InputDeviceError, InputDevice, @@ -23,6 +23,12 @@ from .output_devices import ( Buzzer, Motor, ) +from .boards import ( + TrafficLights, + PiTraffic, + FishDish, + PiLiter, +) def gpiozero_shutdown(): diff --git a/gpiozero/boards.py b/gpiozero/boards.py new file mode 100644 index 0000000..a2c34f7 --- /dev/null +++ b/gpiozero/boards.py @@ -0,0 +1,76 @@ +from .input_devices import Button +from .output_devices import LED, Buzzer +from .devices import GPIODeviceError + + +class TrafficLights(object): + def __init__(self, red=None, amber=None, green=None): + if not all([red, amber, green]): + raise GPIODeviceError('Red, Amber and Green pins must be provided') + + self.red = LED(red) + self.amber = LED(amber) + self.green = LED(green) + self._leds = (self.red, self.amber, self.green) + + def on(self): + for led in self._leds: + led.on() + + def off(self): + for led in self._leds: + led.off() + + def blink(self, on_time=1, off_time=1): + for led in self._leds: + led.blink(on_time, off_time) + + +class FishDish(TrafficLights): + def __init__(self): + red, amber, green = (9, 22, 4) + super(FishDish, self).__init__(red, amber, green) + self.buzzer = Buzzer(8) + self.button = Button(pin=7, pull_up=False) + self._all = tuple(list(self._leds) + [self.buzzer]) + + def on(self): + for thing in self._all: + thing.on() + + def off(self): + for thing in self._all: + thing.off() + + def lights_on(self): + super.on() + + def lights_off(self): + super.off() + + +class TrafficHat(FishDish): + def __init__(self): + red, amber, green = (24, 23, 22) + super(PiTraffic, self).__init__(red, amber, green) + self.buzzer = Buzzer(5) + self.button = Button(25) + self._all = tuple(list(self._leds) + [self.buzzer]) + + +class PiLiter(object): + def __init__(self): + leds = (4, 17, 27, 18, 22, 23, 24, 25) + self._leds = tuple([LED(led) for led in leds]) + + def on(self): + for led in self._leds: + led.on() + + def off(self): + for led in self._leds: + led.off() + + def blink(self, on_time=1, off_time=1): + for led in self._leds: + led.blink(on_time, off_time) diff --git a/gpiozero/devices.py b/gpiozero/devices.py index f6d82c4..da3b69f 100644 --- a/gpiozero/devices.py +++ b/gpiozero/devices.py @@ -33,6 +33,8 @@ class GPIODevice(object): _GPIO_THREADS = set() + + def _gpio_threads_shutdown(): while _GPIO_THREADS: for t in _GPIO_THREADS.copy(): @@ -95,4 +97,3 @@ class GPIOQueue(GPIOThread): # Parent is dead; time to die! pass - diff --git a/gpiozero/input_devices.py b/gpiozero/input_devices.py index 12658f9..d17279c 100644 --- a/gpiozero/input_devices.py +++ b/gpiozero/input_devices.py @@ -128,6 +128,7 @@ class SmoothedInputDevice(WaitableInputDevice): def _get_threshold(self): return self._threshold + def _set_threshold(self, value): if not (0.0 < value < 1.0): raise InputDeviceError('threshold must be between zero and one exclusive') @@ -208,6 +209,7 @@ class LightSensor(SmoothedInputDevice): wait_for_dark = _alias('wait_for_inactive') + class TemperatureSensor(W1ThermSensor): @property def value(self): diff --git a/gpiozero/output_devices.py b/gpiozero/output_devices.py index d219c62..3a5840e 100644 --- a/gpiozero/output_devices.py +++ b/gpiozero/output_devices.py @@ -1,4 +1,5 @@ from RPi import GPIO +from time import sleep from .devices import GPIODeviceError, GPIODevice, GPIOThread @@ -24,9 +25,11 @@ class LED(OutputDevice): super(LED, self).__init__(pin) self._blink_thread = None - def blink(self, on_time, off_time): + def blink(self, on_time=1, off_time=1): self._stop_blink() - self._blink_thread = GPIOThread(target=self._blink_led, args=(on_time, off_time)) + self._blink_thread = GPIOThread( + target=self._blink_led, args=(on_time, off_time) + ) self._blink_thread.start() def _stop_blink(self): @@ -58,3 +61,35 @@ class Buzzer(OutputDevice): class Motor(OutputDevice): pass + + +class Robot(object): + def __init__(self, left=None, right=None): + if not all([left, right]): + raise GPIODeviceError('left and right pins must be provided') + + self._left = Motor(left) + self._right = Motor(right) + + def left(self, seconds=None): + self._left.on() + if seconds is not None: + sleep(seconds) + self._left.off() + + def right(self, seconds=None): + self._right.on() + if seconds is not None: + sleep(seconds) + self._right.off() + + def forwards(self, seconds=None): + self.left() + self.right() + if seconds is not None: + sleep(seconds) + self.stop() + + def stop(self): + self._left.off() + self._right.off()