Skip to content

Commit b978d23

Browse files
authored
Merge pull request #2137 from kattni/fespb-asyncio
Add asyncio template code for Feather ESP32-S2
2 parents 926cbc4 + e52afab commit b978d23

File tree

1 file changed

+80
-0
lines changed
  • Adafruit_Feather_ESP32-S2/asyncio

1 file changed

+80
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2022 Dan Halbert for Adafruit Industries
2+
# SPDX-FileCopyrightText: Copyright (c) 2022 Kattni Rembor for Adafruit Industries
3+
#
4+
# SPDX-License-Identifier: MIT
5+
"""
6+
CircuitPython asyncio example for two NeoPixel rings and one button.
7+
"""
8+
import asyncio
9+
import board
10+
import neopixel
11+
import keypad
12+
from rainbowio import colorwheel
13+
14+
button_pin = board.BUTTON # The pin the button is connected to.
15+
num_pixels = 16 # The number of NeoPixels on a single ring.
16+
brightness = 0.2 # The LED brightness.
17+
18+
# Set up NeoPixel rings.
19+
ring_one = neopixel.NeoPixel(board.A1, num_pixels, brightness=brightness, auto_write=False)
20+
ring_two = neopixel.NeoPixel(board.A2, num_pixels, brightness=brightness, auto_write=False)
21+
22+
23+
class AnimationControls:
24+
"""The controls to allow you to vary the rainbow and blink animations."""
25+
def __init__(self):
26+
self.reverse = False
27+
self.wait = 0.0
28+
self.delay = 0.5
29+
30+
31+
async def rainbow_cycle(controls):
32+
"""Rainbow cycle animation on ring one."""
33+
while True:
34+
for j in range(255, -1, -1) if controls.reverse else range(0, 256, 1):
35+
for i in range(num_pixels):
36+
rc_index = (i * 256 // num_pixels) + j
37+
ring_one[i] = colorwheel(rc_index & 255)
38+
ring_one.show()
39+
await asyncio.sleep(controls.wait)
40+
41+
42+
async def blink(controls):
43+
"""Blink animation on ring two."""
44+
while True:
45+
ring_two.fill((0, 0, 255))
46+
ring_two.show()
47+
await asyncio.sleep(controls.delay)
48+
ring_two.fill((0, 0, 0))
49+
ring_two.show()
50+
await asyncio.sleep(controls.delay)
51+
await asyncio.sleep(controls.wait)
52+
53+
54+
async def monitor_button(button, controls):
55+
"""Monitor button that reverses rainbow direction and changes blink speed.
56+
Assume button is active low.
57+
"""
58+
with keypad.Keys((button,), value_when_pressed=False, pull=True) as key:
59+
while True:
60+
key_event = key.events.get()
61+
if key_event:
62+
if key_event.pressed:
63+
controls.reverse = True
64+
controls.delay = 0.1
65+
elif key_event.released:
66+
controls.reverse = False
67+
controls.delay = 0.5
68+
await asyncio.sleep(0)
69+
70+
71+
async def main():
72+
animation_controls = AnimationControls()
73+
button_task = asyncio.create_task(monitor_button(button_pin, animation_controls))
74+
animation_task = asyncio.create_task(rainbow_cycle(animation_controls))
75+
blink_task = asyncio.create_task(blink(animation_controls))
76+
77+
# This will run forever, because no tasks ever finish.
78+
await asyncio.gather(button_task, animation_task, blink_task)
79+
80+
asyncio.run(main())

0 commit comments

Comments
 (0)