code.py
1 # SPDX-FileCopyrightText: 2022 Dan Halbert for Adafruit Industries 2 # 3 # SPDX-License-Identifier: MIT 4 5 import asyncio 6 import board 7 import digitalio 8 import keypad 9 10 11 class Interval: 12 """Simple class to hold an interval value. Use .value to to read or write.""" 13 14 def __init__(self, initial_interval): 15 self.value = initial_interval 16 17 18 async def monitor_interval_buttons(pin_slower, pin_faster, interval): 19 """Monitor two buttons: one lengthens the interval, the other shortens it. 20 Change interval.value as appropriate. 21 """ 22 # Assume buttons are active low. 23 with keypad.Keys( 24 (pin_slower, pin_faster), value_when_pressed=False, pull=True 25 ) as keys: 26 while True: 27 key_event = keys.events.get() 28 if key_event and key_event.pressed: 29 if key_event.key_number == 0: 30 # Lengthen the interval. 31 interval.value += 0.1 32 else: 33 # Shorten the interval. 34 interval.value = max(0.1, interval.value - 0.1) 35 print("interval is now", interval.value) 36 # Let another task run. 37 await asyncio.sleep(0) 38 39 40 async def blink(pin, interval): 41 """Blink the given pin forever. 42 The blinking rate is controlled by the supplied Interval object. 43 """ 44 with digitalio.DigitalInOut(pin) as led: 45 led.switch_to_output() 46 while True: 47 led.value = not led.value 48 await asyncio.sleep(interval.value) 49 50 51 async def main(): 52 interval1 = Interval(0.5) 53 interval2 = Interval(1.0) 54 55 led1_task = asyncio.create_task(blink(board.D1, interval1)) 56 led2_task = asyncio.create_task(blink(board.D2, interval2)) 57 interval1_task = asyncio.create_task( 58 monitor_interval_buttons(board.D3, board.D4, interval1) 59 ) 60 interval2_task = asyncio.create_task( 61 monitor_interval_buttons(board.D5, board.D6, interval2) 62 ) 63 64 await asyncio.gather(led1_task, led2_task, interval1_task, interval2_task) 65 66 67 asyncio.run(main())