Added RGBW support

ifdef-Option may be removed next commit since RGB strips seem to support RGBW protocol
HTMLs have no support yet
&W= works
This commit is contained in:
cschwinne 2017-10-12 17:09:59 +02:00
parent 8a38af0282
commit f878c89069
7 changed files with 59 additions and 16 deletions

View File

@ -228,7 +228,6 @@ void WS2812FX::mode_static(void) {
setPixelColor(i, _color); setPixelColor(i, _color);
} }
show(); show();
_mode_delay = 25; _mode_delay = 25;
} }
@ -1688,24 +1687,40 @@ void WS2812FX::setLedCount(uint16_t i)
void WS2812FX::setPixelColor(uint16_t i, uint32_t c) void WS2812FX::setPixelColor(uint16_t i, uint32_t c)
{ {
#ifdef RGBW
NeoPixelBrightnessBus::SetPixelColor(i, RgbwColor((c>>16) & 0xFF, (c>>8) & 0xFF, (c) & 0xFF, (c>>24) & 0xFF));
#else
NeoPixelBrightnessBus::SetPixelColor(i, RgbColor((c>>16) & 0xFF, (c>>8) & 0xFF, (c) & 0xFF)); NeoPixelBrightnessBus::SetPixelColor(i, RgbColor((c>>16) & 0xFF, (c>>8) & 0xFF, (c) & 0xFF));
#endif
} }
void WS2812FX::setPixelColor(uint16_t i, uint8_t r, uint8_t g, uint8_t b, uint8_t w) void WS2812FX::setPixelColor(uint16_t i, uint8_t r, uint8_t g, uint8_t b, uint8_t w)
{ {
#ifdef RGBW #ifdef RGBW
NeoPixelBrightnessBus::SetPixelColor(i, RgbwColor(r,g,b,w));
#else
NeoPixelBrightnessBus::SetPixelColor(i, RgbColor(r,g,b)); NeoPixelBrightnessBus::SetPixelColor(i, RgbColor(r,g,b));
#endif
} }
void WS2812FX::setPixelColor(uint16_t i, uint8_t r, uint8_t g, uint8_t b) void WS2812FX::setPixelColor(uint16_t i, uint8_t r, uint8_t g, uint8_t b)
{ {
#ifdef RGBW
NeoPixelBrightnessBus::SetPixelColor(i, RgbwColor(r,g,b,0));
#else
NeoPixelBrightnessBus::SetPixelColor(i, RgbColor(r,g,b)); NeoPixelBrightnessBus::SetPixelColor(i, RgbColor(r,g,b));
#endif
} }
uint32_t WS2812FX::getPixelColor(uint16_t i) uint32_t WS2812FX::getPixelColor(uint16_t i)
{ {
return NeoPixelBrightnessBus::GetPixelColor(i).R*65536 + NeoPixelBrightnessBus::GetPixelColor(i).G*256 + NeoPixelBrightnessBus::GetPixelColor(i).B; #ifdef RGBW
RgbwColor lColor = NeoPixelBrightnessBus::GetPixelColor(i);
return lColor.W*16777216 + lColor.R*65536 + lColor.G*256 + lColor.B;
#else
RgbColor lColor = NeoPixelBrightnessBus::GetPixelColor(i);
return lColor.R*65536 + lColor.G*256 + lColor.B;
#endif
} }
void WS2812FX::setBrightness(uint8_t b) void WS2812FX::setBrightness(uint8_t b)
@ -1722,7 +1737,11 @@ void WS2812FX::show()
void WS2812FX::clear() void WS2812FX::clear()
{ {
#ifdef RGBW
NeoPixelBrightnessBus::ClearTo(RgbwColor(0));
#else
NeoPixelBrightnessBus::ClearTo(RgbColor(0)); NeoPixelBrightnessBus::ClearTo(RgbColor(0));
#endif
} }
void WS2812FX::begin() void WS2812FX::begin()

View File

@ -20,7 +20,7 @@
#include "CallbackFunction.h" #include "CallbackFunction.h"
//version in format yymmddb (b = daily build) //version in format yymmddb (b = daily build)
#define VERSION 1709251 #define VERSION 1710120
//uncomment if you have an RGBW strip //uncomment if you have an RGBW strip
#define RGBW #define RGBW
@ -115,14 +115,12 @@ boolean alexaNotify = false;
double transitionResolution = 0.011; double transitionResolution = 0.011;
boolean rgbwEnabled = false;
//Internal vars //Internal vars
byte col[]{0, 0, 0}; byte col[]{0, 0, 0};
byte col_old[]{0, 0, 0}; byte col_old[]{0, 0, 0};
byte col_t[]{0, 0, 0}; byte col_t[]{0, 0, 0};
byte col_it[]{0, 0, 0}; byte col_it[]{0, 0, 0};
byte whiteVal; byte white, white_old, white_t, white_it;
unsigned long transitionStartTime; unsigned long transitionStartTime;
unsigned long nightlightStartTime; unsigned long nightlightStartTime;
float tper_last = 0; float tper_last = 0;

View File

@ -102,7 +102,6 @@ void saveSettingsToEEPROM()
EEPROM.write(369, turnOnAtBoot); EEPROM.write(369, turnOnAtBoot);
EEPROM.write(370, useHSBDefault); EEPROM.write(370, useHSBDefault);
EEPROM.write(371, white_s); EEPROM.write(371, white_s);
EEPROM.write(372, rgbwEnabled);
EEPROM.commit(); EEPROM.commit();
} }
@ -215,6 +214,5 @@ void loadSettingsFromEEPROM()
turnOnAtBoot = EEPROM.read(369); turnOnAtBoot = EEPROM.read(369);
useHSBDefault = EEPROM.read(370); useHSBDefault = EEPROM.read(370);
white_s = EEPROM.read(371); white_s = EEPROM.read(371);
rgbwEnabled = EEPROM.read(372);
useHSB = useHSBDefault; useHSB = useHSBDefault;
} }

View File

@ -34,8 +34,11 @@ void XML_response()
resp = resp + "</fx><sx>"; resp = resp + "</fx><sx>";
resp = resp + effectSpeed; resp = resp + effectSpeed;
resp = resp + "</sx><wv>"; resp = resp + "</sx><wv>";
if (rgbwEnabled) {resp = resp + whiteVal;} #ifdef RGBW
else {resp = resp + "-1";} resp = resp + white;
#else
resp = resp + "-1";
#endif
resp = resp + "</wv><md>"; resp = resp + "</wv><md>";
resp = resp + useHSB; resp = resp + useHSB;
resp = resp + "</md><desc>"; resp = resp + "</md><desc>";
@ -112,7 +115,9 @@ void XML_response_settings()
resp = resp + col_s[i]; resp = resp + col_s[i];
resp = resp + "</cldef>"; resp = resp + "</cldef>";
} }
resp = resp + "<cldfa>"; resp = resp + "<cldfw>";
resp = resp + white_s;
resp = resp + "</cldfw><cldfa>";
resp = resp + bri_s; resp = resp + bri_s;
resp = resp + "</cldfa>"; resp = resp + "</cldfa>";
resp = resp + "<bootn>"; resp = resp + "<bootn>";

View File

