DIY Interruption Sign

In this project we’re making a NeoPixel LED sign using CircuitPython. This was inspired by BusyBox interruption sign so we designed and 3D printed our own enclosure.

Swappable Faceplates

We designed it to have swappable faceplates so the front cover can easily come off. Black LED acrylic is used for the faceplates and evenly diffuses the NeoPixels. Use vinyl cut decals to make high-quality faceplate designs.

Portable & Customizable

The slide switch is built into the side of the enclosure so we can easily turn it on and off.

It runs off a lipo battery so it can be mounted to our door without any dangling cables.

Parts

You can use just about any Feather for this project, but if you'd like to later add wireless BLE control, the nRF52840 is the best option!
The Adafruit Feather nRF52840 Express is the new Feather family member with Bluetooth Low Energy and native USB support featuring the nRF52840!  It's...
Out of Stock
A nice whoppin' slab of some lovely black acrylic to add some extra diffusion to your LED Matrix project. This material is 2.6mm (0.1") thick and is made of special cast...
$9.95
In Stock
You thought it couldn't get better than our world-famous 32-LED-per-meter Digital LED strip but we will prove you wrong! These...
$84.75
In Stock
These nice switches are perfect for use with breadboard and perfboard projects. They have 0.1" spacing and snap in nicely into a solderless breadboard. They're easy to switch...
$0.95
In Stock
Lithium ion polymer (also known as 'lipo' or 'lipoly') batteries are thin, light and powerful. The output ranges from 4.2V when completely charged to 3.7V. This battery...
$9.95
In Stock
For those who are fans of our silicone-covered wires, but are always looking to up their wiring game. We now have Silicone Cover Ribbon cables! These may look...
$3.95
In Stock
This cable is not only super-fashionable, with a woven pink and purple Blinka-like pattern, it's also fully reversible! That's right, you will save seconds a day by...
Out of Stock
1 x M2.5 Hardware Kit
M2.5 Black Nylon Standoffs and Screws
1 x Acrylic Cutter
10 Pcs Blade Set, Multi-Use Cutter with Cutting Blade
1 x Velcro Strips
Command Picture Hanging Strips, Medium, White, 3-Pairs (17201-ES)
1 x Matte Black Vinyl
12in x 10ft Roll of Oracal 651 Matte Black Craft Vinyl
1 x Engineering Scissors
Super Scissors - PH-57

The diagram below provides a visual reference for wiring of the components. This diagram was created using the software package Fritzing.

Adafruit Library for Fritzing

Use Adafruit's Fritzing parts library to create circuit diagrams for your projects. Download the library or just grab individual parts. Get the library and parts from GitHub - Adafruit Fritzing Parts.

Wired Connections

Two NeoPixel strips are daisy chained together. Each strip has eight NeoPixel LEDs making a total of 16 NeoPixel LEDs.

NeoPixel Strip

  • DIN to Pin #6 on Feather
  • GND to GND on Feather
  • 5V to 3V on Feather
  • DOU from strip #1 to DIN on strip #2
  • GND from strip #1 to GND on strip 2
  • 5V from strip #1 to 5V on strip #2

Switch

  • Enable and Ground on Feather

Powering

The Adafruit board can be powered via USB or JST using a 3.7v lipo battery. In this project, a 1200mAh lipo battery is used. The battery is rechargeable with a USB lipo charger. The switch is wired to the EN and GND pins on the Feather.

Parts List

STL files for 3D printing are oriented to print "as-is" on FDM style machines. Parts are designed to 3D print without any support material. Original design source may be downloaded using the links below.

File names

  • front-cover.stl
  • frame.stl
  • back-cover.stl
  • pcb-mount.stl
  • plate-holder.stl
  • hanger-bracket-horiz.stl
  • hanger-bracket-vert.stl

CAD Assembly

The Feather is mounted to standoffs secured to the PCB mount. The switch is press fitted into the built-in holder on the PCB mount. The faceplate holder is secured to the mounting tabs inside the frame. The PCB mount is secured to the mounting tabs inside the frame behind the faceplate holder. The front and back cover snap fit onto the frame. Additional mounting brackets can be secured to the back cover.

Slicing Parts

No supports are required. Slice with setting for PLA material. 

The parts were sliced using CURA using the slice settings below.

  • PLA filament 220c extruder
  • 0.2 layer height
  • 10% gyroid infill
  • 60mm/s print speed
  • 60c heated bed

Design Source Files

The project assembly was designed in Fusion 360. This can be downloaded in different formats like STEP, STL and more. Electronic components like Adafruit's board, displays, connectors and more can be downloaded from the Adafruit CAD parts GitHub Repo.

CircuitPython is a derivative of MicroPython designed to simplify experimentation and education on low-cost microcontrollers. It makes it easier than ever to get prototyping by requiring no upfront desktop software downloads. Simply copy and edit files on the CIRCUITPY drive to iterate.

The following instructions will show you how to install CircuitPython. If you've already installed CircuitPython but are looking to update it or reinstall it, the same steps work for that as well!

Set up CircuitPython Quick Start!

Follow this quick step-by-step for super-fast Python power :)

Click the link above to download the latest UF2 file.

 

Download and save it to your desktop (or wherever is handy).

Plug your Feather nRF52840 into your computer using a known-good USB cable.

A lot of people end up using charge-only USB cables and it is very frustrating! So make sure you have a USB cable you know is good for data sync.

Double-click the Reset button next to the USB connector on your board, and you will see the NeoPixel RGB LED turn green (identified by the arrow in the image). If it turns red, check the USB cable, try another USB port, etc. Note: The little red LED next to the USB connector will pulse red. That's ok!

If double-clicking doesn't work the first time, try again. Sometimes it can take a few tries to get the rhythm right!

You will see a new disk drive appear called FTHR840BOOT.

 

 

 

Drag the adafruit_circuitpython_etc.uf2 file to FTHR840BOOT.

The LED will flash. Then, the FTHR840BOOT drive will disappear and a new disk drive called CIRCUITPY will appear.

 

That's it, you're done! :)

As we continue to develop CircuitPython and create new releases, we will stop supporting older releases. Visit https://circuitpython.org/downloads to download the latest version of CircuitPython for your board. You must download the CircuitPython Library Bundle that matches your version of CircuitPython. Please update CircuitPython and then visit https://circuitpython.org/libraries to download the latest Library Bundle.

Each CircuitPython program you run needs to have a lot of information to work. The reason CircuitPython is so simple to use is that most of that information is stored in other files and works in the background. These files are called libraries. Some of them are built into CircuitPython. Others are stored on your CIRCUITPY drive in a folder called lib. Part of what makes CircuitPython so awesome is its ability to store code separately from the firmware itself. Storing code separately from the firmware makes it easier to update both the code you write and the libraries you depend.

Your board may ship with a lib folder already, it's in the base directory of the drive. If not, simply create the folder yourself. When you first install CircuitPython, an empty lib directory will be created for you.

CircuitPython libraries work in the same way as regular Python modules so the Python docs are a great reference for how it all should work. In Python terms, we can place our library files in the lib directory because its part of the Python path by default.

One downside of this approach of separate libraries is that they are not built in. To use them, one needs to copy them to the CIRCUITPY drive before they can be used. Fortunately, we provide a bundle full of our libraries.

Our bundle and releases also feature optimized versions of the libraries with the .mpy file extension. These files take less space on the drive and have a smaller memory footprint as they are loaded.

Installing the CircuitPython Library Bundle

We're constantly updating and improving our libraries, so we don't (at this time) ship our CircuitPython boards with the full library bundle. Instead, you can find example code in the guides for your board that depends on external libraries. Some of these libraries may be available from us at Adafruit, some may be written by community members!

Either way, as you start to explore CircuitPython, you'll want to know how to get libraries on board.

You can grab the latest Adafruit CircuitPython Bundle release by clicking the button below.

Note: Match up the bundle version with the version of CircuitPython you are running - 3.x library for running any version of CircuitPython 3, 4.x for running any version of CircuitPython 4, etc. If you mix libraries with major CircuitPython versions, you will most likely get errors due to changes in library interfaces possible during major version changes.

If you need another version, you can also visit the bundle release page which will let you select exactly what version you're looking for, as well as information about changes.

Either way, download the version that matches your CircuitPython firmware version. If you don't know the version, look at the initial prompt in the CircuitPython REPL, which reports the version. For example, if you're running v4.0.1, download the 4.x library bundle. There's also a py bundle which contains the uncompressed python files, you probably don't want that unless you are doing advanced work on libraries.

After downloading the zip, extract its contents. This is usually done by double clicking on the zip. On Mac OSX, it places the file in the same directory as the zip.

Open the bundle folder. Inside you'll find two information files, and two folders. One folder is the lib bundle, and the other folder is the examples bundle.

Now open the lib folder. When you open the folder, you'll see a large number of mpy files and folders

Example Files

All example files from each library are now included in the bundles, as well as an examples-only bundle. These are included for two main reasons:

  • Allow for quick testing of devices.
  • Provide an example base of code, that is easily built upon for individualized purposes.

Copying Libraries to Your Board

First you'll want to create a lib folder on your CIRCUITPY drive. Open the drive, right click, choose the option to create a new folder, and call it lib. Then, open the lib folder you extracted from the downloaded zip. Inside you'll find a number of folders and .mpy files. Find the library you'd like to use, and copy it to the lib folder on CIRCUITPY.

This also applies to example files. They are only supplied as raw .py files, so they may need to be converted to .mpy using the mpy-cross utility if you encounter MemoryErrors. This is discussed in the CircuitPython Essentials Guide. Usage is the same as described above in the Express Boards section. Note: If you do not place examples in a separate folder, you would remove the examples from the import statement.

If a library has multiple .mpy files contained in a folder, be sure to copy the entire folder to CIRCUITPY/lib.

Example: ImportError Due to Missing Library

If you choose to load libraries as you need them, you may write up code that tries to use a library you haven't yet loaded.  We're going to demonstrate what happens when you try to utilise a library that you don't have loaded on your board, and cover the steps required to resolve the issue.

This demonstration will only return an error if you do not have the required library loaded into the lib folder on your CIRCUITPY drive.

Let's use a modified version of the blinky example.

Download: file
import board
import time
import simpleio

led = simpleio.DigitalOut(board.D13)

while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)

Save this file. Nothing happens to your board. Let's check the serial console to see what's going on.

We have an ImportError. It says there is no module named 'simpleio'. That's the one we just included in our code!

Click the link above to download the correct bundle. Extract the lib folder from the downloaded bundle file. Scroll down to find simpleio.mpy. This is the library file we're looking for! Follow the steps above to load an individual library file.

The LED starts blinking again! Let's check the serial console.

No errors! Excellent. You've successfully resolved an ImportError!

If you run into this error in the future, follow along with the steps above and choose the library that matches the one you're missing.

Library Install on Non-Express Boards

If you have a Trinket M0 or Gemma M0, you'll want to follow the same steps in the example above to install libraries as you need them. You don't always need to wait for an ImportError as you probably know what library you added to your code. Simply open the lib folder you downloaded, find the library you need, and drag it to the lib folder on your CIRCUITPY drive.

You may end up running out of space on your Trinket M0 or Gemma M0 even if you only load libraries as you need them. There are a number of steps you can use to try to resolve this issue. You'll find them in the Troubleshooting page in the Learn guides for your board.

Updating CircuitPython Libraries/Examples

Libraries and examples are updated from time to time, and it's important to update the files you have on your CIRCUITPY drive.

To update a single library or example, follow the same steps above. When you drag the library file to your lib folder, it will ask if you want to replace it. Say yes. That's it!

A new library bundle is released every time there's an update to a library. Updates include things like bug fixes and new features. It's important to check in every so often to see if the libraries you're using have been updated.

Coding

This project uses the neopixel library from the CircuitPython. For more information on NeoPixel animations, check out the LED animation guide and the NeoPixel Uber Guide.

Download the Adafruit CircuitPython Library Bundle

In order to run the code, we'll need to download a few libraries. Libraries contain code to help interface with hardware a lot easier for us.

Use the Feather nRF52840 page on Installing CircuitPython to get the library that matches the major version of CircuitPython you are using noted above.

To run the code for this project, we need the three libraries in the Required Libraries list below. Unzip the library bundle and search for the libraries. Drag and drop the files into a folder named lib on the CIRCUITPY drive (which appears when your board is plugged into your computer via a known good USB cable) if the directory is not already on the Feather nRF52840).

Required Libraries 

  • adafruit_led_animation
  • neopixel.mpy

The Mu Python Editor

Mu is a simple Python editor that works with Adafruit CircuitPython hardware. It's written in Python and works on Windows, MacOS, Linux and Raspberry Pi. The serial console is built right in, so you get immediate feedback from your board's serial output! While you can use any text editor with your code, Mu makes it super simple. Instructions for Mu are available here.

Installing or Upgrading CircuitPython

You should ensure you have CircuitPython 5.0 or greater on your board. Plug your board in with a known good data + power cable (not the cheesy USB cable that comes with USB power packs, they are power only). You should see a new flash drive pop up.

If the drive is CIRCUITPY, then open the boot_out.txt file to ensure the version number is 5.0 or greater. 

Download: file
Adafruit CircuitPython 5.3.0 on 2020-04-29; Adafruit Feather nRF52840 Express with nRF52840

Click on the download link below to grab the project code directly from GitHub.

Upload Code

Ensure the file is named code.py and drop it onto the CIRCUITPY drive main (root) directory that appears when your Feather is plugged into your computer via a known good USB data cable. The code will run properly when all of the files have been uploaded including libraries.

import time
import board
import neopixel
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.pulse import Pulse
from adafruit_led_animation.animation.blink import Blink
from adafruit_led_animation.animation.rainbow import Rainbow
from adafruit_led_animation.animation.colorcycle import ColorCycle
from adafruit_led_animation.sequence import AnimationSequence
from adafruit_led_animation import helper
from adafruit_led_animation.color import PURPLE, AQUA, RED, JADE, ORANGE, YELLOW, BLUE

#Setup NeoPixels
pixel_pin = board.D6
pixel_num = 16
pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=.9, auto_write=False)

#Setup NeoPixel Grid
pixel_wing_vertical = helper.PixelMap.vertical_lines(
    pixels, 8, 2, helper.horizontal_strip_gridmap(8, alternating=True)
)
pixel_wing_horizontal = helper.PixelMap.horizontal_lines(
    pixels, 8, 2, helper.horizontal_strip_gridmap(8, alternating=True)
)

#Setup LED Animations
rainbow = Rainbow(pixels, speed=.001, period=2)
pulse = Pulse(pixels, speed=0.1, color=RED, period=3)
blink = Blink(pixels, speed=0.5, color=RED)
colorcycle = ColorCycle(pixels, speed=0.4, colors=[RED, ORANGE, YELLOW, JADE, BLUE, AQUA, PURPLE])
comet_v = Comet(pixel_wing_vertical, speed=0.05, color=PURPLE, tail_length=6, bounce=True)

#Setup the LED Sequences
animations = AnimationSequence(
    rainbow,
    pulse,
    comet_v,
    blink,
    colorcycle,
    advance_interval=5.95,
)

#Run ze animations!
while True:
    animations.animate()

Acrylic Template

Print out the faceplate template onto paper and cut out the shape using scissors or a hobby knife. This paper template cutout is used to reference the correct size of the faceplates.

Scoring Paper Backing on Acrylic

I started by scoring the paper backing using an xacto knife. I used a metal ruler on a cutting mat and made sure to be extra careful.

Scoring Acrylic

To cut the acrylic I used a scoring tool that’s specifically made cutting acrylic. I made sure to score several times before snapping off the pieces. 

Snap Acrylic Piece

Once I was about half-way through, I put it near the edge of the table and snapped off the piece. I repeated this process for a so I could make a few different designs.

Vinyl Decals

I used a vinyl cutter with some matte black vinyl to create the signs. I found the matte black vinyl works the best for masking out the LEDs. Use our SVG file for creating similar decals or create your own.

Vinyl Transfer Tape

I cut pieces of transfer tape to size and carefully placed them over the vinyl. Use a standard grip tape meant for vinyl. 

Apply Transfer Tape

Using a squeegee, I started from the center and worked my way outwards so I could knock out any air bubbles.

Remove Transfer Tape

Start from the corners and begin to peel the tape off. I tend to peel slowly especially for intricate designs with small pieces.

Apply Vinyl to Faceplate

I made sure to wipe the acrylic clean with a bit of alcohol before sticking it to the faceplate. Place the vinyl onto the faceplate starting with the center and working your way outwards. Using the squeegee once again to knock out those pesky air bubbles.

Remove Tape from Faceplate

Then I proceeded to peel off the transfer tape and lastly removed the protective paper backing.

Wiring Switch

Use a 2-wire ribbon cable 86mm in length. Using wire stripper, remove a bit of insulation from the tips of each wire. Tin the wires by adding a bit of solder. This will prevent the strands of wire from fraying.

Soldering Switch

Solder the 2-wire ribbon cable to the middle pin and a pin on either side. Third helping hands can help assist soldering by holding components and wires steady.

Wired Switch

The slide switch is wired to the EN and GND pins on the Feather.

Wiring Strips

Cut two pieces of strips off the reel of NeoPixels. Each strip includes 8x NeoPixels, making a total of 16. Use two 3-wire ribbon cables. The cable for the first strip is 76mm in length. The second strip will require a cable 96mm in length.

Wiring First Strip (DIN)

Solder the 76mm long wire to the first NeoPixel strip. Use the arrow labeled on the flexible PCB to indicate the DIN pin. Solder the cable to the 5V, GND and DIN pads.

Wiring First Strip (DOUT)

