From f8b6b5937eb0170ae28d5593dd8d6a01a8038dd0 Mon Sep 17 00:00:00 2001 From: Swift Date: Wed, 13 Mar 2013 03:20:41 -0500 Subject: [PATCH] Added analog inputs and buzzer with example --- breakfast_serial/components.py | 37 +++++++++++++++++++++++++--------- examples/buzzer.py | 29 ++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 examples/buzzer.py diff --git a/breakfast_serial/components.py b/breakfast_serial/components.py index 6412f70..d0cb8e2 100644 --- a/breakfast_serial/components.py +++ b/breakfast_serial/components.py @@ -1,6 +1,6 @@ from breakfast_serial import Arduino from util import EventEmitter, setInterval -import pyfirmata +import pyfirmata, re class ArduinoNotSuppliedException(Exception): pass @@ -14,7 +14,25 @@ def __init__(self, board, pin): super(Component, self).__init__() self._board = board - self._pin = self._board.digital[pin] + + analog_regex = re.compile('A(\d)') + match = analog_regex.match(str(pin)) + + if match: + self._pin = self._board.analog[int(match.group(1))] + else: + self._pin = self._board.digital[int(pin)] + + @property + def value(self): return self._pin.value + +class Sensor(Component): + + def __init__(self, board, pin): + super(Sensor, self).__init__(board, pin) + + self._pin.mode = pyfirmata.INPUT + self._pin.enable_reporting() class Led(Component): @@ -46,27 +64,26 @@ def toggle(self): def blink(self, millis): self._interval = setInterval(self.toggle, millis) -class Button(Component): +class Buzzer(Led): + pass + +class Button(Sensor): def __init__(self, board, pin): super(Button, self).__init__(board, pin) - - self._pin.mode = pyfirmata.INPUT - self._pin.enable_reporting() - - self._old_value = self._pin.value + self._old_value = self.value self._board.on('data', self._handle_data) def _handle_data(self): - value = self._pin.value + value = self.value if self._old_value != value: self._old_value = value self._handle_state_changed() def _handle_state_changed(self): - if self._pin.value == False: + if self.value == False: self.emit('up') else: self.emit('down') diff --git a/examples/buzzer.py b/examples/buzzer.py new file mode 100644 index 0000000..58b32f5 --- /dev/null +++ b/examples/buzzer.py @@ -0,0 +1,29 @@ +#! /usr/bin/env python +""" +This is an example that demonstrates how to use a +photoresistor to control a buzzer (piezo element) +using breakfast_serial. It assumes you have an +photoresistor (or some equivalent analog input) +wired up to pin A0 and a buzzer on pin 8. +""" +from breakfast_serial import Arduino, Buzzer, Sensor, setInterval +from time import sleep + +board = Arduino() +buzzer = Buzzer(board, "8") +sensor = Sensor(board, "A0") + +def loop(): + value = sensor.value or 1 # value is initially None + value = value / 2 + + buzzer.on() + sleep(value) + buzzer.off() + sleep(value) + +setInterval(loop, 0) + +# Run an interactive shell so you can play (not required) +import code +code.InteractiveConsole(locals=globals()).interact()