===== Button press detect =====
In GPIO example section we have shown how to detect button presses by using GPIO read() command.
Now we will do the same task by using interrupts.
==== Requirements: ====
* Uper1 board
* Breadboard
* Push-button
* 10k (or similar) resistor
* Wires
==== Schematics: ====
{{ :examples:uper:1:05_gpio_read.png?direct&480 |}}
==== Code: ====
from time import sleep
from IoTPy.core.gpio import GPIO
from IoTPy.pyuper.uper import UPER1
def button_callback(event, obj):
obj['counter'] += 1
print "Interrupt %i" % obj['counter']
button_state = (event['values'] >> event['id']) & 0x1
obj['led'].write(button_state)
with UPER1() as board, board.GPIO(27) as redPin, board.GPIO(18) as buttonPin:
my_object = {'led': redPin, 'counter': 0}
buttonPin.attach_irq(GPIO.CHANGE, button_callback, my_object)
redPin.setup(GPIO.OUTPUT)
redPin.write(1)
while True:
sleep(0.5)
===== PIR sensor =====
This example demonstrates how to use HC-SR501 PIR sensor for motion detection applications, e.g. burglar alarm.
The sensor outputs LOW signal when it is idle and HIGH when the motion has been detected.
==== Requirements: ====
* Uper1 board
* HC-SR501 sensor
* Wires
==== Schematics: ====
{{ :examples:uper:1:01_hc-sr501_pir.png?direct&480 |}}
==== Code: ====
from time import sleep
from IoTPy.core.gpio import GPIO
from IoTPy.pyuper.uper import UPER1
def pir_callback(event, obj):
print event
if event['type'] == GPIO.RISE:
print "Movement detected"
led.write(0) # turn ON the led
elif event['type'] == GPIO.FALL:
print "No movement"
led.write(1) # turn OFF the led
else:
print "Unknown event"
with UPER1() as board, board.GPIO(27) as led, board.GPIO(18) as button:
button.setup(GPIO.INPUT, GPIO.PULL_UP)
button.attach_irq(GPIO.CHANGE, pir_callback, led)
led.setup(GPIO.OUTPUT)
led.write(1)
while True:
sleep(0.5)
===== Rotary encoder =====
This example shows how to use RotaryEncoder class to detect changes of the rotary switch position.
==== Requirements: ====
* Uper1 board
* Breadboard
* Rotary switch (rotary encoder)
* Two 10k resistors
* Wires
==== Schematics: ====
{{ :examples:uper:1:02_rotaryencoder.png?direct&480 |}}
==== Code: ====
from IoTPy.pyuper.uper import UPER1
from IoTPy.things.rotary_encoder import RotaryEncoder
from time import sleep
def on_rotation(direction, position):
print "Rotated by %i, current position is %i" % (direction, position)
with UPER1() as board, \
board.GPIO(1) as chan0, board.GPIO(2) as chan1, \
RotaryEncoder(chan0, chan1, on_rotation) as encoder:
while True:
sleep(0.5)
In this example almost all of the work is done by the RotaryEncoder class - it detects changes on the rotary switch pins
and determines the direction of the rotation. For the convenience it also tracks the absolute position. RotaryEncoder class
takes three parameters: the first two are just Interrupt channels to the rotary switch pins and the third one is an optional
user callback function which shall be called on every detected rotation. If you want, you can skip this third parameter and
just track the absolute position via the ''position'' variable. You can also reverse the rotation direction by switching
the signals either physically on breadboard (green and white wires) or in code (Interrupt GPIO IDs 1 and 2).