ESP32 is here!

Added support for ESP32!
This commit is contained in:
M-Factory
2025-07-29 21:27:18 +09:00
parent 1ba75a7269
commit fbbaecf57a
12 changed files with 3536 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,31 @@
{
"ssid": "",
"password": "",
"openWeatherApiKey": "",
"openWeatherCity": "",
"openWeatherCountry": "",
"clockDuration": 10000,
"weatherDuration": 5000,
"timeZone": "",
"weatherUnits": "metric",
"brightness": 10,
"flipDisplay": false,
"ntpServer1": "pool.ntp.org",
"ntpServer2": "time.nist.gov",
"twelveHourToggle": false,
"showDayOfWeek": true,
"showHumidity": false,
"language": "en",
"dimmingEnabled": false,
"dimStartHour": 18,
"dimStartMinute": 0,
"dimEndHour": 8,
"dimEndMinute": 0,
"dimBrightness": 2,
"showWeatherDescription": false,
"countdown": {
"enabled": false,
"targetTimestamp": 0,
"label": ""
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,49 @@
#ifndef DAYS_LOOKUP_H
#define DAYS_LOOKUP_H
typedef struct {
const char* lang;
const char* days[7]; // Sunday to Saturday (tm_wday order)
} DaysOfWeekMapping;
const DaysOfWeekMapping days_mappings[] = {
{ "af", { "s&u&n", "m&a&a", "d&i&n", "w&o&e", "d&o&n", "v&r&y", "s&o&n" } },
{ "cs", { "n&e&d", "p&o&n", "u&t&e", "s&t&r", "c&t&v", "p&a&t", "s&o&b" } },
{ "da", { "s&o&n", "m&a&n", "t&i&r", "o&n&s", "t&o&r", "f&r&e", "l&o&r" } },
{ "de", { "s&o&n", "m&o&n", "d&i&e", "m&i&t", "d&o&n", "f&r&e", "s&a&m" } },
{ "en", { "s&u&n", "m&o&n", "t&u&e", "w&e&d", "t&h&u", "f&r&i", "s&a&t" } },
{ "eo", { "d&i&m", "l&u&n", "m&a&r", "m&e&r", "j&a&u", "v&e&n", "s&a&b" } },
{ "es", { "d&o&m", "l&u&n", "m&a&r", "m&i&e", "j&u&e", "v&i&e", "s&a&b" } },
{ "et", { "p&a", "e&s", "t&e", "k&o", "n&e", "r&e", "l&a" } },
{ "fi", { "s&u&n", "m&a&a", "t&i&s", "k&e&s", "t&o&r", "p&e&r", "l&a&u" } },
{ "fr", { "d&i&m", "l&u&n", "m&a&r", "m&e&r", "j&e&u", "v&e&n", "s&a&m" } },
{ "hr", { "n&e&d", "p&o&n", "u&t&o", "s&r&i", "c&e&t", "p&e&t", "s&u&b" } },
{ "hu", { "v&a&s", "h&e&t", "k&e&d", "s&z&e", "c&s&u", "p&e&t", "s&z&o" } },
{ "it", { "d&o&m", "l&u&n", "m&a&r", "m&e&r", "g&i&o", "v&e&n", "s&a&b" } },
{ "ja", { "±", "²", "³", "´", "µ", "", "·" } },
{ "lt", { "s&e&k", "p&i&r", "a&n&t", "t&r&e", "k&e&t", "p&e&n", "s&e&s" } },
{ "lv", { "s&v&e", "p&i&r", "o&t&r", "t&r&e", "c&e&t", "p&i&e", "s&e&s" } },
{ "nl", { "z&o&n", "m&a&a", "d&i&n", "w&o&e", "d&o&n", "v&r&i", "z&a&t" } },
{ "no", { "s&o&n", "m&a&n", "t&i&r", "o&n&s", "t&o&r", "f&r&e", "l&o&r" } },
{ "pl", { "n&i&e", "p&o&n", "w&t&o", "s&r&o", "c&z&w", "p&i&a", "s&o&b" } },
{ "pt", { "d&o&m", "s&e&g", "t&e&r", "q&u&a", "q&u&i", "s&e&x", "s&a&b" } },
{ "ro", { "d&u&m", "l&u&n", "m&a&r", "m&i&e", "j&o&i", "v&i&n", "s&a&m" } },
{ "sk", { "n&e&d", "p&o&n", "u&t&o", "s&t&r", "s&t&v", "p&i&a", "s&o&b" } },
{ "sl", { "n&e&d", "p&o&n", "t&o&r", "s&r&e", "c&e&t", "p&e&t", "s&o&b" } },
{ "sv", { "s&o&n", "m&a&n", "t&i&s", "o&n&s", "t&o&r", "f&r&e", "l&o&r" } },
{ "sw", { "j&p&l", "j&u&m", "j&t&t", "j&t&n", "a&l&k", "i&j&m", "j&m&s" } },
{ "tr", { "p&a&z", "p&a&z", "s&a&l", "c&a&r", "p&e&r", "c&u&m", "c&u&m" } }
};
#define DAYS_MAPPINGS_COUNT (sizeof(days_mappings)/sizeof(days_mappings[0]))
inline const char* const* getDaysOfWeek(const char* lang) {
for (size_t i = 0; i < DAYS_MAPPINGS_COUNT; i++) {
if (strcmp(lang, days_mappings[i].lang) == 0)
return days_mappings[i].days;
}
// fallback to English if not found
return days_mappings[4].days; // "en" is index 4
}
#endif // DAYS_LOOKUP_H

View File

@@ -0,0 +1,262 @@
// Data file for user example user defined fonts
#pragma once
MD_MAX72XX::fontType_t mFactory[] PROGMEM =
{
1, 0, // 0 - 'Empty Cell'
1, 0, // 1 - 'Sad Smiley'
1, 0, // 2 - 'Happy Smiley'
1, 0, // 3 - 'Heart'
1, 0, // 4 - 'Diamond'
1, 0, // 5 - 'Clubs'
1, 0, // 6 - 'Spades'
1, 0, // 7 - 'Bullet Point'
1, 0, // 8 - 'Rev Bullet Point'
1, 0, // 9 - 'Hollow Bullet Point'
1, 0, // 10 - 'Rev Hollow BP'
1, 0, // 11 - 'Male'
1, 0, // 12 - 'Female'
1, 0, // 13 - 'Music Note 1'
1, 0, // 14 - 'Music Note 2'
1, 0, // 15 - 'Snowflake'
1, 0, // 16 - 'Right Pointer'
1, 0, // 17 - 'Left Pointer'
1, 0, // 18 - 'UpDown Arrows'
1, 0, // 19 - 'Full Block'
1, 0, // 20 - 'Half Block Bottom'
1, 0, // 21 - 'Half Block LHS'
1, 0, // 22 - 'Half Block RHS'
1, 0, // 23 - 'Half Block Top'
1, 0, // 24 - 'Up Arrow'
1, 0, // 25 - 'Down Arrow'
1, 0, // 26 - 'Right Arrow'
1, 0, // 27 - 'Left Arrow'
1, 0, // 28 - '30% shading'
1, 0, // 29 - '50% shading'
1, 0, // 30 - 'Up Pointer'
1, 0, // 31 - 'Down Pointer'
1, 0, // 32 - 'Space'
1, 94, // 33 - '!'
1, 0, // 34 - '""'
13, 63, 192, 127, 192, 63, 0, 250, 0, 255, 9, 1, 0, 250, // 35 - '#'
16, 72, 84, 36, 0, 12, 112, 12, 0, 124, 4, 120, 0, 56, 68, 68, 0, // 36 - '$'
6, 66, 37, 18, 72, 164, 66, // 37 - '%'
1, 1, // 38 - '&'
1, 6, // 39 - ''
1, 0, // 40 - '('
1, 0, // 41 - ')'
20, 250, 130, 250, 254, 130, 170, 186, 254, 130, 250, 226, 250, 134, 254, 130, 234, 234, 246, 254, 124, // 42 - '*'
1, 0, // 43 - '+'
3, 64, 0, 0, // 44 - ','
2, 8, 8, // 45 - '-'
1, 128, // 46 - '.'
15, 130, 246, 238, 130, 254, 250, 130, 250, 254, 130, 234, 234, 246, 254, 124, // 47 - '/'
3, 126, 129, 126, // 48 - '0'
2, 2, 255, // 49 - '1'
3, 194, 177, 142, // 50 - '2'
3, 66, 137, 118, // 51 - '3'
3, 15, 8, 255, // 52 - '4'
3, 79, 137, 113, // 53 - '5'
3, 126, 137, 114, // 54 - '6'
3, 1, 249, 7, // 55 - '7'
3, 118, 137, 118, // 56 - '8'
3, 78, 145, 126, // 57 - '9'
1, 36, // 58 - ':'
1, 0, // 59 - ';'
1, 0, // 60 - '<'
9, 254, 17, 17, 254, 0, 255, 17, 17, 14, // 61 - '='
1, 0, // 62 - '>'
7, 124, 254, 254, 162, 254, 254, 254, // 63 - '?'
1, 250, // 64 - '@'
3, 124, 10, 124, // 65 - 'A'
3, 126, 74, 52, // 66 - 'B'
3, 60, 66, 66, // 67 - 'C'
3, 126, 66, 60, // 68 - 'D'
3, 126, 74, 66, // 69 - 'E'
3, 126, 10, 2, // 70 - 'F'
3, 60, 82, 116, // 71 - 'G'
3, 126, 8, 126, // 72 - 'H'
1, 126, // 73 - 'I'
3, 32, 64, 62, // 74 - 'J'
3, 126, 8, 118, // 75 - 'K'
3, 126, 64, 64, // 76 - 'L'
3, 126, 4, 126, // 77 - 'M'
3, 126, 2, 124, // 78 - 'N'
3, 60, 66, 60, // 79 - 'O'
3, 126, 18, 12, // 80 - 'P'
3, 60, 66, 124, // 81 - 'Q'
3, 126, 18, 108, // 82 - 'R'
3, 68, 74, 50, // 83 - 'S'
3, 2, 126, 2, // 84 - 'T'
3, 62, 64, 62, // 85 - 'U'
3, 30, 96, 30, // 86 - 'V'
3, 126, 32, 126, // 87 - 'W'
3, 118, 8, 118, // 88 - 'X'
3, 6, 120, 6, // 89 - 'Y'
3, 98, 90, 70, // 90 - 'Z'
4, 126, 129, 129, 66, // 91 - '['
3, 6, 28, 48, // 92 - '\'
4, 255, 9, 9, 1, // 93 - ']'
1, 8, // 94 - '^'
3, 32, 32, 32, // 95 - '_'
4, 255, 8, 20, 227, // 96 - '`'
3, 249, 21, 249, // 97 - 'a'
3, 253, 149, 105, // 98 - 'b'
3, 121, 133, 73, // 99 - 'c'
3, 253, 133, 121, // 100 - 'd'
3, 253, 149, 133, // 101 - 'e'
3, 253, 21, 5, // 102 - 'f'
3, 121, 165, 233, // 103 - 'g'
3, 253, 17, 253, // 104 - 'h'
3, 1, 253, 1, // 105 - 'i'
3, 65, 129, 125, // 106 - 'j'
3, 253, 17, 237, // 107 - 'k'
3, 253, 129, 129, // 108 - 'l'
3, 253, 9, 253, // 109 - 'm'
3, 253, 5, 249, // 110 - 'n'
3, 121, 133, 121, // 111 - 'o'
3, 253, 37, 25, // 112 - 'p'
3, 121, 133, 249, // 113 - 'q'
3, 253, 37, 217, // 114 - 'r'
3, 137, 149, 101, // 115 - 's'
3, 5, 253, 5, // 116 - 't'
3, 125, 129, 125, // 117 - 'u'
3, 61, 193, 61, // 118 - 'v'
3, 253, 65, 253, // 119 - 'w'
3, 237, 17, 237, // 120 - 'x'
3, 13, 241, 13, // 121 - 'y'
3, 197, 181, 141, // 122 - 'z'
16, 255, 253, 129, 253, 255, 129, 255, 129, 251, 129, 255, 129, 181, 189, 255, 249, // 123 - '{'
16, 255, 187, 181, 205, 255, 255, 193, 191, 193, 255, 129, 237, 243, 255, 161, 255, // 124 - '|'
16, 0, 2, 126, 2, 0, 126, 0, 126, 4, 126, 0, 126, 74, 66, 0, 6, // 125 - '}'
16, 0, 68, 74, 50, 0, 0, 62, 64, 62, 0, 126, 18, 12, 0, 94, 0, // 126 - '~'
0, // 127 - ''
0, // 128 - '€'
0, // 129 - ''
0, // 130 - ''
0, // 131 - 'ƒ'
0, // 132 - '„'
0, // 133 - '…'
0, // 134 - '†'
0, // 135 - '‡'
0, // 136 - 'ˆ'
0, // 137 - '‰'
0, // 138 - 'Š'
0, // 139 - ''
0, // 140 - 'Œ'
0, // 141 - ''
0, // 142 - 'Ž'
0, // 143 - ''
0, // 144 - ''
2, 4, 126, // 145 - ''
3, 100, 82, 76, // 146 - ''
3, 66, 74, 52, // 147 - '“'
3, 14, 8, 126, // 148 - '”'
3, 78, 74, 50, // 149 - '•'
3, 60, 74, 52, // 150 - ''
3, 2, 122, 6, // 151 - '—'
3, 52, 74, 52, // 152 - '˜'
3, 12, 82, 60, // 153 - '™'
3, 60, 66, 60, // 154 - 'š'
0, // 155 - ''
0, // 156 - 'œ'
0, // 157 - ''
0, // 158 - 'ž'
0, // 159 - 'Ÿ'
0, // 160 - ''
5, 227, 151, 143, 151, 227, // 161 - '¡'
5, 227, 149, 157, 149, 227, // 162 - '¢'
5, 227, 181, 185, 181, 227, // 163 - '£'
5, 227, 245, 249, 245, 227, // 164 - '¤'
0, // 165 - '¥'
0, // 166 - '¦'
0, // 167 - '§'
0, // 168 - '¨'
8, 224, 224, 0, 0, 0, 0, 0, 0, // 169 - '©'
8, 224, 224, 0, 252, 252, 0, 0, 0, // 170 - 'ª'
8, 224, 224, 0, 252, 252, 0, 255, 255, // 171 - '«'
0, // 172 - '¬'
0, // 173 - '­'
5, 64, 0, 0, 0, 0, // 174 - '®'
5, 64, 0, 64, 0, 0, // 175 - '¯'
5, 64, 0, 64, 0, 64, // 176 - '°'
5, 254, 146, 146, 146, 254, // 177 - '±'
6, 128, 126, 42, 42, 170, 254, // 178 - '²'
7, 128, 152, 64, 62, 80, 136, 128, // 179 - '³'
7, 72, 40, 152, 254, 16, 40, 68, // 180 - '´'
7, 68, 36, 20, 254, 20, 36, 68, // 181 - 'µ'
7, 168, 232, 172, 250, 172, 232, 168, // 182 - '¶'
7, 128, 136, 136, 254, 136, 136, 128, // 183 - '·'
0, // 184 - '¸'
0, // 185 - '¹'
3, 4, 10, 4, // 186 - 'º'
0, // 187 - '»'
0, // 188 - '¼'
0, // 189 - '½'
0, // 190 - '¾'
0, // 191 - '¿'
0, // 192 - 'À'
0, // 193 - 'Á'
0, // 194 - 'Â'
0, // 195 - 'Ã'
0, // 196 - 'Ä'
0, // 197 - 'Å'
0, // 198 - 'Æ'
0, // 199 - 'Ç'
0, // 200 - 'È'
0, // 201 - 'É'
0, // 202 - 'Ê'
0, // 203 - 'Ë'
0, // 204 - 'Ì'
0, // 205 - 'Í'
0, // 206 - 'Î'
0, // 207 - 'Ï'
0, // 208 - 'Ð'
0, // 209 - 'Ñ'
0, // 210 - 'Ò'
0, // 211 - 'Ó'
0, // 212 - 'Ô'
0, // 213 - 'Õ'
0, // 214 - 'Ö'
0, // 215 - '×'
0, // 216 - 'Ø'
0, // 217 - 'Ù'
0, // 218 - 'Ú'
0, // 219 - 'Û'
0, // 220 - 'Ü'
0, // 221 - 'Ý'
0, // 222 - 'Þ'
0, // 223 - 'ß'
0, // 224 - 'à'
0, // 225 - 'á'
0, // 226 - 'â'
0, // 227 - 'ã'
0, // 228 - 'ä'
0, // 229 - 'å'
0, // 230 - 'æ'
0, // 231 - 'ç'
0, // 232 - 'è'
0, // 233 - 'é'
0, // 234 - 'ê'
0, // 235 - 'ë'
0, // 236 - 'ì'
0, // 237 - 'í'
0, // 238 - 'î'
0, // 239 - 'ï'
0, // 240 - 'ð'
0, // 241 - 'ñ'
0, // 242 - 'ò'
0, // 243 - 'ó'
0, // 244 - 'ô'
0, // 245 - 'õ'
0, // 246 - 'ö'
0, // 247 - '÷'
0, // 248 - 'ø'
0, // 249 - 'ù'
0, // 250 - 'ú'
0, // 251 - 'û'
0, // 252 - 'ü'
0, // 253 - 'ý'
0, // 254 - 'þ'
0, // 255 - 'ÿ'
};

View File

@@ -0,0 +1,104 @@
#ifndef TZ_LOOKUP_H
#define TZ_LOOKUP_H
typedef struct {
const char* iana;
const char* posix;
} TimeZoneMapping;
const TimeZoneMapping tz_mappings[] = {
{"Africa/Cairo", "EET-2EEST,M4.5.5/0,M10.5.5/0"},
{"Africa/Casablanca", "WET0WEST,M3.5.0/0,M10.5.0/0"},
{"Africa/Johannesburg", "SAST-2"},
{"America/Anchorage", "AKST9AKDT,M3.2.0,M11.1.0"},
{"America/Argentina/Buenos_Aires", "ART3"},
{"America/Chicago", "CST6CDT,M3.2.0,M11.1.0"},
{"America/Denver", "MST7MDT,M3.2.0,M11.1.0"},
{"America/Guatemala", "CST6"},
{"America/Halifax", "AST4ADT,M3.2.0,M11.1.0"},
{"America/Los_Angeles", "PST8PDT,M3.2.0,M11.1.0"},
{"America/Mexico_City", "CST6CDT,M4.1.0,M10.5.0"},
{"America/New_York", "EST5EDT,M3.2.0,M11.1.0"},
{"America/Phoenix", "MST7"},
{"America/Santiago", "CLT4CLST,M9.1.6/24,M4.1.6/24"},
{"America/Sao_Paulo", "BRT3"},
{"America/St_Johns", "NST3:30NDT,M3.2.0,M11.1.0"},
{"America/Toronto", "EST5EDT,M3.2.0,M11.1.0"},
{"America/Vancouver", "PST8PDT,M3.2.0,M11.1.0"},
{"Asia/Almaty", "ALMT-6"},
{"Asia/Amman", "EET-2EEST,M3.5.4/24,M10.5.5/1"},
{"Asia/Baghdad", "AST-3"},
{"Asia/Bangkok", "ICT-7"},
{"Asia/Beirut", "EET-2EEST,M3.5.0/0,M10.5.0/0"},
{"Asia/Dhaka", "BDT-6"},
{"Asia/Dubai", "GST-4"},
{"Asia/Ho_Chi_Minh", "ICT-7"},
{"Asia/Hong_Kong", "HKT-8"},
{"Asia/Jakarta", "WIB-7"},
{"Asia/Jerusalem", "IST-2IDT,M3.4.4/26,M10.5.0"},
{"Asia/Karachi", "PKT-5"},
{"Asia/Kathmandu", "NPT-5:45"},
{"Asia/Kolkata", "IST-5:30"},
{"Asia/Kuala_Lumpur", "MYT-8"},
{"Asia/Manila", "PST-8"},
{"Asia/Seoul", "KST-9"},
{"Asia/Shanghai", "CST-8"},
{"Asia/Singapore", "SGT-8"},
{"Asia/Taipei", "CST-8"},
{"Asia/Tashkent", "UZT-5"},
{"Asia/Tokyo", "JST-9"},
{"Asia/Ulaanbaatar", "ULAT-8"},
{"Asia/Yekaterinburg", "YEKT-5"},
{"Atlantic/Azores", "AZOT1AZOST,M3.5.0/0,M10.5.0/0"},
{"Atlantic/Reykjavik", "GMT0"},
{"Australia/Adelaide", "ACST-9:30ACDT,M10.1.0,M4.1.0"},
{"Australia/Brisbane", "AEST-10"},
{"Australia/Darwin", "ACST-9:30"},
{"Australia/Hobart", "AEST-10AEDT,M10.1.0,M4.1.0"},
{"Australia/Melbourne", "AEST-10AEDT,M10.1.0,M4.1.0"},
{"Australia/Perth", "AWST-8"},
{"Australia/Sydney", "AEST-10AEDT,M10.1.0,M4.1.0"},
{"Europe/Amsterdam", "CET-1CEST,M3.5.0,M10.5.0/3"},
{"Europe/Athens", "EET-2EEST,M3.5.0/3,M10.5.0/4"},
{"Europe/Belgrade", "CET-1CEST,M3.5.0,M10.5.0/3"},
{"Europe/Berlin", "CET-1CEST,M3.5.0,M10.5.0/3"},
{"Europe/Brussels", "CET-1CEST,M3.5.0,M10.5.0/3"},
{"Europe/Bucharest", "EET-2EEST,M3.5.0/3,M10.5.0/4"},
{"Europe/Copenhagen", "CET-1CEST,M3.5.0,M10.5.0/3"},
{"Europe/Dublin", "GMT0IST,M3.5.0/1,M10.5.0"},
{"Europe/Helsinki", "EET-2EEST,M3.5.0/3,M10.5.0/4"},
{"Europe/Istanbul", "TRT-3"},
{"Europe/Kiev", "EET-2EEST,M3.5.0/3,M10.5.0/4"},
{"Europe/Lisbon", "WET0WEST,M3.5.0/0,M10.5.0/0"},
{"Europe/London", "GMT0BST,M3.5.0/1,M10.5.0"},
{"Europe/Madrid", "CET-1CEST,M3.5.0,M10.5.0/3"},
{"Europe/Moscow", "MSK-3"},
{"Europe/Oslo", "CET-1CEST,M3.5.0,M10.5.0/3"},
{"Europe/Paris", "CET-1CEST,M3.5.0,M10.5.0/3"},
{"Europe/Prague", "CET-1CEST,M3.5.0,M10.5.0/3"},
{"Europe/Rome", "CET-1CEST,M3.5.0,M10.5.0/3"},
{"Europe/Stockholm", "CET-1CEST,M3.5.0,M10.5.0/3"},
{"Europe/Warsaw", "CET-1CEST,M3.5.0,M10.5.0/3"},
{"Pacific/Auckland", "NZST-12NZDT,M9.5.0,M4.1.0"},
{"Pacific/Chatham", "CHAST-12:45CHADT,M9.5.0,M4.1.0/3"},
{"Pacific/Fiji", "FJT-12"},
{"Pacific/Guam", "ChST-10"},
{"Pacific/Honolulu", "HST10"},
{"Pacific/Port_Moresby", "PGT-10"},
{"Pacific/Tahiti", "TAHT10"},
{"UTC", "UTC0"},
{"Etc/GMT+1", "GMT-1"},
{"Etc/GMT-1", "GMT+1"}
};
#define TZ_MAPPINGS_COUNT (sizeof(tz_mappings)/sizeof(tz_mappings[0]))
inline const char* ianaToPosix(const char* iana) {
for (size_t i = 0; i < TZ_MAPPINGS_COUNT; i++) {
if (strcmp(iana, tz_mappings[i].iana) == 0)
return tz_mappings[i].posix;
}
return "UTC0"; // fallback
}
#endif // TZ_LOOKUP_H