Adafruit_Learning_System_Gu.../Cooperative_Multitasking/one-led-buttons/code.py
Dan Halbert 042d233146 SPDX
2022-01-06 12:15:26 -05:00

63 lines
1.9 KiB
Python

# SPDX-FileCopyrightText: 2022 Dan Halbert for Adafruit Industries
#
# SPDX-License-Identifier: MIT
import asyncio
import board
import digitalio
import keypad
class Interval:
"""Simple class to hold an interval value. Use .value to to read or write."""
def __init__(self, initial_interval):
self.value = initial_interval
async def monitor_interval_buttons(pin_slower, pin_faster, interval):
"""Monitor two buttons: one lengthens the interval, the other shortens it.
Change interval.value as appropriate.
"""
# Assume buttons are active low.
with keypad.Keys(
(pin_slower, pin_faster), value_when_pressed=False, pull=True
) as keys:
while True:
key_event = keys.events.get()
if key_event and key_event.pressed:
if key_event.key_number == 0:
# Lengthen the interval.
interval.value += 0.1
else:
# Shorten the interval.
interval.value = max(0.1, interval.value - 0.1)
print("interval is now", interval.value)
# Let another task run.
await asyncio.sleep(0)
async def blink(pin, interval):
"""Blink the given pin forever.
The blinking rate is controlled by the supplied Interval object.
"""
with digitalio.DigitalInOut(pin) as led:
led.switch_to_output()
while True:
led.value = not led.value
await asyncio.sleep(interval.value)
async def main():
# Start blinking 0.5 sec on, 0.5 sec off.
interval = Interval(0.5)
led_task = asyncio.create_task(blink(board.D1, interval))
interval_task = asyncio.create_task(
monitor_interval_buttons(board.D3, board.D4, interval)
)
# This will run forever, because neither task ever exits.
await asyncio.gather(led_task, interval_task)
asyncio.run(main())