mirror of
https://github.com/lumapu/ahoy.git
synced 2025-08-06 09:58:23 +02:00
0.7.46
* removed `delay` from ePaper * started improvements of `/system` * fix LEDs to check all configured inverters
This commit is contained in:
parent
201098ae0b
commit
f3192b49ab
16 changed files with 218 additions and 124 deletions
|
@ -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;
|
||||
|
|
|
@ -50,7 +50,7 @@ class DisplayMono64X48 : public DisplayMono {
|
|||
void loop(void) {
|
||||
if (mEnPowerSafe) {
|
||||
if (mTimeout != 0)
|
||||
mTimeout--;
|
||||
mTimeout--;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ class DisplayMono84X48 : public DisplayMono {
|
|||
void loop(void) {
|
||||
if (mEnPowerSafe) {
|
||||
if (mTimeout != 0)
|
||||
mTimeout--;
|
||||
mTimeout--;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue