Burning Man sign
Shaun and Kevin worked on a sign for Shaun’s tribe at Burning Man – POC People of Color.

Shaun used the ShopBot CNC to cut out the POC logo and space for the Arduino Nano.

Final result is a random selection of colors.

Arduino code to randomize the bottom sign and pick 5 random colors for the people in the logo.
/**
* People of Color - Burning Man
*/
#define DATA_PIN (5)
#define CLOCK_PIN (6)
#define LIGHT_COUNT (10)
uint32_t pixels[LIGHT_COUNT];
uint32_t rainbowColor[5];
#define pinModeFast(x, y) pinMode(x, y)
#define digitalWriteFast(x, y) digitalWrite(x, y)
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PINSTAR 9
#define PINPOC 10
#define NUM_LEDSSTAR 60
#define NUM_LEDSPOC 30
#define BRIGHTNESS 50
Adafruit_NeoPixel stripStar = Adafruit_NeoPixel(NUM_LEDSSTAR, PINSTAR, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel stripPOC = Adafruit_NeoPixel(NUM_LEDSPOC, PINPOC , NEO_GRB + NEO_KHZ800);
void setup() {
pinModeFast(DATA_PIN, OUTPUT);
pinModeFast(CLOCK_PIN, OUTPUT);
digitalWriteFast(DATA_PIN, LOW);
digitalWriteFast(CLOCK_PIN, LOW);
stripStar.setBrightness(BRIGHTNESS);
stripStar.begin();
stripStar.show(); // Initialize all pixels to 'off'
stripPOC.setBrightness(BRIGHTNESS);
stripPOC.begin();
stripPOC.show(); // Initialize all pixels to 'off'
setRainbowColors();
}
void setRainbowColors (){
for(int i = 0 ; i < 5 ; i++){
rainbowColor[i] = stripPOC.Color(random(0,255) ,random(0,255),random(0,255));
}
}
int currentPixel = 0;
int currentColor = 0;
uint8_t red(uint32_t c) {
return (c >> 16);
}
uint8_t green(uint32_t c) {
return (c >> 8);
}
uint8_t blue(uint32_t c) {
return (c);
}
void loop() {
setRainbowColors ();
for(int i = 0; i < LIGHT_COUNT; i++){
//solid_color(simple_color(0));
//set_pixel(i,simple_color(currentColor));
set_pixel(i,rainbowColor[ i / 2]);
show();
}
for(int j = 0;j < NUM_LEDSSTAR;j++){
stripStar.setPixelColor(j, rainbowColor[ j / 12]);
stripStar.show();
}
rainbowCycle(5);
}
void fadeColors(int pos){
int redVal, greenVal, blueVal;
}
void colorWipe1(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<stripStar.numPixels(); i++) {
stripStar.setPixelColor(i, c);
stripStar.show();
delay(wait);
}
}
void colorWipe2(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<stripPOC.numPixels(); i++) {
stripPOC.setPixelColor(i, c);
stripPOC.show();
stripPOC.show();
delay(wait);
}
}
static void set_pixel(uint8_t index, uint32_t color) {
pixels[index] = color & 0x00FFFFFF;
}
static void set_pixel_rgb(uint8_t index, uint32_t r, uint32_t g, uint32_t b) {
set_pixel(index, r | (g << 8) | (b << 16));
}
static void toggle_clock() {
digitalWriteFast(CLOCK_PIN, HIGH);
digitalWriteFast(CLOCK_PIN, LOW);
}
static void write_pixel(uint8_t i) {
const uint32_t MASK = ((uint32_t)(1) << 24);
uint32_t p = pixels[i] | MASK;
int j = 25;
while (j--) {
digitalWriteFast(DATA_PIN, (p & MASK) ? HIGH : LOW);
toggle_clock();
p <<= 1;
}
}
static void write_blank_pixel() {
int j = 25;
while (j--) {
digitalWriteFast(DATA_PIN, 0);
toggle_clock();
}
}
static void show() {
digitalWriteFast(DATA_PIN, LOW);
for (int i = 0; i < 50; i++) {
toggle_clock();
}
for (int i = 0; i < LIGHT_COUNT; ++i) {
write_pixel(i);
}
write_blank_pixel();
delay(1);
}
static void solid_color(uint32_t color) {
for (int i = 0; i < LIGHT_COUNT; ++i) {
set_pixel(i, color);
}
}
static uint32_t simple_color(uint8_t color) {
switch (color) {
case 0:
return 0x0000ff00; // Green
case 1:
return 0x00ffff00; // Yellow
case 2:
return 0x00ff0000; // Red
default:
return 0x00000000;
}
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256 * 5; j++) { // 5 cycles of all colors on wheel
for(i=0; i< stripPOC.numPixels(); i++) {
stripPOC.setPixelColor(i, Wheel(((i * 256 / stripPOC.numPixels()) + j) & 255));
}
stripPOC.show();
delay(wait);
}
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return stripPOC.Color(255 - WheelPos * 3, 0, WheelPos * 3,0);
}
if(WheelPos < 170) {
WheelPos -= 85;
return stripPOC.Color(0, WheelPos * 3, 255 - WheelPos * 3,0);
}
WheelPos -= 170;
return stripPOC.Color(WheelPos * 3, 255 - WheelPos * 3, 0,0);
}
static void scroll(int8_t delta) {
size_t bytes_to_move = (LIGHT_COUNT - delta) * sizeof(uint32_t);
if (delta > 0) {
memmove(&pixels[delta], &pixels[0], bytes_to_move);
} else {
memmove(&pixels[0], &pixels[-delta], bytes_to_move);
}
}
static void wipe(uint8_t delay_msec) {
for (int i = 0; i < LIGHT_COUNT; ++i) {
scroll(1);
set_pixel(0, 0);
show();
delay(delay_msec);
}
}