Solder the 96mm long cable to the pads on the end the first strip. Solder the cable to 5V, DOUT and GND pads.

Wiring Second Strip

Solder the other end of the 96mm long cable to the pads on the second strip. Solder the cable to 5V, DIN and GND pads.

Wired Strips

Double check the labels on the flexible PCBs to ensure the polarity is correct.

Wiring Feather

The slide switch and NeoPixel strips are now ready to solder to the Feather. The slide switch and NeoPixel strip will share common ground.

Wiring Switch to Feather

Solder the cable from the switch  to the EN and GND pins on the Feather. Solder the wires from the bottom of the Feather PCB.

Test Switch

Quickly test out the slide switch by plugging in the battery. Use the switch to power the Feather on and off.

Wiring Strips to Feather

Solder the three wires from the NeoPixel strips to pin #6, GND and 3V on Feather. The ground pin is shared across the switch and NeoPixel strip.

Test Circuit

Plug in the battery again and use the switch to power the Feather on. With CircuitPython installed and code uploaded, the NeoPixel LEDs will power on and cycle through animations.

PCB Hardware

Use the following hardware to secure the Feather to the PCB mounting plate.

  • 4x M2.5 x 6mm (female-female) Standoffs
  • 8x M2.5 x 4mm screws

Installed Hardware

Insert the screws through the four mounting holes and install the standoffs. Reference the photo for correct placement.

Install Switch

Place the switch into the built-in holder. Insert the body of the switch at an angle and press down to secure in place.

Install Feather

Place the Feather over the four standoffs and line up the mounting holes. Adjust the wiring so they're neatly fitted under the Feather. Insert and fasten 4x M2.5 x 4mm long screws through the mounting holes to secure the Feather.

Faceplate Holder Hardware

Use the following hardware to secure the faceplate holder to the enclosure framing.

  • 6x M2.5 x 6mm (female-female) standoffs
  • 6x M2.5 x 4mm screws

Install Hardware for Faceplate Holder

Insert the screws through the six mounting tabs and install the standoffs. Reference the photo for correct placement.

Test Fit PCB

I suggest test fitting the PCB mounting plate before securing it to the framing. That helps determine the orientation of the enclosure. 

Holes in Frame

The hole cutout on the side of the enclosure framing is used to expose the microUSB port on the Feather and the slide switch.

Installing Strips

The two NeoPixel strips are secured to the inner walls of the framing using nito double-sided tape. Hot glue or other adhesives can also be used as a substitute.

Cut Tape Pieces

I cut out four strips of double-sided nito tape. That was enough to secure the NeoPixel strips.

Install Strip A

The PCB mounting plate is removed in order to have more space for the NeoPixel strip to be attached. Check the wiring and ensure there's enough slack for the strip. Reference the photo for best placement. Attach the strip to the inner wall of the framing.

Install Strip B

Attach the second strip the other side of the framing. Check the wiring and ensure there's enough slack for the strip. Do not cover up the snaps. Try to place the strips in line with the inner wall.

Test Strips

Plug in the battery to the Feather and use the slide switch to power on the circuit. This lets you know if everything is still working and if the placement of the strips are good.

Install Faceplate Holder & PCB mount

Place the faceplate holder down with the standoffs facing up. Place the framing over the faceplate holder and line up the mounting holes. Place the PCB mount over the three mounting tabs onto the inside of the framing. Use the following hardware to secure the parts together. Use the longer screws to secure the PCB mounting plate.

  • 3x M2.5 x 6mm long screws
  • 3x M2.5 x 4mm long screws

Secured Plate Holder

Reference the photo for correct placement of the faceplate holder, PCB mounting plate and framing.

Connect Battery

Plug in the 1200mAh battery into the JST power port on the Feather.

Tack Battery

The battery is secured to the back cover using mounting tack.

Secured Battery

The battery can be fit onto the bar in the middle of the back cover.

Install Back Cover

The back cover snap fits onto the back of the framing.

Back Cover Mounting Brackets

The back cover mounting brackets are used for attaching 3M velcro strips. This allows the sign to be easily taken off the door or wall. Use the holes built-into the back cover to secure onto screws or nails.

Install Acrylic Plate

Insert the acrylic plate into the faceplate holder by sliding into the rails.

Install Front Cover

Place the front cover over the framing with the side tabs properly oriented. Firmly press together to snap fit shut.

Final Build

And there you have it! You sign is ready to mount onto the wall or door. I plan to use this a whole lot and hope this inspires you to check out CircuitPython!

This guide was first published on Sep 01, 2020. It was last updated on Sep 01, 2020.