Arduino and pixels V1
Jump to navigation
Jump to search
This is untested code. Awaiting feedback. Serial may not support this many pixels at 115200.
// Basic Vixen "generic" serial
// - Setup a generic serial controller to use this sketch
#include <FastLED.h> //include the FastLED library in the Arduino project
#define LED_PIN1 2 //for first arc strip of 100 LEDs, pin 2 on the MEGA
#define LED_PIN2 3 //for second arc strip of 100 LEDs, pin 3 on the MEGA
#define LED_PIN3 4 //for third arc strip of 100 LEDs, pin 4 on the MEGA
#define LED_PIN4 5 //for fourth arc strip of 100 LEDs, pin 5 on the MEGA
#define LED_PIN5 6 //for fifth arc strip of 100 LEDs, pin 6 on the MEGA
// Vixen information
// speed for the com port for talking with player
const long BAUD_RATE = 115200L;
#define NUM_LEDS 100
// Generic Serial controller config - must be present, must match controller setup
const int CONTROLLER_HEADER[3] = {33, 34, 35}; // This is character !"# (hard to replicate in sequencer)
#define GRB_ORDER GRB //pixel strips is set to use GRB color codes
// these are program variables we need to use in multiple places
const int SIZE_OF_HEADER = sizeof(CONTROLLER_HEADER) / sizeof(int); // no need to change
#define LED_TYPE WS2811 //type of LED
//create arrays to hold the FastLED CRBG code for each of the 50 pixels in the:
CRGB leds1[NUM_LEDS]; //first arc.
CRGB leds2[NUM_LEDS]; //second arc.
CRGB leds3[NUM_LEDS]; //third arc.
CRGB leds4[NUM_LEDS]; //fourth arc.
CRGB leds5[NUM_LEDS]; //fifth arc.
int g; //a variable for loop section
void setup() {
delay(1000);
Serial.begin(BAUD_RATE);
pinMode(LED_PIN1, OUTPUT); //set pins to output. PIN1 is pin 2 on the Arduino board.
pinMode(LED_PIN2, OUTPUT);
pinMode(LED_PIN3, OUTPUT);
pinMode(LED_PIN4, OUTPUT);
pinMode(LED_PIN5, OUTPUT);
////Set up the pixel strips to run using FastLED
FastLED.addLeds<LED_TYPE, LED_PIN1, GRB_ORDER>(leds1, NUM_LEDS).setCorrection(TypicalLEDStrip); //for the first arc
FastLED.addLeds<LED_TYPE, LED_PIN2, GRB_ORDER>(leds2, NUM_LEDS).setCorrection(TypicalLEDStrip); //for the second arc
FastLED.addLeds<LED_TYPE, LED_PIN3, GRB_ORDER>(leds3, NUM_LEDS).setCorrection(TypicalLEDStrip); //for the third arc
FastLED.addLeds<LED_TYPE, LED_PIN4, GRB_ORDER>(leds4, NUM_LEDS).setCorrection(TypicalLEDStrip); //for the fourth arc
FastLED.addLeds<LED_TYPE, LED_PIN5, GRB_ORDER>(leds5, NUM_LEDS).setCorrection(TypicalLEDStrip); //for the fifth arc
powerOnSelfTest(); // watch your lights to make sure they are all going on in order
}
void loop() {
if (Serial.available() > 0) {
waitForControllerHeader(CONTROLLER_HEADER);
readSequenceData();
FastLED.show(); //then we tell FastLED to show the pixels!
}
}
void readSequenceData()
{
// We assume that since we found the header, we can just read the rest of the bytes
for (g = 0; g < NUM_LEDS; g++) {
Serial.readBytes( ( char*)(&leds1[g]), 3);
}
for (g = 0; g < NUM_LEDS; g++) { //then we read the next 300 bytes for the second arc of LEDs
Serial.readBytes( ( char*)(&leds2[g]), 3);
}
for (g = 0; g < NUM_LEDS; g++) { //then we read the next 300 bytes for the third arc of LEDs
Serial.readBytes( ( char*)(&leds3[g]), 3);
}
for (g = 0; g < NUM_LEDS; g++) { //then we read the next 300 bytes for the fourth arc of LEDs
Serial.readBytes( ( char*)(&leds4[g]), 3);
}
for (g = 0; g < NUM_LEDS; g++) { //then we read the next 300 bytes for the fifth arc of LEDs
Serial.readBytes( ( char*)(&leds5[g]), 3);
}
}
void waitForControllerHeader(int header[])
{
for (int i = 0; i < SIZE_OF_HEADER; i++) {
// wait for serial available
while (!Serial.available()) {}
// Check the byte until it matches the CONTROLLER_HEADER byte
int inByte = Serial.read();
if (inByte != CONTROLLER_HEADER[i]) {
i = -1; // wrong data set to "zero"
}
}
// found the header!
}
// powerOnSelfTest - does a couple of checks to make sure everything turns on and off
// - watch your lights, they should go on in order
void powerOnSelfTest()
{
// Let's test if all the pixels work.
// This will be too fast for real discernment but they should all be on at end of this
FastLED.clear();
for (int channelIndex = 0; channelIndex < NUM_LEDS; channelIndex++) {
leds1[channelIndex] = CRGB::Red;
FastLED.show();
}
delay(500);
for (int channelIndex = 0; channelIndex < NUM_LEDS; channelIndex++) {
leds2[channelIndex] = CRGB::Red;
FastLED.show();
}
delay(500);
for (int channelIndex = 0; channelIndex < NUM_LEDS; channelIndex++) {
leds3[channelIndex] = CRGB::Red;
FastLED.show();
}
delay(500);
for (int channelIndex = 0; channelIndex < NUM_LEDS; channelIndex++) {
leds4[channelIndex] = CRGB::Red;
FastLED.show();
}
delay(500);
for (int channelIndex = 0; channelIndex < NUM_LEDS; channelIndex++) {
leds5[channelIndex] = CRGB::Red;
FastLED.show();
}
delay(2000); // slight pause to check all on
FastLED.clear();
FastLED.show();
}