Added Auto Brightness Limiter and power calculation
This commit is contained in:
parent
5489c74986
commit
ff46e6ea86
@ -59,7 +59,6 @@ void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst)
|
|||||||
_segments[0].stop = _length -1;
|
_segments[0].stop = _length -1;
|
||||||
unlockAll();
|
unlockAll();
|
||||||
setBrightness(_brightness);
|
setBrightness(_brightness);
|
||||||
show();
|
|
||||||
_running = true;
|
_running = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,13 +126,13 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
|
|||||||
byte o = 10*i;
|
byte o = 10*i;
|
||||||
if (_cronixieBacklightEnabled && _cronixieDigits[i] <11)
|
if (_cronixieBacklightEnabled && _cronixieDigits[i] <11)
|
||||||
{
|
{
|
||||||
byte rCorr = (int)(((double)((_segments[0].colors[1]>>16) & 0xFF))*_cronixieSecMultiplier);
|
byte r2 = (_segments[0].colors[1] >>16) & 0xFF;
|
||||||
byte gCorr = (int)(((double)((_segments[0].colors[1]>>8) & 0xFF))*_cronixieSecMultiplier);
|
byte g2 = (_segments[0].colors[1] >> 8) & 0xFF;
|
||||||
byte bCorr = (int)(((double)((_segments[0].colors[1]) & 0xFF))*_cronixieSecMultiplier);
|
byte b2 = (_segments[0].colors[1] ) & 0xFF;
|
||||||
byte wCorr = (int)(((double)((_segments[0].colors[1]>>24) & 0xFF))*_cronixieSecMultiplier);
|
byte w2 = (_segments[0].colors[1] >>24) & 0xFF;
|
||||||
for (int j=o; j< o+19; j++)
|
for (int j=o; j< o+19; j++)
|
||||||
{
|
{
|
||||||
bus->SetPixelColor((_skipFirstMode)?j+1:j,RgbwColor(rCorr,gCorr,bCorr,wCorr));
|
bus->SetPixelColor((_skipFirstMode)?j+1:j,RgbwColor(r2,g2,b2,w2));
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
@ -182,7 +181,75 @@ void WS2812FX::setCronixieDigits(byte d[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//DISCLAIMER
|
||||||
|
//The following function attemps to calculate the current LED power usage,
|
||||||
|
//and will limit the brightness to stay below a set amperage threshold.
|
||||||
|
//It is NOT a measurement and NOT guaranteed to stay within the ablMilliampsMax margin.
|
||||||
|
//Stay safe with high amperage and have a reasonable safety margin!
|
||||||
|
//I am NOT to be held liable for burned down garages!
|
||||||
|
|
||||||
|
//fine tune power estimation constants for your setup
|
||||||
|
#define PU_PER_MA 3600 //power units per milliamperere for accurate power estimation
|
||||||
|
//formula: 195075 divided by mA per fully lit LED, here ~54mA)
|
||||||
|
//lowering the value increases the estimated usage and therefore makes the ABL more aggressive
|
||||||
|
|
||||||
|
#define MA_FOR_ESP 100 //how much mA does the ESP use (Wemos D1 about 80mA, ESP32 about 120mA)
|
||||||
|
//you can set it to 0 if the ESP is powered by USB and the LEDs by external
|
||||||
|
|
||||||
void WS2812FX::show(void) {
|
void WS2812FX::show(void) {
|
||||||
|
//power limit calculation
|
||||||
|
//each LED can draw up 195075 "power units" (approx. 53mA)
|
||||||
|
//one PU is the power it takes to have 1 channel 1 step brighter per brightness step
|
||||||
|
//so A=2,R=255,G=0,B=0 would use 510 PU per LED (1mA is about 3700 PU)
|
||||||
|
|
||||||
|
if (ablMilliampsMax > 149 && ablMilliampsMax < 65000) //lower numbers and 65000 turn off calculation
|
||||||
|
{
|
||||||
|
uint32_t powerBudget = (ablMilliampsMax - MA_FOR_ESP) * PU_PER_MA; //100mA for ESP power
|
||||||
|
if (powerBudget > PU_PER_MA * _length) //each LED uses about 1mA in standby, exclude that from power budget
|
||||||
|
{
|
||||||
|
powerBudget -= PU_PER_MA * _length;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
powerBudget = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t powerSum = 0;
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < _length; i++) //sum up the usage of each LED
|
||||||
|
{
|
||||||
|
RgbwColor c = bus->GetPixelColorRgbw(i);
|
||||||
|
powerSum += (c.R + c.G + c.B + c.W);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_rgbwMode) //RGBW led total output with white LEDs enabled is still 50mA, so each channel uses less
|
||||||
|
{
|
||||||
|
powerSum *= 3;
|
||||||
|
powerSum >> 2; //same as /= 4
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t powerSum0 = powerSum;
|
||||||
|
powerSum *= _brightness;
|
||||||
|
|
||||||
|
if (powerSum > powerBudget) //scale brightness down to stay in current limit
|
||||||
|
{
|
||||||
|
float scale = (float)powerBudget / (float)powerSum;
|
||||||
|
uint16_t scaleI = scale * 255;
|
||||||
|
uint8_t scaleB = (scaleI > 255) ? 255 : scaleI;
|
||||||
|
uint8_t newBri = scale8(_brightness, scaleB);
|
||||||
|
bus->SetBrightness(newBri);
|
||||||
|
currentMilliamps = (powerSum0 * newBri) / PU_PER_MA;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
currentMilliamps = powerSum / PU_PER_MA;
|
||||||
|
bus->SetBrightness(_brightness);
|
||||||
|
}
|
||||||
|
currentMilliamps += MA_FOR_ESP; //add power of ESP back to estimate
|
||||||
|
currentMilliamps += _length; //add standby power back to estimate
|
||||||
|
} else {
|
||||||
|
currentMilliamps = 0;
|
||||||
|
}
|
||||||
|
|
||||||
bus->Show();
|
bus->Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,7 +304,6 @@ void WS2812FX::setColor(uint32_t c) {
|
|||||||
|
|
||||||
void WS2812FX::setSecondaryColor(uint32_t c) {
|
void WS2812FX::setSecondaryColor(uint32_t c) {
|
||||||
_segments[0].colors[1] = c;
|
_segments[0].colors[1] = c;
|
||||||
if (_cronixieMode) _cronixieSecMultiplier = getSafePowerMultiplier(900, 100, c, _brightness);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WS2812FX::setBrightness(uint8_t b) {
|
void WS2812FX::setBrightness(uint8_t b) {
|
||||||
@ -442,33 +508,6 @@ uint32_t WS2812FX::color_blend(uint32_t color1, uint32_t color2, uint8_t blend)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double WS2812FX::getPowerEstimate(uint16_t leds, uint32_t c, byte b)
|
|
||||||
{
|
|
||||||
double _mARequired = 100; //ESP power
|
|
||||||
double _mul = (double)b/255;
|
|
||||||
double _sum = ((c & 0xFF000000) >> 24) + ((c & 0x00FF0000) >> 16) + ((c & 0x0000FF00) >> 8) + ((c & 0x000000FF) >> 0);
|
|
||||||
_sum /= (_rgbwMode)?1024:768;
|
|
||||||
double _mAPerLed = 50*(_mul*_sum);
|
|
||||||
_mARequired += leds*_mAPerLed;
|
|
||||||
return _mARequired;
|
|
||||||
}
|
|
||||||
|
|
||||||
//DISCLAIMER
|
|
||||||
//This is just a helper function for huge amounts of LEDs.
|
|
||||||
//It is NOT guaranteed to stay within the safeAmps margin.
|
|
||||||
//Stay safe with high amperage and have a reasonable safety margin!
|
|
||||||
//I am NOT to be held liable for burned down garages!
|
|
||||||
double WS2812FX::getSafePowerMultiplier(double safeMilliAmps, uint16_t leds, uint32_t c, byte b)
|
|
||||||
{
|
|
||||||
double _mARequired = getPowerEstimate(leds,c,b);
|
|
||||||
if (_mARequired > safeMilliAmps)
|
|
||||||
{
|
|
||||||
return safeMilliAmps/_mARequired;
|
|
||||||
}
|
|
||||||
return 1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* #####################################################
|
/* #####################################################
|
||||||
#
|
#
|
||||||
# Color and Blinken Functions
|
# Color and Blinken Functions
|
||||||
|
@ -289,6 +289,8 @@ class WS2812FX {
|
|||||||
colorOrder = 0;
|
colorOrder = 0;
|
||||||
paletteFade = 0;
|
paletteFade = 0;
|
||||||
paletteBlend = 0;
|
paletteBlend = 0;
|
||||||
|
ablMilliampsMax = 750;
|
||||||
|
currentMilliamps = 0;
|
||||||
_locked = NULL;
|
_locked = NULL;
|
||||||
_cronixieDigits = new byte[6];
|
_cronixieDigits = new byte[6];
|
||||||
bus = new NeoPixelWrapper();
|
bus = new NeoPixelWrapper();
|
||||||
@ -352,10 +354,6 @@ class WS2812FX {
|
|||||||
getPixelColor(uint16_t),
|
getPixelColor(uint16_t),
|
||||||
getColor(void);
|
getColor(void);
|
||||||
|
|
||||||
double
|
|
||||||
getPowerEstimate(uint16_t leds, uint32_t c, byte b),
|
|
||||||
getSafePowerMultiplier(double safeMilliAmps, uint16_t leds, uint32_t c, byte b);
|
|
||||||
|
|
||||||
WS2812FX::Segment
|
WS2812FX::Segment
|
||||||
getSegment(void);
|
getSegment(void);
|
||||||
|
|
||||||
@ -367,6 +365,8 @@ class WS2812FX {
|
|||||||
|
|
||||||
// mode helper functions
|
// mode helper functions
|
||||||
uint16_t
|
uint16_t
|
||||||
|
ablMilliampsMax,
|
||||||
|
currentMilliamps,
|
||||||
blink(uint32_t, uint32_t, bool strobe, bool),
|
blink(uint32_t, uint32_t, bool strobe, bool),
|
||||||
color_wipe(uint32_t, uint32_t, bool , bool),
|
color_wipe(uint32_t, uint32_t, bool , bool),
|
||||||
scan(bool),
|
scan(bool),
|
||||||
@ -473,9 +473,6 @@ class WS2812FX {
|
|||||||
void handle_palette(void);
|
void handle_palette(void);
|
||||||
bool modeUsesLock(uint8_t);
|
bool modeUsesLock(uint8_t);
|
||||||
|
|
||||||
double
|
|
||||||
_cronixieSecMultiplier;
|
|
||||||
|
|
||||||
boolean
|
boolean
|
||||||
_running,
|
_running,
|
||||||
_rgbwMode,
|
_rgbwMode,
|
||||||
|
Binary file not shown.
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
//common CSS of settings pages
|
//common CSS of settings pages
|
||||||
const char PAGE_settingsCss[] PROGMEM = R"=====(
|
const char PAGE_settingsCss[] PROGMEM = R"=====(
|
||||||
body{font-family:var(--cFn),sans-serif;text-align:center;background:var(--cCol);color:var(--tCol);line-height:200%;margin:0;background-attachment:fixed}hr{border-color:var(--dCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}button{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.3ch solid var(--bCol);display:inline-block;filter:drop-shadow(-5px -5px 5px var(--sCol));font-size:20px;margin:8px;margin-top:12px}.helpB{text-align:left;position:absolute;width:60px}input{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.5ch solid var(--bCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}input[type=number]{width:3em}select{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:0.5ch solid var(--bCol);filter:drop-shadow( -5px -5px 5px var(--sCol) );}</style>
|
body{font-family:var(--cFn),sans-serif;text-align:center;background:var(--cCol);color:var(--tCol);line-height:200%;margin:0;background-attachment:fixed}hr{border-color:var(--dCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}button{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.3ch solid var(--bCol);display:inline-block;filter:drop-shadow(-5px -5px 5px var(--sCol));font-size:20px;margin:8px;margin-top:12px}.helpB{text-align:left;position:absolute;width:60px}input{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:.5ch solid var(--bCol);filter:drop-shadow(-5px -5px 5px var(--sCol))}input[type=number]{width:4em}select{background:var(--bCol);color:var(--tCol);font-family:var(--cFn),sans-serif;border:0.5ch solid var(--bCol);filter:drop-shadow( -5px -5px 5px var(--sCol) );}</style>
|
||||||
)=====";
|
)=====";
|
||||||
|
|
||||||
|
|
||||||
@ -84,50 +84,62 @@ AP IP: <span class="sip"> Not active </span><hr>
|
|||||||
const char PAGE_settings_leds0[] PROGMEM = R"=====(
|
const char PAGE_settings_leds0[] PROGMEM = R"=====(
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html><head>
|
<html><head>
|
||||||
<title>LED Settings</title><script>function H(){window.open("https://github.com/Aircoookie/WLED/wiki/Settings#led-settings");}function B(){window.history.back();}function GetV(){var d = document;
|
<title>LED Settings</title><script>function H(){window.open("https://github.com/Aircoookie/WLED/wiki/Settings#led-settings");}function B(){window.history.back();}function S(){GetV();UI();}function UI(){
|
||||||
|
var myC=document.querySelectorAll('.wc'),l=myC.length;
|
||||||
|
for (i = 0; i < l; i++){myC[i].style.display=(document.getElementById('rgbw').checked)?'inline':'none';}
|
||||||
|
var val=Math.ceil((100+document.Sf.LC.value*55)/500)/2;
|
||||||
|
val=(val>5)?Math.ceil(val):val;var s="";
|
||||||
|
if (val<1.1){s="ESP 5V pin with 1A USB supply";}else{s="External 5V ";s+=val;s+="A supply connected to LEDs";}
|
||||||
|
document.getElementById('psu').innerHTML=s;document.getElementById('ps2').innerHTML=val+"A = "+val*1000;
|
||||||
|
}function GetV(){var d = document;
|
||||||
)=====";
|
)=====";
|
||||||
|
|
||||||
const char PAGE_settings_leds1[] PROGMEM = R"=====(
|
const char PAGE_settings_leds1[] PROGMEM = R"=====(
|
||||||
</head>
|
</head>
|
||||||
<body onload="GetV()">
|
<body onload="S()">
|
||||||
<form id="form_s" name="Sf" method="post">
|
<form id="form_s" name="Sf" method="post">
|
||||||
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
||||||
<button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr>
|
<button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr>
|
||||||
<h2>LED setup</h2>
|
<h2>LED setup</h2>
|
||||||
LED count: <input name="LC" type="number" min="1" max="1200" required><br>
|
LED count: <input name="LC" type="number" min="1" max="1200" oninput=UI() required><br>
|
||||||
LEDs are 4-channel type (RGBW): <input type="checkbox" name="EW"><br>
|
<i>Recommended power supply for brightest white:</i><br>
|
||||||
|
<b><span id="psu">?</span></b><br><br>
|
||||||
|
Maximum Current: <input name="MA" type="number" min="250" max="65000" required> mA<br>
|
||||||
|
<i>Automatically limits brightness to stay close to the limit.<br>
|
||||||
|
Keep at under 1A if powering LEDs directly from the ESP 5V pin!<br>
|
||||||
|
If you are using an external 5V supply, enter its rating.<br>
|
||||||
|
"65000" completely diasbles the power calculation.<br>
|
||||||
|
(Current estimated usage: <span class="pow">unknown</span>)</i><br><br>
|
||||||
|
LEDs are 4-channel type (RGBW): <input type="checkbox" name="EW" onchange=UI() id="rgbw"><br>
|
||||||
Color order:
|
Color order:
|
||||||
<select name="CO">
|
<select name="CO">
|
||||||
<option value="0">GRB</option>
|
<option value="0">GRB</option>
|
||||||
<option value="1">RGB</option>
|
<option value="1">RGB</option>
|
||||||
<option value="2">BRG</option>
|
<option value="2">BRG</option>
|
||||||
<option value="3">RBG</option>
|
<option value="3">RBG</option></select>
|
||||||
</select><br>
|
<h3>Defaults</h3>
|
||||||
<br>
|
Turn LEDs on after power up/reset: <input type="checkbox" name="BO"><br><br>
|
||||||
Apply preset <input name="BP" type="number" min="0" max="25" required> at boot (0 uses defaults)<br>
|
|
||||||
Turn on after power up/reset: <input type="checkbox" name="BO"><br>
|
|
||||||
<br>
|
|
||||||
Default RGB color:
|
Default RGB color:
|
||||||
<input name="CR" type="number" min="0" max="255" required>
|
<input name="CR" type="number" min="0" max="255" required>
|
||||||
<input name="CG" type="number" min="0" max="255" required>
|
<input name="CG" type="number" min="0" max="255" required>
|
||||||
<input name="CB" type="number" min="0" max="255" required><br>
|
<input name="CB" type="number" min="0" max="255" required><br>
|
||||||
Default white value (only RGBW): <input name="CW" type="number" min="0" max="255" required><br>
|
<span class="wc">Default white value: <input name="CW" type="number" min="0" max="255" required><br>
|
||||||
Auto-calculate white from RGB instead: <input type="checkbox" name="AW"><br>
|
Auto-calculate white from RGB instead: <input type="checkbox" name="AW"><br></span>
|
||||||
Default brightness: <input name="CA" type="number" min="0" max="255" required> (0-255)<br>
|
Default brightness: <input name="CA" type="number" min="0" max="255" required> (0-255)<br>
|
||||||
Default effect ID: <input name="FX" type="number" min="0" max="57" required><br>
|
Default effect ID: <input name="FX" type="number" min="0" max="57" required><br>
|
||||||
Default effect speed: <input name="SX" type="number" min="0" max="255" required><br>
|
Default effect speed: <input name="SX" type="number" min="0" max="255" required><br>
|
||||||
Default effect intensity: <input name="IX" type="number" min="0" max="255" required><br>
|
Default effect intensity: <input name="IX" type="number" min="0" max="255" required><br>
|
||||||
Default effect palette: <input name="FP" type="number" min="0" max="255" required><br>
|
Default effect palette: <input name="FP" type="number" min="0" max="255" required><br>
|
||||||
Default secondary RGB(W):<br>
|
Default secondary RGB<span class="wc">W</span>:<br>
|
||||||
<input name="SR" type="number" min="0" max="255" required>
|
<input name="SR" type="number" min="0" max="255" required>
|
||||||
<input name="SG" type="number" min="0" max="255" required>
|
<input name="SG" type="number" min="0" max="255" required>
|
||||||
<input name="SB" type="number" min="0" max="255" required>
|
<input name="SB" type="number" min="0" max="255" required>
|
||||||
<input name="SW" type="number" min="0" max="255" required><br>
|
<span class="wc"><input name="SW" type="number" min="0" max="255" required></span><br>
|
||||||
Ignore and use current color, brightness and effects: <input type="checkbox" name="IS"><br>
|
Ignore and use current color, brightness and effects: <input type="checkbox" name="IS"><br><br>
|
||||||
Save current preset cycle configuration as boot default: <input type="checkbox" name="PC"><br>
|
Apply preset <input name="BP" type="number" min="0" max="25" required> at boot (0 uses defaults)<br>
|
||||||
<br>
|
Save current preset cycle configuration as boot default: <input type="checkbox" name="PC"><br><br>
|
||||||
Use Gamma correction for color: <input type="checkbox" name="GC"> (strongly recommended)<br>
|
Use Gamma correction for color: <input type="checkbox" name="GC"> (strongly recommended)<br>
|
||||||
Use Gamma correction for brightness: <input type="checkbox" name="GB"> (not recommended)<br>
|
Use Gamma correction for brightness: <input type="checkbox" name="GB"> (not recommended)<br><br>
|
||||||
Brightness factor: <input name="BF" type="number" min="0" max="255" required> %
|
Brightness factor: <input name="BF" type="number" min="0" max="255" required> %
|
||||||
<h3>Transitions</h3>
|
<h3>Transitions</h3>
|
||||||
Crossfade: <input type="checkbox" name="TF"><br>
|
Crossfade: <input type="checkbox" name="TF"><br>
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
//#define WLED_DISABLE_MOBILE_UI
|
//#define WLED_DISABLE_MOBILE_UI
|
||||||
|
|
||||||
//to toggle usb serial debug (un)comment following line(s)
|
//to toggle usb serial debug (un)comment following line(s)
|
||||||
#define WLED_DEBUG
|
//#define WLED_DEBUG
|
||||||
|
|
||||||
|
|
||||||
//library inclusions
|
//library inclusions
|
||||||
@ -74,7 +74,7 @@
|
|||||||
|
|
||||||
|
|
||||||
//version code in format yymmddb (b = daily build)
|
//version code in format yymmddb (b = daily build)
|
||||||
#define VERSION 1812012
|
#define VERSION 1812033
|
||||||
char versionString[] = "0.8.2-dev";
|
char versionString[] = "0.8.2-dev";
|
||||||
|
|
||||||
|
|
||||||
@ -111,9 +111,10 @@ IPAddress staticDNS(8, 8, 8, 8); //only for NTP, google DNS server
|
|||||||
|
|
||||||
|
|
||||||
//LED CONFIG
|
//LED CONFIG
|
||||||
uint16_t ledCount = 10; //lowered to prevent accidental overcurrent
|
uint16_t ledCount = 30; //overcurrent prevented by ABL
|
||||||
bool useRGBW = false; //SK6812 strips can contain an extra White channel
|
bool useRGBW = false; //SK6812 strips can contain an extra White channel
|
||||||
bool autoRGBtoRGBW = false; //if RGBW enabled, calculate White channel from RGB
|
bool autoRGBtoRGBW = false; //if RGBW enabled, calculate White channel from RGB
|
||||||
|
#define ABL_MILLIAMPS_DEFAULT 850; //auto lower brightness to stay close to milliampere limit
|
||||||
bool turnOnAtBoot = true; //turn on LEDs at power-up
|
bool turnOnAtBoot = true; //turn on LEDs at power-up
|
||||||
byte bootPreset = 0; //save preset to load after power-up
|
byte bootPreset = 0; //save preset to load after power-up
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#define EEPSIZE 3072
|
#define EEPSIZE 3072
|
||||||
|
|
||||||
//eeprom Version code, enables default settings instead of 0 init on update
|
//eeprom Version code, enables default settings instead of 0 init on update
|
||||||
#define EEPVER 9
|
#define EEPVER 10
|
||||||
//0 -> old version, default
|
//0 -> old version, default
|
||||||
//1 -> 0.4p 1711272 and up
|
//1 -> 0.4p 1711272 and up
|
||||||
//2 -> 0.4p 1711302 and up
|
//2 -> 0.4p 1711302 and up
|
||||||
@ -17,6 +17,7 @@
|
|||||||
//7 -> 0.7.1 and up
|
//7 -> 0.7.1 and up
|
||||||
//8 -> 0.8.0-a and up
|
//8 -> 0.8.0-a and up
|
||||||
//9 -> 0.8.0
|
//9 -> 0.8.0
|
||||||
|
//10-> 0.8.2
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -75,7 +76,7 @@ void saveSettingsToEEPROM()
|
|||||||
EEPROM.write(226, notifyDirectDefault);
|
EEPROM.write(226, notifyDirectDefault);
|
||||||
EEPROM.write(227, apChannel);
|
EEPROM.write(227, apChannel);
|
||||||
EEPROM.write(228, apHide);
|
EEPROM.write(228, apHide);
|
||||||
EEPROM.write(229, (ledCount >> 0) & 0xFF);
|
EEPROM.write(229, ledCount & 0xFF);
|
||||||
EEPROM.write(230, notifyButton);
|
EEPROM.write(230, notifyButton);
|
||||||
EEPROM.write(231, notifyTwice);
|
EEPROM.write(231, notifyTwice);
|
||||||
EEPROM.write(232, buttonEnabled);
|
EEPROM.write(232, buttonEnabled);
|
||||||
@ -96,7 +97,7 @@ void saveSettingsToEEPROM()
|
|||||||
EEPROM.write(250, receiveNotificationBrightness);
|
EEPROM.write(250, receiveNotificationBrightness);
|
||||||
EEPROM.write(251, fadeTransition);
|
EEPROM.write(251, fadeTransition);
|
||||||
EEPROM.write(252, reverseMode);
|
EEPROM.write(252, reverseMode);
|
||||||
EEPROM.write(253, (transitionDelayDefault >> 0) & 0xFF);
|
EEPROM.write(253, transitionDelayDefault & 0xFF);
|
||||||
EEPROM.write(254, (transitionDelayDefault >> 8) & 0xFF);
|
EEPROM.write(254, (transitionDelayDefault >> 8) & 0xFF);
|
||||||
EEPROM.write(255, briMultiplier);
|
EEPROM.write(255, briMultiplier);
|
||||||
|
|
||||||
@ -105,7 +106,7 @@ void saveSettingsToEEPROM()
|
|||||||
|
|
||||||
EEPROM.write(288, nightlightTargetBri);
|
EEPROM.write(288, nightlightTargetBri);
|
||||||
EEPROM.write(289, otaLock);
|
EEPROM.write(289, otaLock);
|
||||||
EEPROM.write(290, (udpPort >> 0) & 0xFF);
|
EEPROM.write(290, udpPort & 0xFF);
|
||||||
EEPROM.write(291, (udpPort >> 8) & 0xFF);
|
EEPROM.write(291, (udpPort >> 8) & 0xFF);
|
||||||
writeStringToEEPROM(292, serverDescription, 32);
|
writeStringToEEPROM(292, serverDescription, 32);
|
||||||
|
|
||||||
@ -146,13 +147,15 @@ void saveSettingsToEEPROM()
|
|||||||
|
|
||||||
EEPROM.write(385, irEnabled);
|
EEPROM.write(385, irEnabled);
|
||||||
|
|
||||||
|
EEPROM.write(387, strip.ablMilliampsMax & 0xFF);
|
||||||
|
EEPROM.write(388, (strip.ablMilliampsMax >> 8) & 0xFF);
|
||||||
EEPROM.write(389, bootPreset);
|
EEPROM.write(389, bootPreset);
|
||||||
EEPROM.write(390, aOtaEnabled);
|
EEPROM.write(390, aOtaEnabled);
|
||||||
EEPROM.write(391, receiveNotificationColor);
|
EEPROM.write(391, receiveNotificationColor);
|
||||||
EEPROM.write(392, receiveNotificationEffects);
|
EEPROM.write(392, receiveNotificationEffects);
|
||||||
EEPROM.write(393, wifiLock);
|
EEPROM.write(393, wifiLock);
|
||||||
|
|
||||||
EEPROM.write(394, (abs(utcOffsetSecs) >> 0) & 0xFF);
|
EEPROM.write(394, abs(utcOffsetSecs) & 0xFF);
|
||||||
EEPROM.write(395, (abs(utcOffsetSecs) >> 8) & 0xFF);
|
EEPROM.write(395, (abs(utcOffsetSecs) >> 8) & 0xFF);
|
||||||
EEPROM.write(396, (utcOffsetSecs<0)); //is negative
|
EEPROM.write(396, (utcOffsetSecs<0)); //is negative
|
||||||
EEPROM.write(397, initLedsLast);
|
EEPROM.write(397, initLedsLast);
|
||||||
@ -177,7 +180,7 @@ void saveSettingsToEEPROM()
|
|||||||
EEPROM.write(i, hueIP[i-2050]);
|
EEPROM.write(i, hueIP[i-2050]);
|
||||||
}
|
}
|
||||||
writeStringToEEPROM(2054, hueApiKey, 46);
|
writeStringToEEPROM(2054, hueApiKey, 46);
|
||||||
EEPROM.write(2100, (huePollIntervalMs >> 0) & 0xFF);
|
EEPROM.write(2100, huePollIntervalMs & 0xFF);
|
||||||
EEPROM.write(2101, (huePollIntervalMs >> 8) & 0xFF);
|
EEPROM.write(2101, (huePollIntervalMs >> 8) & 0xFF);
|
||||||
EEPROM.write(2102, notifyHue);
|
EEPROM.write(2102, notifyHue);
|
||||||
EEPROM.write(2103, hueApplyOnOff);
|
EEPROM.write(2103, hueApplyOnOff);
|
||||||
@ -212,10 +215,10 @@ void saveSettingsToEEPROM()
|
|||||||
EEPROM.write(2180, macroCountdown);
|
EEPROM.write(2180, macroCountdown);
|
||||||
EEPROM.write(2181, macroNl);
|
EEPROM.write(2181, macroNl);
|
||||||
|
|
||||||
EEPROM.write(2190, (e131Universe >> 0) & 0xFF);
|
EEPROM.write(2190, e131Universe & 0xFF);
|
||||||
EEPROM.write(2191, (e131Universe >> 8) & 0xFF);
|
EEPROM.write(2191, (e131Universe >> 8) & 0xFF);
|
||||||
EEPROM.write(2192, e131Multicast);
|
EEPROM.write(2192, e131Multicast);
|
||||||
EEPROM.write(2193, (realtimeTimeoutMs >> 0) & 0xFF);
|
EEPROM.write(2193, realtimeTimeoutMs & 0xFF);
|
||||||
EEPROM.write(2194, (realtimeTimeoutMs >> 8) & 0xFF);
|
EEPROM.write(2194, (realtimeTimeoutMs >> 8) & 0xFF);
|
||||||
EEPROM.write(2195, arlsForceMaxBri);
|
EEPROM.write(2195, arlsForceMaxBri);
|
||||||
EEPROM.write(2196, arlsDisableGammaCorrection);
|
EEPROM.write(2196, arlsDisableGammaCorrection);
|
||||||
@ -229,7 +232,7 @@ void saveSettingsToEEPROM()
|
|||||||
if (saveCurrPresetCycConf)
|
if (saveCurrPresetCycConf)
|
||||||
{
|
{
|
||||||
EEPROM.write(2205, presetCyclingEnabled);
|
EEPROM.write(2205, presetCyclingEnabled);
|
||||||
EEPROM.write(2206, (presetCycleTime >> 0) & 0xFF);
|
EEPROM.write(2206, presetCycleTime & 0xFF);
|
||||||
EEPROM.write(2207, (presetCycleTime >> 8) & 0xFF);
|
EEPROM.write(2207, (presetCycleTime >> 8) & 0xFF);
|
||||||
EEPROM.write(2208, presetCycleMin);
|
EEPROM.write(2208, presetCycleMin);
|
||||||
EEPROM.write(2209, presetCycleMax);
|
EEPROM.write(2209, presetCycleMax);
|
||||||
@ -288,7 +291,7 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
if (apChannel > 13 || apChannel < 1) apChannel = 1;
|
if (apChannel > 13 || apChannel < 1) apChannel = 1;
|
||||||
apHide = EEPROM.read(228);
|
apHide = EEPROM.read(228);
|
||||||
if (apHide > 1) apHide = 1;
|
if (apHide > 1) apHide = 1;
|
||||||
ledCount = ((EEPROM.read(229) << 0) & 0xFF) + ((EEPROM.read(398) << 8) & 0xFF00); if (ledCount > 1200 || ledCount == 0) ledCount = 10;
|
ledCount = EEPROM.read(229) + ((EEPROM.read(398) << 8) & 0xFF00); if (ledCount > 1200 || ledCount == 0) ledCount = 30;
|
||||||
|
|
||||||
notifyButton = EEPROM.read(230);
|
notifyButton = EEPROM.read(230);
|
||||||
notifyTwice = EEPROM.read(231);
|
notifyTwice = EEPROM.read(231);
|
||||||
@ -318,7 +321,7 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
receiveNotificationBrightness = EEPROM.read(250);
|
receiveNotificationBrightness = EEPROM.read(250);
|
||||||
fadeTransition = EEPROM.read(251);
|
fadeTransition = EEPROM.read(251);
|
||||||
reverseMode = EEPROM.read(252);
|
reverseMode = EEPROM.read(252);
|
||||||
transitionDelayDefault = ((EEPROM.read(253) << 0) & 0xFF) + ((EEPROM.read(254) << 8) & 0xFF00);
|
transitionDelayDefault = EEPROM.read(253) + ((EEPROM.read(254) << 8) & 0xFF00);
|
||||||
transitionDelay = transitionDelayDefault;
|
transitionDelay = transitionDelayDefault;
|
||||||
briMultiplier = EEPROM.read(255);
|
briMultiplier = EEPROM.read(255);
|
||||||
|
|
||||||
@ -326,7 +329,7 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
|
|
||||||
nightlightTargetBri = EEPROM.read(288);
|
nightlightTargetBri = EEPROM.read(288);
|
||||||
otaLock = EEPROM.read(289);
|
otaLock = EEPROM.read(289);
|
||||||
udpPort = ((EEPROM.read(290) << 0) & 0xFF) + ((EEPROM.read(291) << 8) & 0xFF00);
|
udpPort = EEPROM.read(290) + ((EEPROM.read(291) << 8) & 0xFF00);
|
||||||
|
|
||||||
readStringFromEEPROM(292, serverDescription, 32);
|
readStringFromEEPROM(292, serverDescription, 32);
|
||||||
|
|
||||||
@ -390,7 +393,7 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
|
|
||||||
readStringFromEEPROM(2054, hueApiKey, 46);
|
readStringFromEEPROM(2054, hueApiKey, 46);
|
||||||
|
|
||||||
huePollIntervalMs = ((EEPROM.read(2100) << 0) & 0xFF) + ((EEPROM.read(2101) << 8) & 0xFF00);
|
huePollIntervalMs = EEPROM.read(2100) + ((EEPROM.read(2101) << 8) & 0xFF00);
|
||||||
notifyHue = EEPROM.read(2102);
|
notifyHue = EEPROM.read(2102);
|
||||||
hueApplyOnOff = EEPROM.read(2103);
|
hueApplyOnOff = EEPROM.read(2103);
|
||||||
hueApplyBri = EEPROM.read(2104);
|
hueApplyBri = EEPROM.read(2104);
|
||||||
@ -426,9 +429,9 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
|
|
||||||
if (lastEEPROMversion > 6)
|
if (lastEEPROMversion > 6)
|
||||||
{
|
{
|
||||||
e131Universe = ((EEPROM.read(2190) << 0) & 0xFF) + ((EEPROM.read(2191) << 8) & 0xFF00);
|
e131Universe = EEPROM.read(2190) + ((EEPROM.read(2191) << 8) & 0xFF00);
|
||||||
e131Multicast = EEPROM.read(2192);
|
e131Multicast = EEPROM.read(2192);
|
||||||
realtimeTimeoutMs = ((EEPROM.read(2193) << 0) & 0xFF) + ((EEPROM.read(2194) << 8) & 0xFF00);
|
realtimeTimeoutMs = EEPROM.read(2193) + ((EEPROM.read(2194) << 8) & 0xFF00);
|
||||||
arlsForceMaxBri = EEPROM.read(2195);
|
arlsForceMaxBri = EEPROM.read(2195);
|
||||||
arlsDisableGammaCorrection = EEPROM.read(2196);
|
arlsDisableGammaCorrection = EEPROM.read(2196);
|
||||||
}
|
}
|
||||||
@ -443,8 +446,8 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
timerHours[i] = EEPROM.read(2260 + i);
|
timerHours[i] = EEPROM.read(2260 + i);
|
||||||
timerMinutes[i] = EEPROM.read(2270 + i);
|
timerMinutes[i] = EEPROM.read(2270 + i);
|
||||||
timerWeekday[i] = EEPROM.read(2280 + i);
|
timerWeekday[i] = EEPROM.read(2280 + i);
|
||||||
if (timerWeekday[i] == 0) timerWeekday[i] = 255;
|
|
||||||
timerMacro[i] = EEPROM.read(2290 + i);
|
timerMacro[i] = EEPROM.read(2290 + i);
|
||||||
|
if (timerWeekday[i] == 0) timerWeekday[i] = 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -456,6 +459,14 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
strip.colorOrder = EEPROM.read(383);
|
strip.colorOrder = EEPROM.read(383);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lastEEPROMversion > 9)
|
||||||
|
{
|
||||||
|
strip.ablMilliampsMax = EEPROM.read(387) + ((EEPROM.read(388) << 8) & 0xFF00);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
strip.ablMilliampsMax = ABL_MILLIAMPS_DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
receiveDirect = !EEPROM.read(2200);
|
receiveDirect = !EEPROM.read(2200);
|
||||||
enableRealtimeUI = EEPROM.read(2201);
|
enableRealtimeUI = EEPROM.read(2201);
|
||||||
uiConfiguration = EEPROM.read(2202);
|
uiConfiguration = EEPROM.read(2202);
|
||||||
@ -471,7 +482,7 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
if (EEPROM.read(2210) || EEPROM.read(2211) || EEPROM.read(2212))
|
if (EEPROM.read(2210) || EEPROM.read(2211) || EEPROM.read(2212))
|
||||||
{
|
{
|
||||||
presetCyclingEnabled = EEPROM.read(2205);
|
presetCyclingEnabled = EEPROM.read(2205);
|
||||||
presetCycleTime = ((EEPROM.read(2206) << 0) & 0xFF) + ((EEPROM.read(2207) << 8) & 0xFF00);
|
presetCycleTime = EEPROM.read(2206) + ((EEPROM.read(2207) << 8) & 0xFF00);
|
||||||
presetCycleMin = EEPROM.read(2208);
|
presetCycleMin = EEPROM.read(2208);
|
||||||
presetCycleMax = EEPROM.read(2209);
|
presetCycleMax = EEPROM.read(2209);
|
||||||
presetApplyBri = EEPROM.read(2210);
|
presetApplyBri = EEPROM.read(2210);
|
||||||
@ -481,7 +492,7 @@ void loadSettingsFromEEPROM(bool first)
|
|||||||
|
|
||||||
bootPreset = EEPROM.read(389);
|
bootPreset = EEPROM.read(389);
|
||||||
wifiLock = EEPROM.read(393);
|
wifiLock = EEPROM.read(393);
|
||||||
utcOffsetSecs = ((EEPROM.read(394) << 0) & 0xFF) + ((EEPROM.read(395) << 8) & 0xFF00);
|
utcOffsetSecs = EEPROM.read(394) + ((EEPROM.read(395) << 8) & 0xFF00);
|
||||||
if (EEPROM.read(396)) utcOffsetSecs = -utcOffsetSecs; //negative
|
if (EEPROM.read(396)) utcOffsetSecs = -utcOffsetSecs; //negative
|
||||||
initLedsLast = EEPROM.read(397);
|
initLedsLast = EEPROM.read(397);
|
||||||
enableSecTransition = !EEPROM.read(399);
|
enableSecTransition = !EEPROM.read(399);
|
||||||
|
@ -191,6 +191,14 @@ void getSettingsJS(byte subPage)
|
|||||||
|
|
||||||
if (subPage == 2) {
|
if (subPage == 2) {
|
||||||
sappend('v',"LC",ledCount);
|
sappend('v',"LC",ledCount);
|
||||||
|
sappend('v',"MA",strip.ablMilliampsMax);
|
||||||
|
if (strip.currentMilliamps)
|
||||||
|
{
|
||||||
|
sappends('m',"(\"pow\")[0]","");
|
||||||
|
olen -= 2; //delete ";
|
||||||
|
oappendi(strip.currentMilliamps);
|
||||||
|
oappend("mA\";");
|
||||||
|
}
|
||||||
sappend('v',"CR",colS[0]);
|
sappend('v',"CR",colS[0]);
|
||||||
sappend('v',"CG",colS[1]);
|
sappend('v',"CG",colS[1]);
|
||||||
sappend('v',"CB",colS[2]);
|
sappend('v',"CB",colS[2]);
|
||||||
|
@ -59,6 +59,7 @@ void handleSettingsSet(byte subPage)
|
|||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
if (ledCount > 600) ledCount = 600;
|
if (ledCount > 600) ledCount = 600;
|
||||||
#endif
|
#endif
|
||||||
|
strip.ablMilliampsMax = server.arg("MA").toInt();
|
||||||
useRGBW = server.hasArg("EW");
|
useRGBW = server.hasArg("EW");
|
||||||
strip.colorOrder = server.arg("CO").toInt();
|
strip.colorOrder = server.arg("CO").toInt();
|
||||||
autoRGBtoRGBW = server.hasArg("AW");
|
autoRGBtoRGBW = server.hasArg("AW");
|
||||||
|
@ -5,7 +5,8 @@
|
|||||||
void wledInit()
|
void wledInit()
|
||||||
{
|
{
|
||||||
EEPROM.begin(EEPSIZE);
|
EEPROM.begin(EEPSIZE);
|
||||||
ledCount = ((EEPROM.read(229) << 0) & 0xFF) + ((EEPROM.read(398) << 8) & 0xFF00); if (ledCount > 1200 || ledCount == 0) ledCount = 10;
|
ledCount = EEPROM.read(229) + ((EEPROM.read(398) << 8) & 0xFF00);
|
||||||
|
if (ledCount > 1200 || ledCount == 0) ledCount = 30;
|
||||||
//RMT eats up too much RAM
|
//RMT eats up too much RAM
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
if (ledCount > 600) ledCount = 600;
|
if (ledCount > 600) ledCount = 600;
|
||||||
|
@ -101,9 +101,16 @@ void initServer()
|
|||||||
});
|
});
|
||||||
|
|
||||||
server.on("/power", HTTP_GET, [](){
|
server.on("/power", HTTP_GET, [](){
|
||||||
String val = (String)(int)strip.getPowerEstimate(ledCount,strip.getColor(),strip.getBrightness());
|
String val = "";
|
||||||
|
if (strip.currentMilliamps == 0)
|
||||||
|
{
|
||||||
|
val = "Power calculation disabled";
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
val += (String)strip.currentMilliamps;
|
||||||
val += "mA currently";
|
val += "mA currently";
|
||||||
serveMessage(200,val,"This is just an estimate (does not account for factors like effects and wire resistance). It is NOT a measurement!",254);
|
}
|
||||||
|
serveMessage(200, val, "This is just an estimate (does not account for factors like wire resistance). It is NOT a measurement!", 254);
|
||||||
});
|
});
|
||||||
|
|
||||||
server.on("/u", HTTP_GET, [](){
|
server.on("/u", HTTP_GET, [](){
|
||||||
|
Loading…
Reference in New Issue
Block a user