mirror of
https://github.com/lumapu/ahoy.git
synced 2025-07-19 09:17:18 +02:00
Merge branch 'lumapu:development03' into development03
This commit is contained in:
commit
a84be7ed71
6 changed files with 201 additions and 60 deletions
|
@ -1,5 +1,9 @@
|
|||
# Development Changes
|
||||
|
||||
## 0.7.45 - 2023-08-29
|
||||
* change ePaper text to symbols PR #1131
|
||||
* added some invertes to dev info list #1111
|
||||
|
||||
## 0.7.44 - 2023-08-28
|
||||
* fix `last_success` transmitted to often #1124
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
//-------------------------------------
|
||||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 7
|
||||
#define VERSION_PATCH 44
|
||||
#define VERSION_PATCH 45
|
||||
|
||||
//-------------------------------------
|
||||
typedef struct {
|
||||
|
|
|
@ -25,7 +25,7 @@ enum {FLD_UDC = 0, FLD_IDC, FLD_PDC, FLD_YD, FLD_YW, FLD_YT,
|
|||
FLD_FW_BUILD_MONTH_DAY, FLD_FW_BUILD_HOUR_MINUTE, FLD_BOOTLOADER_VER,
|
||||
FLD_ACT_ACTIVE_PWR_LIMIT, FLD_PART_NUM, FLD_HW_VERSION, FLD_GRID_PROFILE_CODE,
|
||||
FLD_GRID_PROFILE_VERSION, /*FLD_ACT_REACTIVE_PWR_LIMIT, FLD_ACT_PF,*/ FLD_LAST_ALARM_CODE, FLD_MP};
|
||||
|
||||
|
||||
const char* const fields[] = {"U_DC", "I_DC", "P_DC", "YieldDay", "YieldWeek", "YieldTotal",
|
||||
"U_AC", "U_AC_1N", "U_AC_2N", "U_AC_3N", "UAC_12", "UAC_23", "UAC_31", "I_AC",
|
||||
"IAC_1", "I_AC_2", "I_AC_3", "P_AC", "F_AC", "Temp", "PF_AC", "Efficiency", "Irradiation","Q_AC",
|
||||
|
@ -259,20 +259,52 @@ typedef struct {
|
|||
uint16_t maxPower;
|
||||
} devInfo_t;
|
||||
|
||||
// https://github.com/lumapu/ahoy/issues/1111
|
||||
// Hardware number:
|
||||
// 0xAABBCCDD
|
||||
// ^^ ------- always 10 (for MI, HM, HMS, HMT)
|
||||
// ^ ------ 0 = MI
|
||||
// 1 = HM
|
||||
// 1, 2 = HMS (version)
|
||||
// 3 = HMT
|
||||
// ^ ----- 0 = 1 Input
|
||||
// 1 = 2 Inputs
|
||||
// 2 = 4 Inputs
|
||||
// 3 = 6 Inputs
|
||||
// ^ ---- 0 = smallest with x inputs
|
||||
// 7 = biggest with x inputs
|
||||
|
||||
const devInfo_t devInfo[] = {
|
||||
// MI 3rd gen
|
||||
{ 0x001311, 600 },
|
||||
{ 0x001411, 700 },
|
||||
{ 0x002111, 1000 },
|
||||
{ 0x002311, 1200 },
|
||||
{ 0x002411, 1500 },
|
||||
{ 0x002511, 1500 },
|
||||
|
||||
{ 0x100000, 250 },
|
||||
{ 0x100010, 300 },
|
||||
{ 0x100020, 350 },
|
||||
{ 0x100030, 400 },
|
||||
{ 0x100100, 500 },
|
||||
{ 0x100110, 600 },
|
||||
{ 0x100120, 700 },
|
||||
{ 0x100130, 800 },
|
||||
{ 0x100200, 1000 },
|
||||
{ 0x100210, 1200 },
|
||||
{ 0x100230, 1500 },
|
||||
|
||||
// HM
|
||||
{ 0x101010, 300 },
|
||||
{ 0x101020, 350 },
|
||||
{ 0x101030, 400 },
|
||||
{ 0x101040, 400 },
|
||||
{ 0x101110, 600 }, // [TSOL800(DE) ..20, HWv=??], [HM-600 ..20, HWv=2.66]
|
||||
{ 0x101110, 600 }, // [TSOL800(DE) ..20, HWv=2.66], [HM-600 ..20, HWv=2.66]
|
||||
{ 0x101120, 700 },
|
||||
{ 0x101130, 800 },
|
||||
{ 0x101140, 800 },
|
||||
{ 0x101210, 1200 }, // ..00
|
||||
{ 0x101200, 1000 },
|
||||
{ 0x101210, 1200 },
|
||||
{ 0x101230, 1500 },
|
||||
|
||||
// HMS
|
||||
|
@ -281,18 +313,19 @@ const devInfo_t devInfo[] = {
|
|||
{ 0x101051, 450 },
|
||||
{ 0x101071, 500 },
|
||||
{ 0x102111, 600 },
|
||||
{ 0x101120, 700 },
|
||||
{ 0x102141, 800 },
|
||||
{ 0x101151, 900 },
|
||||
{ 0x102171, 1000 },
|
||||
{ 0x102241, 1600 },
|
||||
{ 0x101251, 1800 },
|
||||
{ 0x102251, 1800 },
|
||||
{ 0x101271, 2000 }, // ..00
|
||||
{ 0x102271, 2000 },
|
||||
{ 0x101271, 2000 }, // v1 grey backplane, 14A
|
||||
{ 0x102271, 2000 }, // v2 black backplane, 16A
|
||||
|
||||
// HMT
|
||||
{ 0x103311, 1800 },
|
||||
{ 0x103331, 2250 } // ..00
|
||||
{ 0x103331, 2250 }
|
||||
};
|
||||
|
||||
#endif /*__HM_DEFINES_H__*/
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
#include "Display_ePaper.h"
|
||||
|
||||
#ifdef ESP8266
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESP8266WiFi.h>
|
||||
#elif defined(ESP32)
|
||||
#include <WiFi.h>
|
||||
#include <WiFi.h>
|
||||
#endif
|
||||
#include "../../utils/helper.h"
|
||||
#include "imagedata.h"
|
||||
|
@ -21,7 +21,6 @@ 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;
|
||||
|
@ -54,6 +53,9 @@ void DisplayEPaper::init(uint8_t type, uint8_t _CS, uint8_t _DC, uint8_t _RST, u
|
|||
|
||||
headlineIP();
|
||||
|
||||
_version = version;
|
||||
versionFooter();
|
||||
|
||||
// call the PowerPage to change the PV Power Values
|
||||
actualPowerPaged(0, 0, 0, 0);
|
||||
}
|
||||
|
@ -123,6 +125,26 @@ void DisplayEPaper::lastUpdatePaged() {
|
|||
} while (_display->nextPage());
|
||||
}
|
||||
//***************************************************************************
|
||||
void DisplayEPaper::versionFooter() {
|
||||
int16_t tbx, tby;
|
||||
uint16_t tbw, tbh;
|
||||
|
||||
_display->setFont(&FreeSans9pt7b);
|
||||
_display->setTextColor(GxEPD_WHITE);
|
||||
|
||||
_display->setPartialWindow(0, _display->height() - mHeadFootPadding, _display->width(), mHeadFootPadding);
|
||||
_display->fillScreen(GxEPD_BLACK);
|
||||
do {
|
||||
snprintf(_fmtText, sizeof(_fmtText), "Version: %s", _version);
|
||||
|
||||
_display->getTextBounds(_fmtText, 0, 0, &tbx, &tby, &tbw, &tbh);
|
||||
uint16_t x = ((_display->width() - tbw) / 2) - tbx;
|
||||
|
||||
_display->setCursor(x, (_display->height() - 3));
|
||||
_display->println(_fmtText);
|
||||
} while (_display->nextPage());
|
||||
}
|
||||
//***************************************************************************
|
||||
void DisplayEPaper::offlineFooter() {
|
||||
int16_t tbx, tby;
|
||||
uint16_t tbw, tbh;
|
||||
|
@ -154,9 +176,11 @@ void DisplayEPaper::actualPowerPaged(float totalPower, float totalYieldDay, floa
|
|||
|
||||
_display->setPartialWindow(0, mHeadFootPadding, _display->width(), _display->height() - (mHeadFootPadding * 2));
|
||||
_display->fillScreen(GxEPD_WHITE);
|
||||
|
||||
do {
|
||||
// actual Production
|
||||
if (totalPower > 9999) {
|
||||
snprintf(_fmtText, sizeof(_fmtText), "%.1f kW", (totalPower / 10000));
|
||||
snprintf(_fmtText, sizeof(_fmtText), "%.1f kW", (totalPower / 1000));
|
||||
_changed = true;
|
||||
} else if ((totalPower > 0) && (totalPower <= 9999)) {
|
||||
snprintf(_fmtText, sizeof(_fmtText), "%.0f W", totalPower);
|
||||
|
@ -164,8 +188,9 @@ void DisplayEPaper::actualPowerPaged(float totalPower, float totalYieldDay, floa
|
|||
} else {
|
||||
snprintf(_fmtText, sizeof(_fmtText), "offline");
|
||||
}
|
||||
if (totalPower == 0){
|
||||
_display->fillRect(0, mHeadFootPadding, 200,200, GxEPD_BLACK);
|
||||
|
||||
if ((totalPower == 0) && (mEnPowerSafe)) {
|
||||
_display->fillRect(0, mHeadFootPadding, 200, 200, GxEPD_BLACK);
|
||||
_display->drawBitmap(0, 0, logo, 200, 200, GxEPD_WHITE);
|
||||
} else {
|
||||
_display->getTextBounds(_fmtText, 0, 0, &tbx, &tby, &tbw, &tbh);
|
||||
|
@ -173,33 +198,70 @@ void DisplayEPaper::actualPowerPaged(float totalPower, float totalYieldDay, floa
|
|||
_display->setCursor(x, mHeadFootPadding + tbh + 10);
|
||||
_display->print(_fmtText);
|
||||
|
||||
if ((totalYieldDay > 0) && (totalYieldTotal > 0)) {
|
||||
// Today Production
|
||||
_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");
|
||||
}
|
||||
y = y + tbh + 15;
|
||||
|
||||
// Total Production
|
||||
_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");
|
||||
}
|
||||
}
|
||||
|
||||
// Inverter online
|
||||
_display->setFont(&FreeSans12pt7b);
|
||||
y = _display->height() / 2;
|
||||
_display->setCursor(5, y);
|
||||
_display->print("today:");
|
||||
snprintf(_fmtText, _display->width(), "%.0f", totalYieldDay);
|
||||
y = _display->height() - (mHeadFootPadding + 10);
|
||||
snprintf(_fmtText, sizeof(_fmtText), " %d online", isprod);
|
||||
_display->getTextBounds(_fmtText, 0, 0, &tbx, &tby, &tbw, &tbh);
|
||||
x = ((_display->width() - tbw) / 2) - tbx;
|
||||
_display->drawInvertedBitmap(10, y - tbh, myWR, 20, 20, GxEPD_BLACK);
|
||||
x = ((_display->width() - tbw - 20) / 2) - tbx;
|
||||
_display->setCursor(x, y);
|
||||
_display->print(_fmtText);
|
||||
_display->setCursor(_display->width() - 38, y);
|
||||
_display->println("Wh");
|
||||
|
||||
y = y + tbh + 7;
|
||||
_display->setCursor(5, y);
|
||||
_display->print("total:");
|
||||
snprintf(_fmtText, _display->width(), "%.1f", totalYieldTotal);
|
||||
_display->getTextBounds(_fmtText, 0, 0, &tbx, &tby, &tbw, &tbh);
|
||||
x = ((_display->width() - tbw) / 2) - tbx;
|
||||
_display->setCursor(x, y);
|
||||
_display->print(_fmtText);
|
||||
_display->setCursor(_display->width() - 50, y);
|
||||
_display->println("kWh");
|
||||
|
||||
_display->setCursor(10, _display->height() - (mHeadFootPadding + 10));
|
||||
snprintf(_fmtText, sizeof(_fmtText), "%d Inverter online", isprod);
|
||||
_display->println(_fmtText);
|
||||
|
||||
}
|
||||
} while (_display->nextPage());
|
||||
}
|
||||
|
@ -219,10 +281,10 @@ void DisplayEPaper::loop(float totalPower, float totalYieldDay, float totalYield
|
|||
if ((isprod > 0) && (_changed)) {
|
||||
_changed = false;
|
||||
lastUpdatePaged();
|
||||
} else if((0 == totalPower) && (mEnPowerSafe))
|
||||
} else if ((0 == totalPower) && (mEnPowerSafe))
|
||||
offlineFooter();
|
||||
|
||||
_display->powerOff();
|
||||
}
|
||||
//***************************************************************************
|
||||
#endif // ESP32
|
||||
#endif // ESP32
|
||||
|
|
|
@ -24,28 +24,29 @@
|
|||
// GDEH0154D67 1.54" b/w 200x200
|
||||
|
||||
class DisplayEPaper {
|
||||
public:
|
||||
DisplayEPaper();
|
||||
void fullRefresh();
|
||||
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);
|
||||
public:
|
||||
DisplayEPaper();
|
||||
void fullRefresh();
|
||||
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);
|
||||
|
||||
private:
|
||||
void headlineIP();
|
||||
void actualPowerPaged(float _totalPower, float _totalYieldDay, float _totalYieldTotal, uint8_t _isprod);
|
||||
void lastUpdatePaged();
|
||||
void offlineFooter();
|
||||
void versionFooter();
|
||||
|
||||
private:
|
||||
void headlineIP();
|
||||
void actualPowerPaged(float _totalPower, float _totalYieldDay, float _totalYieldTotal, uint8_t _isprod);
|
||||
void lastUpdatePaged();
|
||||
void offlineFooter();
|
||||
|
||||
uint8_t mDisplayRotation;
|
||||
bool _changed = false;
|
||||
char _fmtText[35];
|
||||
const char* _settedIP;
|
||||
uint8_t mHeadFootPadding;
|
||||
GxEPD2_GFX* _display;
|
||||
uint32_t *mUtcTs;
|
||||
bool mEnPowerSafe;
|
||||
uint8_t mDisplayRotation;
|
||||
bool _changed = false;
|
||||
char _fmtText[35];
|
||||
const char* _settedIP;
|
||||
uint8_t mHeadFootPadding;
|
||||
GxEPD2_GFX* _display;
|
||||
uint32_t* mUtcTs;
|
||||
bool mEnPowerSafe;
|
||||
const char* _version;
|
||||
};
|
||||
|
||||
#endif // ESP32
|
||||
#endif // ESP32
|
||||
|
|
|
@ -9,6 +9,47 @@
|
|||
#include <pgmspace.h>
|
||||
#endif
|
||||
|
||||
// 'Sigma', 30x30px
|
||||
const unsigned char mySigma[] PROGMEM = {
|
||||
0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xf0,
|
||||
0x3f, 0x80, 0x07, 0xf0, 0x3f, 0x80, 0x07, 0xf0, 0x3f, 0x9f, 0xe7, 0xf0, 0x3f, 0xcf, 0xe7, 0xf0,
|
||||
0x3f, 0xcf, 0xff, 0xf0, 0x3f, 0xe7, 0xff, 0xf0, 0x3f, 0xe7, 0xff, 0xf0, 0x3f, 0xf3, 0xff, 0xf0,
|
||||
0x3f, 0xf3, 0xff, 0xf0, 0x3f, 0xf9, 0xff, 0xf0, 0x3f, 0xf8, 0xff, 0xf0, 0x3f, 0xf8, 0xff, 0xf0,
|
||||
0x3f, 0xf9, 0xff, 0xf0, 0x3f, 0xf3, 0xff, 0xf0, 0x3f, 0xf3, 0xff, 0xf0, 0x3f, 0xe7, 0xff, 0xf0,
|
||||
0x3f, 0xe7, 0xff, 0xf0, 0x3f, 0xcf, 0xff, 0xf0, 0x3f, 0xcf, 0xe7, 0xf0, 0x3f, 0x9f, 0xe7, 0xf0,
|
||||
0x3f, 0x80, 0x07, 0xf0, 0x3f, 0x80, 0x07, 0xf0, 0x3f, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xf0,
|
||||
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04
|
||||
};
|
||||
// 'Sun', 30x30px
|
||||
const unsigned char mySun[] PROGMEM = {
|
||||
0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xfb, 0xf0,
|
||||
0x3f, 0xfc, 0xfb, 0xf0, 0x3f, 0xfc, 0xfb, 0xf0, 0x3e, 0xfc, 0xf3, 0xf0, 0x3c, 0x7c, 0xf3, 0xf0,
|
||||
0x3e, 0x30, 0x33, 0xf0, 0x3f, 0x0f, 0xcb, 0xf0, 0x3f, 0x9f, 0xeb, 0xf0, 0x3f, 0xbf, 0xeb, 0xf0,
|
||||
0x3f, 0x7f, 0xd8, 0x30, 0x3f, 0x7f, 0xdf, 0xb0, 0x30, 0x7f, 0xdf, 0xb0, 0x30, 0x7f, 0xbf, 0x70,
|
||||
0x3f, 0x7f, 0xbf, 0x70, 0x3f, 0x7f, 0x83, 0x70, 0x3f, 0xbf, 0xf2, 0xf0, 0x3f, 0x9f, 0xe2, 0xf0,
|
||||
0x3f, 0x0f, 0xca, 0xf0, 0x3e, 0x30, 0x39, 0xf0, 0x3c, 0x7c, 0xf9, 0xf0, 0x3e, 0xfc, 0xf9, 0xf0,
|
||||
0x3f, 0xfc, 0xfb, 0xf0, 0x3f, 0xfc, 0xfb, 0xf0, 0x3f, 0xff, 0xfb, 0xf0, 0x3f, 0xff, 0xff, 0xf0,
|
||||
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04
|
||||
};
|
||||
// 'Today', 30x30px
|
||||
const unsigned char myToday[] PROGMEM = {
|
||||
0xf3, 0xff, 0xff, 0x3c, 0xf3, 0xff, 0xff, 0x3c, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
|
||||
0x33, 0xff, 0xff, 0x30, 0x33, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xf0,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xf0,
|
||||
0x3f, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xfc, 0xf0, 0x3f, 0xff, 0xf8, 0xf0, 0x3f, 0xff, 0xf1, 0xf0,
|
||||
0x3f, 0xff, 0xe3, 0xf0, 0x3f, 0xff, 0xc7, 0xf0, 0x3f, 0xff, 0x8f, 0xf0, 0x3f, 0xff, 0x1f, 0xf0,
|
||||
0x3f, 0xfe, 0x3f, 0xf0, 0x3e, 0x7c, 0x7f, 0xf0, 0x3e, 0x38, 0xff, 0xf0, 0x3f, 0x11, 0xff, 0xf0,
|
||||
0x3f, 0x83, 0xff, 0xf0, 0x3f, 0xc7, 0xff, 0xf0, 0x3f, 0xef, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xf0,
|
||||
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x04
|
||||
};
|
||||
// 'WR', 20x20px
|
||||
const unsigned char myWR[] PROGMEM = {
|
||||
0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x3f, 0xff, 0x40, 0x30, 0x7e, 0xc0, 0x3f,
|
||||
0xfd, 0xc0, 0x30, 0x7b, 0xc0, 0x3f, 0xf7, 0xc0, 0x3f, 0xef, 0xc0, 0x3f, 0xdf, 0xc0, 0x3f, 0xbf,
|
||||
0xc0, 0x3f, 0x7f, 0xc0, 0x3e, 0xff, 0xc0, 0x3d, 0xf7, 0xc0, 0x3b, 0xea, 0xc0, 0x37, 0xfd, 0xc0,
|
||||
0x2f, 0xff, 0xc0, 0x1f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10
|
||||
};
|
||||
|
||||
// 'Logo', 200x200px
|
||||
const unsigned char logo[] PROGMEM = {
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue