Try this. It compiles, but I don't have the hardware to test it on...
#include <Adafruit_NeoPixel.h> // This is the Neo-Pixel library (ws2812)
// Change to the library for your pixel types
// Suggest using a library created by Adafruit
// so the function names will be the same
#define DPIN 11 // Change this to the pin# connected to your pixels DataIn
// Will probably need to define a ClockPin for other pixel
int PixelCount = 100; // Set this to the number of Pixels connected
int bugLevel = 0; // This is just a way I manage turning debugging over serial on/off
const int numChannels = 32;
// List Arduino pins in Channel number order
int channels[numChannels] = {2,3,4,5,6,7,8,9,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45};
/* Sets up the NeoPixel Strip object
Replace with proper Object initiation for your pixel types */
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PixelCount, DPIN, NEO_RGB + NEO_KHZ800);
void setup()
{
delay(0); // A delay for a reason I can't remember. I can live with one in the setup.
strip.begin(); // Get strip started
strip.show(); // Initialize all pixels to 'off'
Serial.begin(38400); // Start the Serial communication
bugit("Setup Complete",10); // DEBUG: Confirm setup is complete
for(uint8_t i = 0; i < numChannels; i++)
{
pinMode(channels[i], OUTPUT);
// Start with lights turned off
digitalWrite(channels[i],0);
}
}
void loop()
{ // START LOOP
bugit("Waiting for Header",10); // DEBUG: Header waiting started
waitForVixenHeader(); // Header check function
bugit("VixStart Triggered",10); // DEBUG: Header found; getting color data
// First 'numChannel' channels are relays
for(uint8_t i = 0; i < numChannels; i++)
{
while (Serial.available() < 1) // Wait for bytes to be received
{
delay(10);
}
digitalWrite(channels[i], Serial.read());
}
// Next 'PixelCount' sets of three channels are pixels
for (int pixCount=0; pixCount<PixelCount;pixCount++) // Do this for as many Pixels defined in PixelCount
{
int RGB[3]; // Create array to hold this pixels RGB value
for (int color = 0;color<3;color++) // For the next 3 incoming bytes
{
while (Serial.available() < 1) // Wait for bytes to be received
{
delay(10);
}
RGB[color] = Serial.read(); // Save this byte to the correct RGB value
} // Repeat until bytes for this pixels RGB value have been recieved
strip.setPixelColor(pixCount,RGB[0],RGB[1],RGB[2]); //Set this pixels new color
} // Repeat untill all pixels have had new RGB value set
strip.show(); // Update the strip and show with new color
// YAY! DO IT AGAIN!
} // END OF LOOP
/**
* FUNC bugit [manages printing of debugging based on debugging level]
* @param String bugstr [string to be be printed]
* @param int blevel [the level at which this debugging should be ignored]
*
*/
int bugit(String bugstr,int blevel)
{
if (blevel < bugLevel)
{
Serial.println(bugstr);
}
}
/**
* I 'borrowed' snippets of this waitForVixenHeader() function from some code I found online
* Can't find the originator now but thank you. It works well.
*
* Based on the original waitForVixenHeader() provided, but does not write beyond the end of the buffer
* Waits forever until it sees the header
*/
void waitForVixenHeader()
{
uint8_t index = 0;
const char *header="VIXStart";
while (true)
{
if (Serial.available() == 0) continue; // Wait until we get a byte from Vixen
if (header[index] != Serial.read())
{
index = 0; // The byte we read doesn't match the 'nth' byte in the header, so start over
}
else
{
index++; // It's a match. 'index' bytes match so far
if (index == 8) return; // All bytes match. We're done. Let whoever called us get on with processing the data
}
}
}
/mike