323 lines
6.8 KiB
C++
323 lines
6.8 KiB
C++
#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;
|
|
}
|
|
}
|
|
}
|