We've sawed, drilled, 3D printed and soldered in this project so far, and now we're going to do some typing. The code is of course written in CircuitPython and uses the Adafruit Bluefruit app to switch between different color animations. For maximum animation smoothness, we'll be using the FancyLED library. It allows for more control over swirling animations which are ideal for this project.
First, you'll want to install the latest version of CircuitPython on your Circuit Playground Bluefruit
CircuitPython Libraries
We'll need some libraries for our CircuitPython code. Be sure to download the library bundle that matches your version of CircuitPython on your Circuit Playground Bluefruit.
Once your Circuit Playground Bluefruit is connected to your computer, access its file system and create a new folder called lib. From the Library bundle that you just downloaded, drag and drop the following libraries:
- adafruit_ble
- adafruit_bluefruit_connect
- adafruit_bus_device
- adafruit_circuitplayground
- adafruit_fancyled
- adafruit_bluefruitspi.mpy
- neopixel.mpy
Now we can copy the code below into a file called code.py and drag and drop it onto our CIRCUITPY drive. Afterwards you should be able to connect to the Circuit Playground Bluefruit via the Adafruit Bluefruit app and control the various NeoPixel animations.
# SPDX-FileCopyrightText: 2019 Liz Clark for Adafruit Industries
#
# SPDX-License-Identifier: MIT
import random
import board
import neopixel
import adafruit_fancyled.adafruit_fancyled as fancy
from adafruit_bluefruit_connect.packet import Packet
from adafruit_bluefruit_connect.button_packet import ButtonPacket
from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.nordic import UARTService
# setting up # of neopixels
TREE_LEDS = 12
CPX_LEDS = 10
# setting up pins for neopixels
TREE_PIN = board.A1
CPX_PIN = board.D8
# neopixel setup
tree = neopixel.NeoPixel(TREE_PIN, TREE_LEDS, brightness=0.5, auto_write=False)
cpx = neopixel.NeoPixel(CPX_PIN, CPX_LEDS, brightness=0.1, auto_write=False)
# BLE setup
ble = BLERadio()
uart = UARTService()
advertisement = ProvideServicesAdvertisement(uart)
advertising = False
# to turn neopixels off
OFF = (0, 0, 0)
# fancyLED color palettes
fairy_palette = [fancy.CRGB(1.0, 0.0, 0.0),
fancy.CRGB(1.0, 0.5, 0.0),
fancy.CRGB(0.0, 0.5, 0.0),
fancy.CRGB(0.0, 1.0, 1.0),
fancy.CRGB(0.0, 0.0, 1.0),
fancy.CRGB(0.75, 0.0, 1.0)]
merry_palette = [fancy.CRGB(1.0, 0.0, 0.0),
fancy.CRGB(0.0, 1.0, 0.0)]
winter_palette = [fancy.CRGB(0.0, 0.75, 0.0),
fancy.CRGB(0.0, 1.0, 1.0),
fancy.CRGB(0.75, 0.0, 1.0),
fancy.CRGB(1.0, 1.0, 1.0),
fancy.CRGB(0.0, 0.75, 0.0),
fancy.CRGB(0.75, 0.0, 1.0),
fancy.CRGB(0.0, 0.0, 1.0),
fancy.CRGB(0.0, 1.0, 1.0),
fancy.CRGB(1.0, 0.0, 1.0)]
star_palette = [fancy.CRGB(1.0, 0.75, 0.0),
fancy.CRGB(1.0, 1.0, 1.0),
fancy.CRGB(1.0, 0.75, 0.0),
fancy.CRGB(0.75, 0.75, 0.75),
fancy.CRGB(1.0, 0.75, 0.0)]
hanukkah_palette = [fancy.CRGB(0.0, 1.0, 1.0),
fancy.CRGB(0.0, 0.0, 1.0),
fancy.CRGB(1.0, 0.75, 0.0),
fancy.CRGB(0.0, 0.0, 1.0),
fancy.CRGB(1.0, 1.0, 1.0)]
# default offset value
offset = 0
def gimel():
for i in range(TREE_LEDS):
color = fancy.palette_lookup(hanukkah_palette, (offset - i) / 5)
color = fancy.gamma_adjust(color, brightness=0.3)
tree[i] = color.pack()
tree.show()
for i in range(CPX_LEDS):
color = fancy.palette_lookup(hanukkah_palette, (offset - i) / 3)
color = fancy.gamma_adjust(color, brightness=0.3)
cpx[i] = color.pack()
cpx.show()
# neopixel animations
def jazzy():
for i in range(TREE_LEDS):
color = fancy.palette_lookup(fairy_palette, (offset - i) / 4.8)
color = fancy.gamma_adjust(color, brightness=0.3)
tree[i] = color.pack()
tree.show()
for i in range(CPX_LEDS):
color = fancy.palette_lookup(fairy_palette, (offset + i) / 4)
color = fancy.gamma_adjust(color, brightness=0.3)
cpx[i] = color.pack()
cpx.show()
def latkes():
for i in range(TREE_LEDS):
color = fancy.palette_lookup(hanukkah_palette, (offset - 24) / TREE_LEDS)
color = fancy.gamma_adjust(color, brightness=0.3)
tree[i] = color.pack()
tree.show()
for i in range(CPX_LEDS):
color = fancy.palette_lookup(hanukkah_palette, (offset - 20) / CPX_LEDS)
color = fancy.gamma_adjust(color, brightness=0.3)
cpx[i] = color.pack()
cpx.show()
def twinkle():
for i in range(60):
color = fancy.palette_lookup(fairy_palette, offset + i / CPX_LEDS)
color = fancy.gamma_adjust(color, brightness=0.25)
p = random.randint(0, (CPX_LEDS - 1))
cpx[p] = color.pack()
cpx.show()
for i in range(60):
color = fancy.palette_lookup(fairy_palette, offset + i / TREE_LEDS)
color = fancy.gamma_adjust(color, brightness=0.25)
p = random.randint(0, (TREE_LEDS - 1))
tree[p] = color.pack()
tree.show()
def merry():
for i in range(TREE_LEDS):
color = fancy.palette_lookup(merry_palette, (offset + i) / (TREE_LEDS / 2))
color = fancy.gamma_adjust(color, brightness=0.25)
tree[i] = color.pack()
tree.show()
for i in range(60):
color = fancy.palette_lookup(star_palette, (offset + i) / CPX_LEDS)
color = fancy.gamma_adjust(color, brightness=0.25)
p = random.randint(0, (CPX_LEDS - 1))
cpx[p] = color.pack()
cpx.show()
def festive():
for i in range(TREE_LEDS):
color = fancy.palette_lookup(merry_palette, (offset - i) / 2)
color = fancy.gamma_adjust(color, brightness=0.25)
tree[i] = color.pack()
tree.show()
for i in range(CPX_LEDS):
color = fancy.palette_lookup(star_palette, (offset + i) / CPX_LEDS)
color = fancy.gamma_adjust(color, brightness=0.25)
cpx[i] = color.pack()
cpx.show()
def fancy_swirl():
for i in range(TREE_LEDS):
color = fancy.palette_lookup(winter_palette, (offset + i) / TREE_LEDS)
color = fancy.gamma_adjust(color, brightness=0.25)
tree[i] = color.pack()
tree.show()
for i in range(CPX_LEDS):
color = fancy.palette_lookup(star_palette, (offset - i) / CPX_LEDS)
color = fancy.gamma_adjust(color, brightness=0.25)
cpx[i] = color.pack()
cpx.show()
# states for different neopixel displays
fairies = False
feeling_fancy = False
feeling_festive = False
feeling_jazzy = False
feeling_merry = False
frying_latkes = False
rolling_gimel = False
while True:
# states to trigger the different neopixel modes
if fairies:
twinkle()
offset += 0.5
if feeling_fancy:
fancy_swirl()
offset += 0.05
if feeling_festive:
festive()
offset += 0.05
if feeling_jazzy:
jazzy()
offset += 0.08
if feeling_merry:
merry()
offset += 0.12
if frying_latkes:
latkes()
offset += 0.05
if rolling_gimel:
gimel()
offset += 0.05
if not ble.connected and not advertising:
# not connected in the app yet
ble.start_advertising(advertisement)
advertising = True
if ble.connected:
# after connected via app
advertising = False
if uart.in_waiting:
# waiting for input from app
packet = Packet.from_stream(uart)
if isinstance(packet, ButtonPacket):
# if buttons in the app are pressed
if packet.pressed:
# fairies
if packet.button == ButtonPacket.UP:
fairies = True
feeling_fancy = False
feeling_festive = False
feeling_jazzy = False
feeling_merry = False
frying_latkes = False
rolling_gimel = False
# fancy
if packet.button == ButtonPacket.LEFT:
fairies = False
feeling_fancy = True
feeling_festive = False
feeling_jazzy = False
feeling_merry = False
frying_latkes = False
rolling_gimel = False
# festive
if packet.button == ButtonPacket.RIGHT:
fairies = False
feeling_fancy = False
feeling_festive = True
feeling_jazzy = False
feeling_merry = False
frying_latkes = False
rolling_gimel = False
# jazzy
if packet.button == ButtonPacket.DOWN:
fairies = False
feeling_fancy = False
feeling_festive = False
feeling_jazzy = True
feeling_merry = False
frying_latkes = False
rolling_gimel = False
# merry
if packet.button == ButtonPacket.BUTTON_1:
fairies = False
feeling_fancy = False
feeling_festive = False
feeling_jazzy = False
feeling_merry = True
frying_latkes = False
rolling_gimel = False
# latkes
if packet.button == ButtonPacket.BUTTON_2:
fairies = False
feeling_fancy = False
feeling_festive = False
feeling_jazzy = False
feeling_merry = False
frying_latkes = True
rolling_gimel = False
# gimel
if packet.button == ButtonPacket.BUTTON_3:
fairies = False
feeling_fancy = False
feeling_festive = False
feeling_jazzy = False
feeling_merry = False
frying_latkes = False
rolling_gimel = True
# off
if packet.button == ButtonPacket.BUTTON_4:
fairies = False
feeling_fancy = False
feeling_festive = False
feeling_jazzy = False
feeling_merry = False
frying_latkes = False
rolling_gimel = False
cpx.fill(OFF)
tree.fill(OFF)
tree.show()
cpx.show()
Page last edited January 20, 2025
Text editor powered by tinymce.