From e52afabbf1c28bf6ea1e03a0f8cbfc67d035c897 Mon Sep 17 00:00:00 2001 From: Kattni Rembor Date: Thu, 7 Apr 2022 15:12:44 -0400 Subject: [PATCH] Add asyncio template code for Feather ESP32-S2 --- Adafruit_Feather_ESP32-S2/asyncio/code.py | 80 +++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 Adafruit_Feather_ESP32-S2/asyncio/code.py diff --git a/Adafruit_Feather_ESP32-S2/asyncio/code.py b/Adafruit_Feather_ESP32-S2/asyncio/code.py new file mode 100644 index 000000000..98663cfa2 --- /dev/null +++ b/Adafruit_Feather_ESP32-S2/asyncio/code.py @@ -0,0 +1,80 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 Dan Halbert for Adafruit Industries +# SPDX-FileCopyrightText: Copyright (c) 2022 Kattni Rembor for Adafruit Industries +# +# SPDX-License-Identifier: MIT +""" +CircuitPython asyncio example for two NeoPixel rings and one button. +""" +import asyncio +import board +import neopixel +import keypad +from rainbowio import colorwheel + +button_pin = board.BUTTON # The pin the button is connected to. +num_pixels = 16 # The number of NeoPixels on a single ring. +brightness = 0.2 # The LED brightness. + +# Set up NeoPixel rings. +ring_one = neopixel.NeoPixel(board.A1, num_pixels, brightness=brightness, auto_write=False) +ring_two = neopixel.NeoPixel(board.A2, num_pixels, brightness=brightness, auto_write=False) + + +class AnimationControls: + """The controls to allow you to vary the rainbow and blink animations.""" + def __init__(self): + self.reverse = False + self.wait = 0.0 + self.delay = 0.5 + + +async def rainbow_cycle(controls): + """Rainbow cycle animation on ring one.""" + while True: + for j in range(255, -1, -1) if controls.reverse else range(0, 256, 1): + for i in range(num_pixels): + rc_index = (i * 256 // num_pixels) + j + ring_one[i] = colorwheel(rc_index & 255) + ring_one.show() + await asyncio.sleep(controls.wait) + + +async def blink(controls): + """Blink animation on ring two.""" + while True: + ring_two.fill((0, 0, 255)) + ring_two.show() + await asyncio.sleep(controls.delay) + ring_two.fill((0, 0, 0)) + ring_two.show() + await asyncio.sleep(controls.delay) + await asyncio.sleep(controls.wait) + + +async def monitor_button(button, controls): + """Monitor button that reverses rainbow direction and changes blink speed. + Assume button is active low. + """ + with keypad.Keys((button,), value_when_pressed=False, pull=True) as key: + while True: + key_event = key.events.get() + if key_event: + if key_event.pressed: + controls.reverse = True + controls.delay = 0.1 + elif key_event.released: + controls.reverse = False + controls.delay = 0.5 + await asyncio.sleep(0) + + +async def main(): + animation_controls = AnimationControls() + button_task = asyncio.create_task(monitor_button(button_pin, animation_controls)) + animation_task = asyncio.create_task(rainbow_cycle(animation_controls)) + blink_task = asyncio.create_task(blink(animation_controls)) + + # This will run forever, because no tasks ever finish. + await asyncio.gather(button_task, animation_task, blink_task) + +asyncio.run(main())