It's easy to use the 5x5 NeoPixel Grid BFF with CircuitPython and the Adafruit_CircuitPython_NeoPixel module. This module allows you to easily write Python code that lets you control NeoPixels.
CircuitPython Microcontroller Wiring
Plug a 5x5 NeoPixel Grid BFF into your QT Py or Xiao form factor board exactly as shown below. Here's an example of connecting a QT Py RP2040 to the BFF.
Connect the QT Py RP2040 with plug headers into the 5x5 NeoPixel Grid BFF with socket headers. They should be plugged in with the backs of the boards facing each other.
For more information on soldering socket headers, check out this Learn Guide.
CircuitPython Usage
To use with CircuitPython, you need to first install the NeoPixel library, and its dependencies, into the lib folder on your CIRCUITPY drive. Then you need to update code.py with the example script.
Thankfully, we can do this in one go. In the example below, click the Download Project Bundle button below to download the necessary libraries and the code.py file in a zip file. Extract the contents of the zip file, and copy the entire lib folder, the tom-thumb.pcf font file, and the code.py file to your CIRCUITPY drive.
Your CIRCUITPY/lib folder should contain the following folders and files:
- /adafruit_bitmap_font
- /adafruit_display_text
- adafruit_pixelbuf.mpy
- neopixel.mpy
Additionally, a font file, tom-thumb.pcf, is included. This font will be utilized in both examples.
# SPDX-FileCopyrightText: Copyright (c) 2022 Jeff Epler for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense
import time
import board
import neopixel
from adafruit_display_text.bitmap_label import Label
from adafruit_bitmap_font import bitmap_font
from displayio import Bitmap
from rainbowio import colorwheel
font = bitmap_font.load_font("tom-thumb.pcf", Bitmap)
label = Label(text="Hello World!! Adafruit QT Py RP2040 + NeoPixel BFF ", font=font)
bitmap = label.bitmap
pixels = neopixel.NeoPixel(board.A3, 5*5, brightness=.07, auto_write=False)
pixels.fill(0)
pixels.show()
colors = [0, 0]
hue = 0
while True:
for i in range(bitmap.width):
# Use a rainbow of colors, shifting each column of pixels
hue = hue + 7
if hue >= 256:
hue = hue - 256
colors[1] = colorwheel(hue)
# Scoot the old text left by 1 pixel
pixels[0:20] = pixels[5:25]
# Draw in the next line of text
for y in range(5):
# Select black or color depending on the bitmap pixel
pixels[20+y] = colors[bitmap[i,y]]
pixels.show()
time.sleep(.1)
Once everything is saved to the CIRCUITPY drive, you'll see your 5x5 NeoPixel grid scroll the text "Hello World!! Adafruit QT Py RP2040 + NeoPixel BFF" in rainbow colors.
You can edit the scrolling text by updating the text property of label.
label = Label(text="Hello World!! Adafruit QT Py RP2040 + NeoPixel BFF ", font=font)
The code begins by instantiating the label text object and the pixels NeoPixel object. In the loop, the text scrolls continuously across the grid. The text is scrolled by moving the y coordinate of the text by 1.
# SPDX-FileCopyrightText: Copyright (c) 2022 Jeff Epler for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense
import time
import board
import neopixel
import fontio
from adafruit_display_text.bitmap_label import Label
from adafruit_bitmap_font import bitmap_font
from displayio import Bitmap
from rainbowio import colorwheel
tom_thumb = bitmap_font.load_font("tom-thumb.pcf", Bitmap)
_glyph_keys = ['bitmap', 'tile_index', 'width', 'height', 'dx', 'dy', 'shift_x', 'shift_y']
def patch_glyph(base, **kw):
d = {}
for k in _glyph_keys:
d[k] = kw.get(k, getattr(base, k))
return fontio.Glyph(**d)
class PatchedFont:
def __init__(self, base_font, patches):
self.base_font = base_font
self.patches = patches
def get_glyph(self, glyph):
g = self.base_font.get_glyph(glyph)
patch = self.patches.get(glyph)
if patch is not None:
print("patching", repr(chr(glyph)), g)
g = patch_glyph(g, **patch)
print("patched", g)
return g
def get_bounding_box(self):
return self.base_font.get_bounding_box()
font = PatchedFont(tom_thumb,
{
32: {'shift_x': 1, 'dx': 0},
105: {'dx': 0, 'shift_x': 2},
33: {'dx': 0, 'shift_x': 2},
})
label = Label(text=" adafruit! ", font=font)
bitmap = label.bitmap
heart_bitmap = [
0,1,1,0,0,
1,1,1,1,0,
0,1,1,1,1,
1,1,1,1,0,
0,1,1,0,0,
]
pixels = neopixel.NeoPixel(board.A3, 5*5, brightness=.06, auto_write=False)
while True:
for hue in range(0, 255, 3):
color = colorwheel(hue)
pixels[:] = [pixel * color for pixel in heart_bitmap]
pixels.show()
time.sleep(.01)
hue = 0
for i in range(bitmap.width):
# Use a rainbow of colors, shifting each column of pixels
hue = hue + 7
if hue >= 256:
hue = hue - 256
color = colorwheel(hue)
# Scoot the old text left by 1 pixel
pixels[:20] = pixels[5:]
# Draw in the next line of text
for y in range(5):
# Select black or color depending on the bitmap pixel
pixels[20+y] = color * bitmap[i,y]
pixels.show()
time.sleep(.1)
Once everything is saved to the CIRCUITPY drive, you'll see your 5x5 NeoPixel grid scroll a heart shape followed by the text "adafruit!".
The code begins by adjusting the tom-thumb font file with PatchedFont. The "i" and "!" characters and space are made narrower is so it looks a little better.
Then, the text and heart sprite shape are instantiated, followed by the pixels NeoPixel object.
In the loop, the heart sprite cycles through a colorwheel rainbow color cycle and then the text scrolls on the grid. The text is scrolled by moving the y coordinate of the text by 1.
Page last edited January 21, 2025
Text editor powered by tinymce.