@ -130,6 +130,11 @@ void handleSettingsSet()
int i = server.arg("CLDFB").toInt(); int i = server.arg("CLDFB").toInt();
if (i >= 0 && i <= 255) col_s[2] = i; if (i >= 0 && i <= 255) col_s[2] = i;
} }
if (server.hasArg("CLDFW"))
{
int i = server.arg("CLDFW").toInt();
if (i >= 0 && i <= 255) white_s = i;
}
if (server.hasArg("CLDFA")) if (server.hasArg("CLDFA"))
{ {
int i = server.arg("CLDFA").toInt(); int i = server.arg("CLDFA").toInt();
@ -248,6 +253,10 @@ boolean handleSet(String req)
if (pos > 0) { if (pos > 0) {
col[2] = req.substring(pos + 2).toInt(); col[2] = req.substring(pos + 2).toInt();
} }
pos = req.indexOf("W=");
if (pos > 0) {
white = req.substring(pos + 2).toInt();
}
pos = req.indexOf("FX="); pos = req.indexOf("FX=");
if (pos > 0) { if (pos > 0) {
if (effectCurrent != req.substring(pos + 3).toInt()) if (effectCurrent != req.substring(pos + 3).toInt())

View File

@ -25,7 +25,7 @@ void notify(uint8_t callMode)
udpOut[7] = nightlightDelayMins; udpOut[7] = nightlightDelayMins;
udpOut[8] = effectCurrent; udpOut[8] = effectCurrent;
udpOut[9] = effectSpeed; udpOut[9] = effectSpeed;
udpOut[10] = whiteVal; udpOut[10] = white;
IPAddress broadcastIp; IPAddress broadcastIp;
broadcastIp = ~WiFi.subnetMask() | WiFi.gatewayIP(); broadcastIp = ~WiFi.subnetMask() | WiFi.gatewayIP();
@ -47,7 +47,7 @@ void handleNotifications()
col[0] = udpIn[3]; col[0] = udpIn[3];
col[1] = udpIn[4]; col[1] = udpIn[4];
col[2] = udpIn[5]; col[2] = udpIn[5];
whiteVal = udpIn[10]; white = udpIn[10];
if (udpIn[8] != effectCurrent) if (udpIn[8] != effectCurrent)
{ {
effectCurrent = udpIn[8]; effectCurrent = udpIn[8];

View File

@ -12,12 +12,21 @@ void setAllLeds() {
} else { } else {
strip.setBrightness(val); strip.setBrightness(val);
} }
#ifdef RGBW
if (useGammaCorrectionRGB)
{
strip.setColor(gamma8[col_t[0]], gamma8[col_t[1]], gamma8[col_t[2]], gamma8[white_t]);
} else {
strip.setColor(col_t[0], col_t[1], col_t[2], white_t);
}
#else
if (useGammaCorrectionRGB) if (useGammaCorrectionRGB)
{ {
strip.setColor(gamma8[col_t[0]], gamma8[col_t[1]], gamma8[col_t[2]]); strip.setColor(gamma8[col_t[0]], gamma8[col_t[1]], gamma8[col_t[2]]);
} else { } else {
strip.setColor(col_t[0], col_t[1], col_t[2]); strip.setColor(col_t[0], col_t[1], col_t[2]);
} }
#endif
} }
void setLedsStandard() void setLedsStandard()
@ -25,10 +34,12 @@ void setLedsStandard()
col_old[0] = col[0]; col_old[0] = col[0];
col_old[1] = col[1]; col_old[1] = col[1];
col_old[2] = col[2]; col_old[2] = col[2];
white_old = white;
bri_old = bri; bri_old = bri;
col_t[0] = col[0]; col_t[0] = col[0];
col_t[1] = col[1]; col_t[1] = col[1];
col_t[2] = col[2]; col_t[2] = col[2];
white_t = white;
bri_t = bri; bri_t = bri;
setAllLeds(); setAllLeds();
} }
@ -36,7 +47,7 @@ void setLedsStandard()
void colorUpdated(int callMode) void colorUpdated(int callMode)
{ {
//call for notifier -> 0: init 1: direct change 2: button 3: notification 4: nightlight 5: other (no not.) (NN)6: fx changed //call for notifier -> 0: init 1: direct change 2: button 3: notification 4: nightlight 5: other (no not.) (NN)6: fx changed
if (col[0] == col_it[0] && col[1] == col_it[1] && col[2] == col_it[2] && bri == bri_it) if (col[0] == col_it[0] && col[1] == col_it[1] && col[2] == col_it[2] && white == white_it && bri == bri_it)
{ {
if (callMode == 6) notify(6); if (callMode == 6) notify(6);
return; //no change return; //no change
@ -50,6 +61,7 @@ void colorUpdated(int callMode)
col_it[0] = col[0]; col_it[0] = col[0];
col_it[1] = col[1]; col_it[1] = col[1];
col_it[2] = col[2]; col_it[2] = col[2];
white_it = white;
bri_it = bri; bri_it = bri;
if (bri > 0) bri_last = bri; if (bri > 0) bri_last = bri;
notify(callMode); notify(callMode);
@ -60,6 +72,7 @@ void colorUpdated(int callMode)
col_old[0] = col_t[0]; col_old[0] = col_t[0];
col_old[1] = col_t[1]; col_old[1] = col_t[1];
col_old[2] = col_t[2]; col_old[2] = col_t[2];
white_old = white_t;
bri_old = bri_t; bri_old = bri_t;
tper_last = 0; tper_last = 0;
} }
@ -93,6 +106,7 @@ void handleTransitions()
col_t[0] = col_old[0]+((col[0] - col_old[0])*tper); col_t[0] = col_old[0]+((col[0] - col_old[0])*tper);
col_t[1] = col_old[1]+((col[1] - col_old[1])*tper); col_t[1] = col_old[1]+((col[1] - col_old[1])*tper);
col_t[2] = col_old[2]+((col[2] - col_old[2])*tper); col_t[2] = col_old[2]+((col[2] - col_old[2])*tper);
white_t = white_old +((white - white_old )*tper);
bri_t = bri_old +((bri - bri_old )*tper); bri_t = bri_old +((bri - bri_old )*tper);
} }
setAllLeds(); setAllLeds();