Adafruit_Learning_System_Gu.../ItsyBitsy_Infinity_Cube/code.py
2022-02-23 13:25:24 -05:00

92 lines
4 KiB
Python
Executable file

# SPDX-FileCopyrightText: 2019 Kattni Rembor for Adafruit Industries
#
# SPDX-License-Identifier: MIT
"""
Code for ItsyBitsy nRF52840 Infinity Cube.
"""
import board
import neopixel
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.sparkle import Sparkle
from adafruit_led_animation.group import AnimationGroup
from adafruit_led_animation.sequence import AnimationSequence
import adafruit_led_animation.color as color
from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.nordic import UARTService
from adafruit_bluefruit_connect.packet import Packet
from adafruit_bluefruit_connect.color_packet import ColorPacket
from adafruit_bluefruit_connect.button_packet import ButtonPacket
# The number of NeoPixels in the externally attached strip
# If using two strips connected to the same pin, count only one strip for this number!
STRIP_PIXEL_NUMBER = 43
# Setup for comet animation
COMET_SPEED = 0.05 # Lower numbers increase the animation speed
STRIP_COMET_TAIL_LENGTH = 10 # The length of the comet on the NeoPixel strip
STRIP_COMET_BOUNCE = False # Set to False to stop comet from "bouncing" on NeoPixel strip
# Setup for sparkle animation
SPARKLE_SPEED = 0.1 # Lower numbers increase the animation speed
# Create the NeoPixel strip
strip_pixels = neopixel.NeoPixel(board.D5, STRIP_PIXEL_NUMBER, auto_write=False)
# Setup BLE connection
ble = BLERadio()
uart = UARTService()
advertisement = ProvideServicesAdvertisement(uart)
# Setup animations
animations = AnimationSequence(
AnimationGroup(
Sparkle(strip_pixels, SPARKLE_SPEED, color.TEAL)
),
AnimationGroup(
Comet(strip_pixels, COMET_SPEED, color.TEAL, tail_length=STRIP_COMET_TAIL_LENGTH,
bounce=STRIP_COMET_BOUNCE)
),
)
animation_color = None
mode = 0
blanked = False
while True:
ble.start_advertising(advertisement) # Start advertising.
was_connected = False
while not was_connected or ble.connected:
if not blanked: # If LED-off signal is not being sent...
animations.animate() # Run the animations.
if ble.connected: # If BLE is connected...
was_connected = True
if uart.in_waiting: # Check to see if any data is available.
try:
packet = Packet.from_stream(uart) # Create the packet object.
except ValueError:
continue
if isinstance(packet, ColorPacket): # If the packet is color packet...
if mode == 0: # And mode is 0...
animations.color = packet.color # Update the animation to the color.
print("Color:", packet.color)
animation_color = packet.color # Keep track of the current color...
elif mode == 1: # Because if mode is 1...
animations.color = animation_color # Freeze the animation color.
print("Color:", animation_color)
elif isinstance(packet, ButtonPacket): # If the packet is a button packet...
if packet.pressed: # If the buttons in the app are pressed...
if packet.button == ButtonPacket.LEFT: # If left arrow is pressed...
print("A pressed: animation mode changed.")
animations.next() # Change to the next animation.
elif packet.button == ButtonPacket.RIGHT: # If right arrow is pressed...
mode += 1 # Increase the mode by 1.
if mode == 1: # If mode is 1, print the following:
print("Right pressed: color frozen!")
if mode > 1: # If mode is > 1...
mode = 0 # Set mode to 0, and print the following:
print("Right pressed: color changing!")