Introduction: NeoPixel Pattern Programmer
In this instructable I will show you how to make my pattern programmer for Adafruit's NeoPixels.
It's a hassle to think up nice patterns in code every time, so I created a little application that you can visually program the patterns in, to get quick results on your leds!
What makes this code different than other pattern writers or programmers, is that this application writes the values to the Arduino EEPROM. The EEPROM of the Arduino will not get erased when you power down, this means you can program your deviced, and the pattern will be on it every time you power them on. EEPROM writing and reading is handled by the Arduino firmware.
Together with the Processing sketch that allows you to easily draw a pattern strip and calculates all the values for you and sends them out nicely formatted this is an almost hassle free way to make your NeoPixels do what you want!
Apologies beforehand for the code, it might get a bit hardcode-y in the end.
Step 1: Step 1: Parts and Schematic
To build this device You'll need a few parts!
-1 Arduino, I prefer Nano's
-A length of Adafruit Neopixels, use a segment of 5 if you don't want to change anything in my code
-A Switch
-A 1K resistor
-Breadboard, wire, pcb, anything to hook it all up.
The wiring is real easy, just hook it up like on the schematic. For short lengths of LED strip like in this project, you don't need to use external power.
The switch is to switch between display and program mode, if you are writing a new pattern to the device, put it in program mode to make sure you don't miss a bit.
This is the code for the Arduino:
You'll need to download the NeoPixel library, the EEPROM library is included with the arduino software.
//Arduino EEPROM neopixel pattern writer by Pieter Pelt 2015 //This sketch takes values from the eeprom to show on neopixels, it can also receive new data and write that to the eeprom //Receives data from accompanying processing sketch //Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) #include <EEPROM.h> #include <Adafruit_NeoPixel.h> #define PIN 3 #define FRAMES 0 #define DELAY 1 #define LEDS 2 /* RGB DEFS */ #define RED 0 #define GREEN 1 #define BLUE 2 int sw = 2; Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800); char eepColor[3]; // Contains R, G, B values char programData[3]; void writeRGB(int _addr, char _red, char _green, char _blue) { EEPROM.write(_addr + RED, _red); // Write eeprom with data EEPROM.write(_addr + GREEN, _green); // Write eeprom with data EEPROM.write(_addr + BLUE, _blue); // Write eeprom with data } void writeEeprom(char _frames, char _delay, char _leds) { EEPROM.write(FRAMES, _frames); // Frames in the annimation EEPROM.write(DELAY, _delay); // Delay after frames EEPROM.write(LEDS, _leds); // Leds per strip /* writeRGB(3, 255, 0, 0); writeRGB(6, 0, 255, 0); writeRGB(9, 0, 0, 255); writeRGB(12, 255, 255, 0); writeRGB(15, 0, 255, 255); //for(int i=3; i<16; i=i+3)writeRGB(i, 255, 255, 0); // fill frome 1 with yello for(int i=18; i<31; i=i+3)writeRGB(i, 0, 255, 0); // fill frame 2 with blue for(int i=33; i<46; i=i+3)writeRGB(i, 255, 0, 255); // fill frame 3 with red */ } void readEeprom() { programData[FRAMES] = EEPROM.read(FRAMES); // Get amount of frames programData[DELAY] = EEPROM.read(DELAY); // Get delay per frame programData[LEDS] = EEPROM.read(LEDS); // Get leds per strip } void initStrip() { strip.begin(); // Initialize ledstrip strip.show(); // Initialize all pixels to 'off' } void getLedData(int _addr) { eepColor[RED] = EEPROM.read(_addr + RED); eepColor[GREEN] = EEPROM.read(_addr + GREEN); eepColor[BLUE] = EEPROM.read(_addr + BLUE); } void setup() { writeEeprom(8, 100, 5); // Write frames, delay and led to eeprom readEeprom(); initStrip(); Serial.begin(9600); } void loop() { if (Serial.available() > 0) { int maxtemp = 16; int temp[maxtemp]; for (int i = 0; i < maxtemp; i++) { temp[i] = Serial.parseInt(); } if (Serial.read() == '\n') { if (temp[15] == 200) { //if the last number was a 200 EEPROM.write(DELAY, temp[14]); //set the delay value instead readEeprom(); } else { //else you got rgb data so write that to the EEPROM for (int i = 3; i < maxtemp + 1; i = i + 3) { writeRGB(temp[15] + i, temp[i - 3], temp[i - 2], temp[i - 1]); //last value in the array is used for the offset in the EEPROM, offset = start of a new fram } } } } if (digitalRead(sw)) { // if switch digitalWrite(13, HIGH); for (int i = 0; i < programData[FRAMES]; i++) { for (int j = 0; j < programData[LEDS]; j++) { getLedData(3 + (j * 3) + (3 * i * programData[LEDS])); // Get RGB data for one led strip.setPixelColor(j, strip.Color(eepColor[RED], eepColor[GREEN], eepColor[BLUE])); // Set one led with RGB value } strip.show(); // Display on the strip delay(int(programData[DELAY])); } } else { digitalWrite(13, LOW); } }
Step 2: Load Up the Software
This is the accompanying Processing sketch.
With this sketch you can draw a pattern like I do in my video, and the software will calculate all the values and positions to sent to the Arduino.
There are a few hotkeys in this program:
s - sent values to arduino (make sure the arduino is in data receive mode, and not in display mode!)
r - reset
b - reset to black
o and p - change delay (the speed of the pattern)
l - load up bitmap
Use the .pde file attached to this page, I couldn't embed the code, as the instructables formatting was always removing essential parts.
Attachments
Step 3: Have Fun Applying Easy to Program NeoPixels to Your Projects, Clothes and Interior!
I used these on my clothes at a MakerFaire, to independently bring more wearable technology to the party! But they of course can be used for anything!