#pragma once #include #include // 24x24 monochrome bitmaps, 1 bit per pixel, stored row-major (24 bits = 3 bytes per row, 24 rows = 72 bytes each) // Pixels are MSB-first. A 0 bit = black, 1 bit = white (GxEPD2 convention for drawBitmap). // For use with display.drawBitmap(x, y, data, 24, 24, GxEPD_BLACK) // ── Thermometer ───────────────────────────────────────────────────────────── static const unsigned char ICON_THERMOMETER[] PROGMEM = { 0xFF, 0xE7, 0xFF, // row 0 0xFF, 0xC3, 0xFF, // row 1 0xFF, 0xC3, 0xFF, // row 2 0xFF, 0xDB, 0xFF, // row 3 0xFF, 0xDB, 0xFF, // row 4 0xFF, 0xDB, 0xFF, // row 5 0xFF, 0xDB, 0xFF, // row 6 0xFF, 0xDB, 0xFF, // row 7 0xFF, 0xDB, 0xFF, // row 8 0xFF, 0xDB, 0xFF, // row 9 0xFF, 0xDB, 0xFF, // row 10 0xFF, 0xDB, 0xFF, // row 11 0xFF, 0xDB, 0xFF, // row 12 0xFF, 0xDB, 0xFF, // row 13 0xFF, 0xDB, 0xFF, // row 14 0xFE, 0x01, 0x7F, // row 15 0xFC, 0x00, 0x3F, // row 16 0xFC, 0x00, 0x3F, // row 17 0xFC, 0x00, 0x3F, // row 18 0xFC, 0x00, 0x3F, // row 19 0xFE, 0x01, 0x7F, // row 20 0xFF, 0x03, 0xFF, // row 21 0xFF, 0x03, 0xFF, // row 22 0xFF, 0xE7, 0xFF, // row 23 }; // ── Droplet / Humidity ─────────────────────────────────────────────────────── static const unsigned char ICON_DROPLET[] PROGMEM = { 0xFF, 0xFF, 0xFF, // row 0 0xFF, 0xE7, 0xFF, // row 1 0xFF, 0xC3, 0xFF, // row 2 0xFF, 0x81, 0xFF, // row 3 0xFF, 0x00, 0xFF, // row 4 0xFE, 0x00, 0x7F, // row 5 0xFE, 0x00, 0x7F, // row 6 0xFC, 0x00, 0x3F, // row 7 0xFC, 0x00, 0x3F, // row 8 0xFC, 0x00, 0x3F, // row 9 0xFC, 0x00, 0x3F, // row 10 0xFC, 0x00, 0x3F, // row 11 0xFC, 0x00, 0x3F, // row 12 0xFE, 0x00, 0x7F, // row 13 0xFE, 0x00, 0x7F, // row 14 0xFF, 0x00, 0xFF, // row 15 0xFF, 0x81, 0xFF, // row 16 0xFF, 0xC3, 0xFF, // row 17 0xFF, 0xFF, 0xFF, // row 18 0xFF, 0xFF, 0xFF, // row 19 0xFF, 0xFF, 0xFF, // row 20 0xFF, 0xFF, 0xFF, // row 21 0xFF, 0xFF, 0xFF, // row 22 0xFF, 0xFF, 0xFF, // row 23 }; // ── Wind ───────────────────────────────────────────────────────────────────── static const unsigned char ICON_WIND[] PROGMEM = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xFF, 0x9F, 0xFF, 0x7F, 0xFF, 0xFE, 0x7F, 0x80, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; // ── Pressure / Barometer ───────────────────────────────────────────────────── static const unsigned char ICON_PRESSURE[] PROGMEM = { 0xFF, 0xC3, 0xFF, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0x3F, 0xF8, 0x00, 0x1F, 0xF3, 0xFF, 0xCF, 0xE7, 0xFF, 0xE7, 0xEF, 0xFF, 0xF7, 0xEF, 0x03, 0xF7, 0xEF, 0xFD, 0xF7, 0xEF, 0xFD, 0xF7, 0xEF, 0xFF, 0xF7, 0xE7, 0xFF, 0xE7, 0xF3, 0xFF, 0xCF, 0xF8, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFE, 0x00, 0x7F, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; // ── Sun ────────────────────────────────────────────────────────────────────── static const unsigned char ICON_SUN[] PROGMEM = { 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFB, 0xE7, 0xDF, 0xFF, 0xFF, 0xFF, 0xCF, 0x00, 0xF3, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0x3F, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x3F, 0xFE, 0x00, 0x7F, 0xCF, 0x00, 0xF3, 0xFF, 0xFF, 0xFF, 0xFB, 0xE7, 0xDF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; // ── Bolt / Lightning ───────────────────────────────────────────────────────── static const unsigned char ICON_BOLT[] PROGMEM = { 0xFF, 0x87, 0xFF, 0xFF, 0x0F, 0xFF, 0xFE, 0x1F, 0xFF, 0xFC, 0x3F, 0xFF, 0xF8, 0x00, 0xFF, 0xF0, 0x01, 0xFF, 0xE0, 0x03, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x3F, 0xFE, 0x01, 0x7F, 0xFC, 0x03, 0xFF, 0xF8, 0x07, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; // ── Gauge / Speedometer ─────────────────────────────────────────────────────── static const unsigned char ICON_GAUGE[] PROGMEM = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0xFE, 0x00, 0x7F, 0xF8, 0x00, 0x1F, 0xF3, 0xFF, 0xCF, 0xEF, 0xFF, 0xF7, 0xEF, 0x07, 0xF7, 0xEF, 0x03, 0xF7, 0xEF, 0x81, 0xF7, 0xEF, 0xC0, 0xF7, 0xEF, 0xFF, 0xF7, 0xF3, 0xFF, 0xCF, 0xF8, 0x00, 0x1F, 0xFE, 0x00, 0x7F, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; // ── WiFi ───────────────────────────────────────────────────────────────────── static const unsigned char ICON_WIFI[] PROGMEM = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x03, 0x3F, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; // ── Battery ─────────────────────────────────────────────────────────────────── static const unsigned char ICON_BATTERY[] PROGMEM = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xC3, 0xFF, 0xE0, 0x00, 0x07, 0xDF, 0xFF, 0xFB, 0xDF, 0x00, 0xFB, 0xDF, 0x00, 0xFB, 0xDF, 0x00, 0xFB, 0xDF, 0xFF, 0xFB, 0xE0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; // ── Check / Checkmark ──────────────────────────────────────────────────────── static const unsigned char ICON_CHECK[] PROGMEM = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0x9F, 0xE7, 0xFF, 0x3F, 0xCF, 0xFE, 0x7F, 0x9F, 0xFC, 0xFF, 0x3F, 0xF9, 0xFF, 0x7F, 0xF3, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; // ── Warning / Exclamation ───────────────────────────────────────────────────── static const unsigned char ICON_WARNING[] PROGMEM = { 0xFF, 0xE7, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0x00, 0xFF, 0xFE, 0x18, 0x7F, 0xFE, 0x18, 0x7F, 0xFE, 0x18, 0x7F, 0xFC, 0x18, 0x3F, 0xFC, 0x18, 0x3F, 0xFC, 0x18, 0x3F, 0xFC, 0x00, 0x3F, 0xFC, 0x18, 0x3F, 0xFC, 0x18, 0x3F, 0xFE, 0x18, 0x7F, 0xFF, 0x00, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; // ── Clock ───────────────────────────────────────────────────────────────────── static const unsigned char ICON_CLOCK[] PROGMEM = { 0xFF, 0xC3, 0xFF, 0xFE, 0x00, 0x7F, 0xFC, 0x00, 0x3F, 0xF8, 0x00, 0x1F, 0xF3, 0xFF, 0xCF, 0xE7, 0xE7, 0xE7, 0xEF, 0xE7, 0xF7, 0xEF, 0xE7, 0xF7, 0xEF, 0xE0, 0xF7, 0xEF, 0xE0, 0x07, 0xEF, 0xFF, 0xF7, 0xE7, 0xFF, 0xE7, 0xF3, 0xFF, 0xCF, 0xF8, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFE, 0x00, 0x7F, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; // ── Icon registry ───────────────────────────────────────────────────────────── struct IconEntry { const char* name; const unsigned char* data; }; static const IconEntry ICON_TABLE[] = { { "thermometer", ICON_THERMOMETER }, { "droplet", ICON_DROPLET }, { "wind", ICON_WIND }, { "pressure", ICON_PRESSURE }, { "sun", ICON_SUN }, { "bolt", ICON_BOLT }, { "gauge", ICON_GAUGE }, { "wifi", ICON_WIFI }, { "battery", ICON_BATTERY }, { "check", ICON_CHECK }, { "warning", ICON_WARNING }, { "clock", ICON_CLOCK }, }; static const size_t ICON_TABLE_SIZE = sizeof(ICON_TABLE) / sizeof(ICON_TABLE[0]); /** * Look up an icon bitmap by name. * Returns nullptr if the name is not found. */ inline const unsigned char* getIcon(const char* name) { for (size_t i = 0; i < ICON_TABLE_SIZE; ++i) { if (strcmp(name, ICON_TABLE[i].name) == 0) { return ICON_TABLE[i].data; } } return nullptr; } inline const unsigned char* getIcon(const String& name) { return getIcon(name.c_str()); }