Grumpy_Mike:
There is no need for neopixel strips here. Generally, lighting requires all the lights in any one area to be the same colour.
There is no requirement, but neopixels are way easier to deal with that MOSFETs for an RGB controller for a newbi.
I am doing this project on a much larger scale right now.
I can control 6 sections of the strip, and some of the sections overloop each other. It is controlled from a single ESP8266. I would recommend using a strip with Data and Clock, because the signal will be a bit more reliable over long distances.
Here is basically what i have:
Arduino Due to control a coldTears touchscreen, which communicates with an on-board ESP8266 via i2c to send data wirelessly to the controller for the LED lights which is in the attic.
The two wireless controllers communicate via MQTT which is using an old android tablet as the server.
On the controller, i have the esp8266, a switching voltage regulator to drop the 12vin to 5v, and a level shifter to boost the 3.3v signals from the esp to 5v.
becase code snippets are fun:
Here is the where my zone processing takes place (determin which zones should be on, which zones should be off, and which segments to turn on or off)
void refreshLEDS() {
switch (zoneJustSetup) {
case 1: //all segments on
{
TelnetClient.println("zone 1");
zonesOn[1] = 1; zonesOn[2] = 0; zonesOn[3] = 0; zonesOn[4] = 0; zonesOn[5] = 0; zonesOn[6] = 0; zonesOn[7] = 0;
break;
}
case 2: // back row on
{
TelnetClient.println("zone 2");
zonesOn[1] = 0; zonesOn[2] = 1; zonesOn[3] = 0; zonesOn[4] = 3; zonesOn[5] = 0; zonesOn[6] = 3; zonesOn[7] = 0;
break;
}
case 3: // center box on
{
zonesOn[1] = 0; zonesOn[2] = 0; zonesOn[3] = 1; zonesOn[4] = 3; zonesOn[5] = 3; zonesOn[6] = 3; zonesOn[7] = 3;
SegmentsOn[0] = 3; SegmentsOn[1] = 3; SegmentsOn[2] = 3; SegmentsOn[3] = 3; SegmentsOn[4] = 1; SegmentsOn[5] = 1; SegmentsOn[6] = 1; SegmentsOn[7] = 1; SegmentsOn[8] = 3;
break;
}
case 4: // front box on
{
zonesOn[1] = 0; zonesOn[2] = 3; zonesOn[3] = 3; zonesOn[4] = 1; zonesOn[5] = 0; zonesOn[6] = 0; zonesOn[7] = 0;
break;
}
case 5: //all sides on
{
zonesOn[1] = 0; zonesOn[2] = 0; zonesOn[3] = 3; zonesOn[4] = 0; zonesOn[5] = 1; zonesOn[6] = 0; zonesOn[7] = 0;
SegmentsOn[0] = 1; SegmentsOn[1] = 1; SegmentsOn[2] = 1; SegmentsOn[3] = 1; SegmentsOn[4] = 3; SegmentsOn[5] = 3; SegmentsOn[6] = 3; SegmentsOn[7] = 3; SegmentsOn[8] = 1;
break;
}
case 6: //the peak on
{
zonesOn[1] = 0; zonesOn[2] = 3; zonesOn[3] = 3; zonesOn[4] = 0; zonesOn[5] = 0; zonesOn[6] = 1; zonesOn[7] = 3;
break;
}
case 7: //just thesides on
{
zonesOn[1] = 0; zonesOn[2] = 0; zonesOn[3] = 3; zonesOn[4] = 0; zonesOn[5] = 0; zonesOn[6] = 3; zonesOn[7] = 1;
break;
}
default:
{
TelnetClient.print("RefreshLEDS ERROR");
break;
}
}
for (int i = 0; i < 9; i++) {
SegmentsOn[i] = 0;
}
if (zonesOn[1] == 1) {
SegmentsOn[0] = 1; SegmentsOn[1] = 1; SegmentsOn[2] = 1; SegmentsOn[3] = 1; SegmentsOn[4] = 1; SegmentsOn[5] = 1; SegmentsOn[6] = 1; SegmentsOn[7] = 1; SegmentsOn[8] = 1;
}
if (zonesOn[2] == 1) {
SegmentsOn[0] = 1; SegmentsOn[7] = 1; SegmentsOn[8] = 1;
}
if (zonesOn[3] == 1) {
SegmentsOn[4] = 1; SegmentsOn[5] = 1; SegmentsOn[6] = 1; SegmentsOn[7] = 1;
}
if (zonesOn[4] == 1) {
SegmentsOn[1] = 1; SegmentsOn[2] = 1; SegmentsOn[3] = 1;
}
if (zonesOn[5] == 1) {
SegmentsOn[0] = 1; SegmentsOn[1] = 1; SegmentsOn[2] = 1; SegmentsOn[3] = 1; SegmentsOn[8] = 1;
}
if (zonesOn[6] == 1) {
SegmentsOn[2] = 1;
}
if (zonesOn[7] == 1) {
SegmentsOn[0] = 1; SegmentsOn[1] = 1; SegmentsOn[3] = 1; SegmentsOn[8] = 1;
}
for(int i=0; i < 9; i++){
if(SegmentsOn[i] == 1){
}
if(SegmentsOn[i] == 0){
for(int j = 0; j < segmentSizeAry[i]; j++){
leds[segments[i][j]] = 0;
}
}
}
turnLEDSon();
}
void turnLEDSon() {
if (zonesOn[1] == 1 && zone1Array[zisON] == 1) {
isOn[1] = 1;
}
else if (zonesOn[1] == 0 || zone1Array[zisON] == 0) {
isOn[1] = 0;
}
if (zonesOn[2] == 1 && zone2Array[zisON] == 1) {
isOn[2] = 1;
}
else if (zonesOn[2] == 0 || zone2Array[zisON] == 0) {
isOn[2] = 0;
}
if (zonesOn[3] == 1 && zone3Array[zisON] == 1) {
isOn[3] = 1;
}
else if (zonesOn[3] == 0 || zone3Array[zisON] == 0) {
isOn[3] = 0;
}
if (zonesOn[4] == 1 && zone4Array[zisON] == 1) {
isOn[4] = 1;
}
else if (zonesOn[4] == 0 || zone4Array[zisON] == 0) {
isOn[4] = 0;
}
if (zonesOn[5] == 1 && zone5Array[zisON] == 1) {
isOn[5] = 1;
}
else if (zonesOn[5] == 0 || zone5Array[zisON] == 0) {
isOn[5] = 0;
}
if (zonesOn[6] == 1 && zone6Array[zisON] == 1) {
isOn[6] = 1;
}
else if (zonesOn[6] == 0 || zone6Array[zisON] == 0) {
isOn[6] = 0;
}
if (zonesOn[7] == 1 && zone7Array[zisON] == 1) {
isOn[7] = 1;
}
else if (zonesOn[7] == 0 || zone7Array[zisON] == 0) {
isOn[7] = 0;
}
for(int i = 0; i < 7; i++){
if (isOn[i] == 1) {
zonefill(i);
}
}
}
void zonefill(byte SelectedZone) {
byte FillProgram;
byte RGBr;
byte RGBg;
byte RGBb;
byte Speed;
byte DimmingV;
//TelnetClient.print("Filling Zone: ");
// TelnetClient.println(SelectedZone);
switch (SelectedZone) {
case 1:
{
FillProgram = zone1Array[0];
RGBr = zone1Array[1];
RGBg = zone1Array[2];
RGBb = zone1Array[3];
DimmingV = zone1Array[4];
Speed = zone1Array[5];
programsArray[FillProgram](RGBr, RGBg, RGBb, DimmingV, Speed, SelectedZone);
break;
}
case 2:
{
FillProgram = zone2Array[0];
RGBr = zone2Array[1];
RGBg = zone2Array[2];
RGBb = zone2Array[3];
DimmingV = zone2Array[4];
Speed = zone2Array[5];
programsArray[FillProgram](RGBr, RGBg, RGBb, DimmingV, Speed, SelectedZone);
break;
}
case 3:
{
FillProgram = zone3Array[0];
RGBr = zone3Array[1];
RGBg = zone3Array[2];
RGBb = zone3Array[3];
DimmingV = zone3Array[4];
Speed = zone3Array[5];
programsArray[FillProgram](RGBr, RGBg, RGBb, DimmingV, Speed, SelectedZone);
break;
}
case 4:
{
FillProgram = zone4Array[0];
RGBr = zone4Array[1];
RGBg = zone4Array[2];
RGBb = zone4Array[3];
DimmingV = zone4Array[4];
Speed = zone4Array[5];
programsArray[FillProgram](RGBr, RGBg, RGBb, DimmingV, Speed, SelectedZone);
break;
}
case 5:
{
FillProgram = zone5Array[0];
RGBr = zone5Array[1];
RGBg = zone5Array[2];
RGBb = zone5Array[3];
DimmingV = zone5Array[4];
Speed = zone5Array[5];
programsArray[FillProgram](RGBr, RGBg, RGBb, DimmingV, Speed, SelectedZone);
break;
}
case 6:
{
FillProgram = zone6Array[0];
RGBr = zone6Array[1];
RGBg = zone6Array[2];
RGBb = zone6Array[3];
DimmingV = zone6Array[4];
Speed = zone6Array[5];
programsArray[FillProgram](RGBr, RGBg, RGBb, DimmingV, Speed, SelectedZone);
break;
}
case 7:
{
FillProgram = zone7Array[0];
RGBr = zone7Array[1];
RGBg = zone7Array[2];
RGBb = zone7Array[3];
DimmingV = zone7Array[4];
Speed = zone7Array[5];
programsArray[FillProgram](RGBr, RGBg, RGBb, DimmingV, Speed, SelectedZone);
break;
}
}
}
void ledOverrides() {
if (turnLEDSoff == 1) {
for (int i = 0; i < 512; i++) {
leds[i].setHSV(0, 0, 0);
}
}
}
But, it won't work on an arduino, because it requires a massive amount of SRAM..