Added Auto Brightness Limiter and power calculation

This commit is contained in:
cschwinne 2018-12-04 00:58:06 +01:00
parent 5489c74986
commit ff46e6ea86
10 changed files with 164 additions and 87 deletions

View File

@ -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

View File

@ -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.

View File

@ -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>

View File

@ -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

View File

@ -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);

View File

@ -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]);

View File

@ -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");

View File

@ -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;

View File

@ -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, [](){