* removed `delay` from ePaper
* started improvements of `/system`
* fix LEDs to check all configured inverters
This commit is contained in:
lumapu 2023-09-01 07:58:33 +02:00
parent 201098ae0b
commit f3192b49ab
16 changed files with 218 additions and 124 deletions

View file

@ -61,11 +61,14 @@ class Display {
if (mMono != NULL)
mMono->loop();
if (mNewPayload || ((++mLoopCnt % 10) == 0)) {
if (mNewPayload || (((++mLoopCnt) % 30) == 0)) {
mNewPayload = false;
mLoopCnt = 0;
DataScreen();
}
#if defined(ESP32)
mEpaper.tickerSecond();
#endif
}
private:
@ -102,13 +105,10 @@ class Display {
}
#if defined(ESP32)
else if (mCfg->type == 10) {
mEpaper.loop(totalPower, totalYieldDay, totalYieldTotal, isprod);
mRefreshCycle++;
}
#endif
#if defined(ESP32)
if (mRefreshCycle > 480) {
mEpaper.fullRefresh();
mRefreshCycle = 0;

View file

@ -50,7 +50,7 @@ class DisplayMono64X48 : public DisplayMono {
void loop(void) {
if (mEnPowerSafe) {
if (mTimeout != 0)
mTimeout--;
mTimeout--;
}
}

View file

@ -50,7 +50,7 @@ class DisplayMono84X48 : public DisplayMono {
void loop(void) {
if (mEnPowerSafe) {
if (mTimeout != 0)
mTimeout--;
mTimeout--;
}
}

View file

@ -21,10 +21,14 @@ DisplayEPaper::DisplayEPaper() {
mHeadFootPadding = 16;
}
//***************************************************************************
void DisplayEPaper::init(uint8_t type, uint8_t _CS, uint8_t _DC, uint8_t _RST, uint8_t _BUSY, uint8_t _SCK, uint8_t _MOSI, uint32_t *utcTs, const char *version) {
mUtcTs = utcTs;
mRefreshState = RefreshStatus::LOGO;
mSecondCnt = 0;
if (type == 10) {
Serial.begin(115200);
_display = new GxEPD2_BW<GxEPD2_150_BN, GxEPD2_150_BN::HEIGHT>(GxEPD2_150_BN(_CS, _DC, _RST, _BUSY));
@ -38,26 +42,7 @@ void DisplayEPaper::init(uint8_t type, uint8_t _CS, uint8_t _DC, uint8_t _RST, u
_display->init(115200, true, 20, false);
_display->setRotation(mDisplayRotation);
_display->setFullWindow();
// Logo
_display->fillScreen(GxEPD_BLACK);
_display->drawBitmap(0, 0, logo, 200, 200, GxEPD_WHITE);
while (_display->nextPage())
;
// clean the screen
delay(2000);
_display->fillScreen(GxEPD_WHITE);
while (_display->nextPage())
;
headlineIP();
_version = version;
versionFooter();
// call the PowerPage to change the PV Power Values
actualPowerPaged(0, 0, 0, 0);
}
}
@ -68,15 +53,51 @@ void DisplayEPaper::config(uint8_t rotation, bool enPowerSafe) {
//***************************************************************************
void DisplayEPaper::fullRefresh() {
// screen complete black
_display->fillScreen(GxEPD_BLACK);
while (_display->nextPage())
;
delay(2000);
// screen complete white
_display->fillScreen(GxEPD_WHITE);
while (_display->nextPage())
;
if(RefreshStatus::DONE != mRefreshState)
return;
mSecondCnt = 2;
mRefreshState = RefreshStatus::BLACK;
}
//***************************************************************************
void DisplayEPaper::refreshLoop() {
switch(mRefreshState) {
case RefreshStatus::LOGO:
_display->fillScreen(GxEPD_BLACK);
_display->drawBitmap(0, 0, logo, 200, 200, GxEPD_WHITE);
mNextRefreshState = RefreshStatus::PARTITIALS;
mRefreshState = RefreshStatus::WAIT;
break;
case RefreshStatus::BLACK:
_display->fillScreen(GxEPD_BLACK);
mNextRefreshState = RefreshStatus::WHITE;
mRefreshState = RefreshStatus::WAIT;
break;
case RefreshStatus::WHITE:
if(mSecondCnt == 0) {
_display->fillScreen(GxEPD_WHITE);
mNextRefreshState = RefreshStatus::PARTITIALS;
mRefreshState = RefreshStatus::WAIT;
}
break;
case RefreshStatus::WAIT:
if(!_display->nextPage())
mRefreshState = mNextRefreshState;
break;
case RefreshStatus::PARTITIALS:
headlineIP();
versionFooter();
mSecondCnt = 4; // display Logo time during boot up
mRefreshState = RefreshStatus::DONE;
break;
default: // RefreshStatus::DONE
break;
}
}
//***************************************************************************
void DisplayEPaper::headlineIP() {
@ -185,9 +206,8 @@ void DisplayEPaper::actualPowerPaged(float totalPower, float totalYieldDay, floa
} else if ((totalPower > 0) && (totalPower <= 9999)) {
snprintf(_fmtText, sizeof(_fmtText), "%.0f W", totalPower);
_changed = true;
} else {
} else
snprintf(_fmtText, sizeof(_fmtText), "offline");
}
if ((totalPower == 0) && (mEnPowerSafe)) {
_display->fillRect(0, mHeadFootPadding, 200, 200, GxEPD_BLACK);
@ -200,57 +220,43 @@ void DisplayEPaper::actualPowerPaged(float totalPower, float totalYieldDay, floa
if ((totalYieldDay > 0) && (totalYieldTotal > 0)) {
// Today Production
bool kwh = (totalYieldDay > 9999);
if(kwh)
snprintf(_fmtText, _display->width(), "%.1f", (totalYieldDay / 1000));
else
snprintf(_fmtText, _display->width(), "%.0f", (totalYieldDay));
_display->setFont(&FreeSans18pt7b);
y = _display->height() / 2;
_display->setCursor(5, y);
if (totalYieldDay > 9999) {
snprintf(_fmtText, _display->width(), "%.1f", (totalYieldDay / 1000));
_display->getTextBounds(_fmtText, 0, 0, &tbx, &tby, &tbw, &tbh);
_display->drawInvertedBitmap(5, y - ((tbh + 30) / 2), myToday, 30, 30, GxEPD_BLACK);
x = ((_display->width() - tbw - 20) / 2) - tbx;
_display->setCursor(x, y);
_display->print(_fmtText);
_display->setCursor(_display->width() - 50, y);
_display->setFont(&FreeSans12pt7b);
_display->println("kWh");
} else if (totalYieldDay <= 9999) {
snprintf(_fmtText, _display->width(), "%.0f", (totalYieldDay));
_display->getTextBounds(_fmtText, 0, 0, &tbx, &tby, &tbw, &tbh);
_display->drawInvertedBitmap(5, y - tbh, myToday, 30, 30, GxEPD_BLACK);
x = ((_display->width() - tbw - 20) / 2) - tbx;
_display->setCursor(x, y);
_display->print(_fmtText);
_display->setCursor(_display->width() - 38, y);
_display->setFont(&FreeSans12pt7b);
_display->println("Wh");
}
_display->getTextBounds(_fmtText, 0, 0, &tbx, &tby, &tbw, &tbh);
_display->drawInvertedBitmap(5, ((kwh) ? (y - ((tbh + 30) / 2)) : (y - tbh)), myToday, 30, 30, GxEPD_BLACK);
x = ((_display->width() - tbw - 20) / 2) - tbx;
_display->setCursor(x, y);
_display->print(_fmtText);
_display->setCursor(_display->width() - ((kwh) ? 50 : 38), y);
_display->setFont(&FreeSans12pt7b);
_display->println((kwh) ? "kWh" : "Wh");
y = y + tbh + 15;
// Total Production
bool mwh = (totalYieldTotal > 9999);
if(mwh)
snprintf(_fmtText, _display->width(), "%.1f", (totalYieldTotal / 1000));
else
snprintf(_fmtText, _display->width(), "%.0f", (totalYieldTotal));
_display->setFont(&FreeSans18pt7b);
_display->setCursor(5, y);
if (totalYieldTotal > 9999) {
snprintf(_fmtText, _display->width(), "%.1f", (totalYieldTotal / 1000));
_display->getTextBounds(_fmtText, 0, 0, &tbx, &tby, &tbw, &tbh);
_display->drawInvertedBitmap(5, y - tbh, mySigma, 30, 30, GxEPD_BLACK);
x = ((_display->width() - tbw - 20) / 2) - tbx;
_display->setCursor(x, y);
_display->print(_fmtText);
_display->setCursor(_display->width() - 59, y);
_display->setFont(&FreeSans12pt7b);
_display->println("MWh");
} else if (totalYieldTotal <= 9999) {
snprintf(_fmtText, _display->width(), "%.0f", (totalYieldTotal));
_display->getTextBounds(_fmtText, 0, 0, &tbx, &tby, &tbw, &tbh);
_display->drawInvertedBitmap(5, y - tbh, mySigma, 30, 30, GxEPD_BLACK);
x = ((_display->width() - tbw - 20) / 2) - tbx;
_display->setCursor(x, y);
_display->print(_fmtText);
_display->setCursor(_display->width() - 50, y);
_display->setFont(&FreeSans12pt7b);
_display->println("kWh");
}
_display->getTextBounds(_fmtText, 0, 0, &tbx, &tby, &tbw, &tbh);
_display->drawInvertedBitmap(5, y - tbh, mySigma, 30, 30, GxEPD_BLACK);
x = ((_display->width() - tbw - 20) / 2) - tbx;
_display->setCursor(x, y);
_display->print(_fmtText);
_display->setCursor(_display->width() - ((mwh) ? 59 : 50), y);
_display->setFont(&FreeSans12pt7b);
_display->println((mwh) ? "MWh" : "kWh");
}
// Inverter online
@ -263,14 +269,18 @@ void DisplayEPaper::actualPowerPaged(float totalPower, float totalYieldDay, floa
_display->setCursor(x, y);
_display->println(_fmtText);
}
yield();
} while (_display->nextPage());
}
//***************************************************************************
void DisplayEPaper::loop(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod) {
if(RefreshStatus::DONE != mRefreshState)
return;
// check if the IP has changed
if (_settedIP != WiFi.localIP().toString().c_str()) {
if (_settedIP != WiFi.localIP().toString()) {
// save the new IP and call the Headline Function to adapt the Headline
_settedIP = WiFi.localIP().toString().c_str();
_settedIP = WiFi.localIP().toString();
headlineIP();
}
@ -286,5 +296,11 @@ void DisplayEPaper::loop(float totalPower, float totalYieldDay, float totalYield
_display->powerOff();
}
//***************************************************************************
void DisplayEPaper::tickerSecond() {
if(mSecondCnt != 0)
mSecondCnt--;
refreshLoop();
}
#endif // ESP32

View file

@ -30,6 +30,8 @@ class DisplayEPaper {
void init(uint8_t type, uint8_t _CS, uint8_t _DC, uint8_t _RST, uint8_t _BUSY, uint8_t _SCK, uint8_t _MOSI, uint32_t* utcTs, const char* version);
void config(uint8_t rotation, bool enPowerSafe);
void loop(float totalPower, float totalYieldDay, float totalYieldTotal, uint8_t isprod);
void refreshLoop();
void tickerSecond();
private:
void headlineIP();
@ -38,15 +40,26 @@ class DisplayEPaper {
void offlineFooter();
void versionFooter();
enum class RefreshStatus : uint8_t {
DONE,
BLACK,
WHITE,
WAIT,
PARTITIALS,
LOGO
};
uint8_t mDisplayRotation;
bool _changed = false;
char _fmtText[35];
const char* _settedIP;
String _settedIP;
uint8_t mHeadFootPadding;
GxEPD2_GFX* _display;
uint32_t* mUtcTs;
bool mEnPowerSafe;
const char* _version;
RefreshStatus mRefreshState, mNextRefreshState;
uint8_t mSecondCnt;
};
#endif // ESP32