A dinky small miniature persistence-of-vision gift

TL;DR: I made this for Jen as a gift to convince her that going out with geeks is a great passtime. It worked! [Update: She even married the geek.]

This device is simply 8 bright SMD LEDs and an AVR uC and makes use of the Persistence of Vision effect. You wave it about, and it writes messages in the air, with no wires, liquids or unpleasant bending! Some would say that it’s quite similar to magic. It’s a double-sided kitchen PCB (toner transfer) with a flower on the back. It has a single button; held for a second, it switches it on/off. When on, a quick click switches between a set of predefined messages. It runs off a CR2032 until the end of time.

Update: Board and firmware

21 August 2016

In giving this site a bit of a makeover, I remembered I was going to post the schematics and firmware for this thing.

Standard disclaimer: No warranties. Licence? Matt’s Do What You Want And Don’t Blame Me licence.


In the pictures (and as commented in the source), I had missed out having a pull-down resistor on the board that I made. I’ve added this to the board as revision B, presented here.

 miniPOV rev.B schematic
miniPOV rev.B schematic

Also, bear in mind that I made the board in a kitchen with an iron and toner transfer – so it might not be PCB-haus ready (in particular, check the drills for the CR2032 clip).


This code uses avr-libc (it’s not Wiring/Arduino code).

The firmware is an awfully quick hack and isn’t particularly neat. However, it demonstrates use of timer interrupts, the low-power modes of the AVR and wakeup-on-pinchange.

The firmware periodically samples the potentiometer and uses this for a display speed (so you can match how fast you wave it side-to-side). The click-switch is used to turn the device on/off and to select a different pattern/phrase to display, with a long/short click. When the device is asleep, the current consumption should be very low, as the LEDs are off, the ADC is powered down and no current flows through the potentiometer (since it’s driven from GPIO pins which are both set to 0).