add arduino project for photobooth rgb led ring+strip controller
This commit is contained in:
parent
07aa7e39ae
commit
2c51f24184
1 changed files with 323 additions and 0 deletions
323
arduino_photobooth/photobooth_neopixel_cancelabledelay.ino
Normal file
323
arduino_photobooth/photobooth_neopixel_cancelabledelay.ino
Normal file
|
@ -0,0 +1,323 @@
|
|||
#include <Adafruit_NeoPixel.h>
|
||||
#define NEO_STRIP_PORT 12
|
||||
#define NEO_RING_PORT 13
|
||||
#define STRIP_LEDS 10
|
||||
#define RING_LEDS 32
|
||||
#define COUNTDOWN 6
|
||||
Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIP_LEDS, NEO_STRIP_PORT, NEO_GRB + NEO_KHZ800);
|
||||
Adafruit_NeoPixel ring = Adafruit_NeoPixel(RING_LEDS, NEO_RING_PORT, NEO_GRB + NEO_KHZ800);
|
||||
int e = 0;
|
||||
int incomingByte = 0;
|
||||
int black = 0;
|
||||
|
||||
boolean cancel = false;
|
||||
|
||||
uint32_t rainbow_lut[6];
|
||||
|
||||
uint32_t red = strip.Color(10, 0, 0);
|
||||
uint32_t yellow = strip.Color(10, 10, 0);
|
||||
uint32_t green = strip.Color(0, 10, 0);
|
||||
uint32_t blue = strip.Color(0, 0, 10);
|
||||
|
||||
uint32_t purple = strip.Color(32, 0, 32);
|
||||
|
||||
uint32_t cyan = strip.Color(0, 32, 32);
|
||||
uint32_t white = strip.Color(32, 32, 32);
|
||||
|
||||
uint32_t bright = strip.Color(255, 255, 255);
|
||||
|
||||
void setup() {
|
||||
strip.begin();
|
||||
strip.show(); // Initialize all pixels to 'off'
|
||||
|
||||
ring.begin();
|
||||
ring.show(); // Initialize all pixels to 'off'
|
||||
|
||||
Serial.begin(115200);
|
||||
|
||||
rainbow_lut [0] = strip.Color(128, 0, 0); // red
|
||||
rainbow_lut [1] = strip.Color(128,40, 0); // orange
|
||||
rainbow_lut [2] = strip.Color(64, 64, 0); // yellow
|
||||
rainbow_lut [3] = strip.Color(0, 128, 0); // green
|
||||
rainbow_lut [4] = strip.Color(0, 0, 128); // blue
|
||||
rainbow_lut [5] = strip.Color(32, 0, 56); // purple
|
||||
|
||||
/*
|
||||
rainbow_lut [0] = strip.Color(255, 0, 0); // red
|
||||
rainbow_lut [1] = strip.Color(255, 80, 0); // orange
|
||||
rainbow_lut [2] = strip.Color(128, 128, 0); // yellow
|
||||
rainbow_lut [3] = strip.Color(0, 255, 0); // green
|
||||
rainbow_lut [4] = strip.Color(0, 0, 255); // blue
|
||||
rainbow_lut [5] = strip.Color(64, 0, 110); // purple
|
||||
*/
|
||||
delay(5);
|
||||
Serial.write("Photobooth-LED ready\r\n");
|
||||
}
|
||||
|
||||
void stripclear() {
|
||||
for (e = 0; e < STRIP_LEDS; e++) {
|
||||
strip.setPixelColor(e, black);
|
||||
}
|
||||
strip.show();
|
||||
}
|
||||
|
||||
void ringclear() {
|
||||
for (e = 0; e < RING_LEDS; e++) {
|
||||
ring.setPixelColor(e, black);
|
||||
}
|
||||
ring.show();
|
||||
}
|
||||
|
||||
void stripincrement() {
|
||||
for (e = 0; e < STRIP_LEDS; e++) {
|
||||
for (int pos = 0; pos < STRIP_LEDS; pos++) {
|
||||
if (pos == e) {
|
||||
strip.setPixelColor(pos, black);
|
||||
}
|
||||
}
|
||||
strip.show();
|
||||
delay(5);
|
||||
}
|
||||
}
|
||||
|
||||
void stripon() {
|
||||
for (e = 0; e < STRIP_LEDS; e++) {
|
||||
if (e % 5 == 0) {
|
||||
strip.setPixelColor(e, purple);
|
||||
}
|
||||
if (e % 5 == 1) {
|
||||
strip.setPixelColor(e, red);
|
||||
}
|
||||
if (e % 5 == 2) {
|
||||
strip.setPixelColor(e, yellow);
|
||||
}
|
||||
if (e % 5 == 3) {
|
||||
strip.setPixelColor(e, green);
|
||||
}
|
||||
if (e % 5 == 4) {
|
||||
strip.setPixelColor(e, cyan);
|
||||
}
|
||||
if (e % 5 == 4) {
|
||||
strip.setPixelColor(e, blue);
|
||||
}
|
||||
//strip.setPixelColor(e,white);
|
||||
}
|
||||
strip.show();
|
||||
}
|
||||
|
||||
void focususer() {
|
||||
ringclear();
|
||||
uint8_t x;
|
||||
uint8_t delay_per_led = (1000 / RING_LEDS) - 2;
|
||||
float leds_per_second = (float) RING_LEDS / (float) COUNTDOWN;
|
||||
uint32_t prev_color;
|
||||
|
||||
/*
|
||||
Serial.print("delay_per_led:");
|
||||
Serial.print(delay_per_led);
|
||||
Serial.print(" leds_per_second");
|
||||
Serial.print(leds_per_second, 4);
|
||||
*/
|
||||
|
||||
for (x = 0; x < COUNTDOWN; x++)
|
||||
{
|
||||
uint8_t start_sector_pos = (uint8_t) ((float)x*leds_per_second);
|
||||
uint8_t end_sector_pos = (uint8_t) (((float)x+1.0)*leds_per_second);
|
||||
|
||||
for (e = start_sector_pos; e < end_sector_pos; e++)
|
||||
{
|
||||
ring.setPixelColor(e, rainbow_lut [x]);
|
||||
}
|
||||
ring.show();
|
||||
|
||||
for (e = 0; e < RING_LEDS; e++)
|
||||
{
|
||||
prev_color = ring.getPixelColor(e);
|
||||
ring.setPixelColor(e, bright);
|
||||
ring.show();
|
||||
cancelableDelay (delay_per_led);
|
||||
ring.setPixelColor(e, prev_color);
|
||||
ring.show();
|
||||
if (cancel)
|
||||
goto do_cancel;
|
||||
}
|
||||
}
|
||||
Serial.write("done\r\n");
|
||||
return;
|
||||
do_cancel:
|
||||
cancelled();
|
||||
}
|
||||
|
||||
void cancelled() {
|
||||
Serial.write("cancelled\r\n");
|
||||
cancel = false;
|
||||
}
|
||||
|
||||
void strip_print(uint8_t copies) {
|
||||
stripclear();
|
||||
uint8_t print_lut[6][3] = {
|
||||
{ 0, 200, 255}, // cyan
|
||||
{255, 0, 220}, // magenta
|
||||
{255, 255, 0}, // yellow
|
||||
{255, 255, 255} // white
|
||||
};
|
||||
|
||||
for (uint8_t i = 1; i <= copies; i++)
|
||||
{
|
||||
Serial.print("\r\ncopy:");
|
||||
Serial.print(i);
|
||||
|
||||
uint8_t max_passes = 8;
|
||||
|
||||
for (uint8_t pass = 1; pass <= max_passes; pass++)
|
||||
{
|
||||
Serial.print("\r\npass:");
|
||||
Serial.print(pass);
|
||||
|
||||
uint8_t start_intensity, end_intensity;
|
||||
int8_t increment;
|
||||
|
||||
if (pass % 2)
|
||||
{
|
||||
start_intensity = 0;
|
||||
end_intensity = 255;
|
||||
increment = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
start_intensity = 255;
|
||||
end_intensity = 0;
|
||||
increment = -1;
|
||||
}
|
||||
for (uint8_t intensity = start_intensity; intensity != end_intensity; intensity += increment)
|
||||
{
|
||||
uint8_t ca[3];
|
||||
for (uint8_t i=0; i<3; i++)
|
||||
{
|
||||
ca[i] = print_lut[(pass-1)/2][i];
|
||||
/* Serial.print("\r\nprint_lut[");
|
||||
Serial.print(pass/2);
|
||||
Serial.print("][");
|
||||
Serial.print(i);
|
||||
Serial.print("]=");
|
||||
Serial.print(ca[i]);*/
|
||||
ca[i] = (uint8_t)((float)ca[i]*intensity/255);
|
||||
// Serial.print("\tca=");
|
||||
// Serial.print(ca[i]);
|
||||
}
|
||||
uint32_t color = strip.Color(ca[0], ca[1], ca[2]);
|
||||
for (e = 0; e < STRIP_LEDS; e++)
|
||||
{
|
||||
strip.setPixelColor(e, color);
|
||||
}
|
||||
strip.show();
|
||||
cancelableDelay(9);
|
||||
if (cancel)
|
||||
goto do_cancel;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (e = 0; e < RING_LEDS; e++) {
|
||||
strip.setPixelColor(e, black);
|
||||
}
|
||||
strip.show();
|
||||
Serial.write("done\r\n");
|
||||
return;
|
||||
|
||||
do_cancel:
|
||||
cancelled();
|
||||
}
|
||||
|
||||
void flash_color() {
|
||||
/* for (e = 0; e < RING_LEDS; e++) {
|
||||
ring.setPixelColor(e, bright);
|
||||
}
|
||||
ring.show();
|
||||
delay(30);
|
||||
*/
|
||||
for (uint8_t i = 0; i < 26; i++)
|
||||
{
|
||||
for (e = 0; e < RING_LEDS; e++) {
|
||||
ring.setPixelColor(e, rainbow_lut [(e+i) % 6]);
|
||||
}
|
||||
ring.show();
|
||||
cancelableDelay(50);
|
||||
if (cancel)
|
||||
goto do_cancel;
|
||||
}
|
||||
delay(30);
|
||||
|
||||
for (e = 0; e < RING_LEDS; e++) {
|
||||
ring.setPixelColor(e, black);
|
||||
}
|
||||
|
||||
ring.show();
|
||||
Serial.write("done\r\n");
|
||||
return;
|
||||
|
||||
do_cancel:
|
||||
cancelled();
|
||||
}
|
||||
|
||||
void flash_white() {
|
||||
for (e = 0; e < RING_LEDS; e++) {
|
||||
ring.setPixelColor(e, white);
|
||||
}
|
||||
ring.show();
|
||||
delay(30);
|
||||
for (e = 0; e < RING_LEDS; e++) {
|
||||
ring.setPixelColor(e, black);
|
||||
}
|
||||
ring.show();
|
||||
}
|
||||
|
||||
void cmdparse() {
|
||||
incomingByte = Serial.read();
|
||||
Serial.write("R");
|
||||
if (incomingByte == 'f') {
|
||||
flash_color();
|
||||
}
|
||||
if (incomingByte == 'c') {
|
||||
focususer();
|
||||
}
|
||||
if (incomingByte == 'o') {
|
||||
stripon();
|
||||
}
|
||||
if (incomingByte == 'b') {
|
||||
ringclear();
|
||||
}
|
||||
if (incomingByte == 't') {
|
||||
ring.setPixelColor(0, ring.Color(10,10,10));
|
||||
ring.show();
|
||||
}
|
||||
|
||||
if (incomingByte == 'p') {
|
||||
int copies = Serial.parseInt();
|
||||
strip_print(copies);
|
||||
}
|
||||
if (incomingByte == 'B') {
|
||||
stripclear();
|
||||
}
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (Serial.available() > 0) {
|
||||
cmdparse();
|
||||
}
|
||||
}
|
||||
|
||||
void cancelableDelay(long duration)
|
||||
{
|
||||
long time = millis();
|
||||
while (!cancel)
|
||||
{
|
||||
if (millis()-time > duration)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (Serial.available() > 0)
|
||||
{
|
||||
cancel = true;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue