Created
November 9, 2016 21:20
-
-
Save ednisley/a2cd063dac1d276364a6e72ef9049085 to your computer and use it in GitHub Desktop.
Arduino source code: Color mixing demo for Poughkeepsie Day School Mini Maker Faire
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Color mixing demo for Mini Maker Faire | |
// Ed Nisley - KE4ANU - November 2016 | |
#include <Adafruit_NeoPixel.h> | |
//---------- | |
// Pin assignments | |
#define PIN_NEO 8 // DO - data out to first Neopixel | |
#define PIN_HEARTBEAT 13 // DO - Arduino LED | |
#define PIN_FLASH 9 // DI - flash button | |
#define PIN_POTRED A0 // AI - red potentiometer | |
#define PIN_POTGREEN A1 // AI - green potentiometer | |
#define PIN_POTBLUE A2 // AI - blue potentiometer | |
//---------- | |
// Constants | |
#define PIXELS 4 // number of pixels | |
#define PIXEL_RED 2 // physical channel layout | |
#define PIXEL_GREEN 1 | |
#define PIXEL_BLUE 0 | |
#define PIXEL_MIX (PIXELS - 1) // pixel with mixed color | |
#define PIXEL_FLASH (PIXELS - 1) // pixel that flashes | |
// update LEDs only this many ms apart (minus loop() overhead) | |
#define UPDATEINTERVAL 25ul | |
#define UPDATEMS (UPDATEINTERVAL - 1ul) | |
//---------- | |
// Globals | |
// instantiate the Neopixel buffer array | |
// color order is RGB for 8 mm diffuse LEDs, GRB for mixed 5050 LED at end | |
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXELS, PIN_NEO, NEO_RGB + NEO_KHZ800); | |
uint32_t FullWhite = strip.Color(255,255,255); | |
uint32_t FullOff = strip.Color(0,0,0); | |
// colors in each LED | |
enum pixcolors {RED, GREEN, BLUE, PIXELSIZE}; | |
uint32_t PotColors[PIXELSIZE]; | |
uint32_t UniColor; | |
unsigned long MillisNow; | |
unsigned long MillisThen; | |
//-- Helper routine for printf() | |
int s_putc(char c, FILE *t) { | |
Serial.write(c); | |
} | |
//------------------ | |
// Set the mood | |
void setup() { | |
pinMode(PIN_HEARTBEAT,OUTPUT); | |
digitalWrite(PIN_HEARTBEAT,LOW); // show we arrived | |
Serial.begin(57600); | |
fdevopen(&s_putc,0); // set up serial output for printf() | |
printf("Color Mixer Demo for Mini Maker Faire\r\nEd Nisley - KE4ZNU - November 2016\r\n"); | |
// set up pixels | |
strip.begin(); | |
strip.show(); | |
// lamp test: a brilliant white flash on all pixels | |
// pixel color layout doesn't matter for a white flash | |
printf("Lamp test: flash white\r\n"); | |
for (byte i=0; i<5 ; i++) { | |
for (int j=0; j < strip.numPixels(); j++) { // fill LEDs with white | |
strip.setPixelColor(j,FullWhite); | |
} | |
strip.show(); | |
delay(500); | |
for (int j=0; j < strip.numPixels(); j++) { // fill LEDs with black | |
strip.setPixelColor(j,FullOff); | |
} | |
strip.show(); | |
delay(500); | |
} | |
// lamp test: walk a white flash along the string | |
printf("Lamp test: walking white\r\n"); | |
strip.setPixelColor(0,FullWhite); | |
strip.show(); | |
delay(500); | |
for (int i=1; i<strip.numPixels(); i++) { | |
digitalWrite(PIN_HEARTBEAT,HIGH); | |
strip.setPixelColor(i-1,FullOff); | |
strip.setPixelColor(i,FullWhite); | |
strip.show(); | |
digitalWrite(PIN_HEARTBEAT,LOW); | |
delay(500); | |
} | |
strip.setPixelColor(strip.numPixels() - 1,FullOff); | |
strip.show(); | |
delay(500); | |
MillisNow = MillisThen = millis(); | |
} | |
//------------------ | |
// Run the mood | |
void loop() { | |
MillisNow = millis(); | |
if ((MillisNow - MillisThen) >= UPDATEMS) { // time for color change? | |
digitalWrite(PIN_HEARTBEAT,HIGH); | |
PotColors[RED] = strip.Color(analogRead(PIN_POTRED) >> 2,0,0); | |
PotColors[GREEN] = strip.Color(0,analogRead(PIN_POTGREEN) >> 2,0); | |
PotColors[BLUE] = strip.Color(0,0,analogRead(PIN_POTBLUE) >> 2); | |
strip.setPixelColor(PIXEL_RED,PotColors[RED]); // load up pot indicators | |
strip.setPixelColor(PIXEL_GREEN,PotColors[GREEN]); | |
strip.setPixelColor(PIXEL_BLUE,PotColors[BLUE]); | |
strip.setPixelColor(PIXEL_MIX,strip.getPixelColor(PIXEL_RED) | | |
strip.getPixelColor(PIXEL_GREEN) | | |
strip.getPixelColor(PIXEL_BLUE)); | |
if (PIXEL_FLASH != PIXEL_MIX) { | |
strip.setPixelColor(PIXEL_FLASH,strip.getPixelColor(PIXEL_MIX)); | |
} | |
if (LOW == digitalRead(PIN_FLASH)) { // if flash input active, overlay flash | |
strip.setPixelColor(PIXEL_FLASH,0x00FFFFFF ^ strip.getPixelColor(PIXEL_FLASH)); | |
strip.setPixelColor(PIXEL_RED, 0x00FF0000 ^ strip.getPixelColor(PIXEL_RED)); | |
strip.setPixelColor(PIXEL_GREEN,0x0000FF00 ^ strip.getPixelColor(PIXEL_GREEN)); | |
strip.setPixelColor(PIXEL_BLUE, 0x000000FF ^ strip.getPixelColor(PIXEL_BLUE)); | |
} | |
UniColor = 0x000000ff & strip.getPixelColor(PIXELS - 1); // hack to rearrange colors for 5050 LED | |
UniColor |= 0x00ff0000 & (strip.getPixelColor(PIXELS - 1) << 8); | |
UniColor |= 0x0000ff00 & (strip.getPixelColor(PIXELS - 1) >> 8); | |
strip.setPixelColor(PIXELS - 1,UniColor); | |
strip.show(); // send out colors | |
MillisThen = MillisNow; | |
digitalWrite(PIN_HEARTBEAT,LOW); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
More details on my blog at http://wp.me/poZKh-6ha