├── Images ├── Display1.jpg ├── Wiring_ILI9341.jpg └── Wiring__WemosD1.jpg ├── Casing ├── Power display box.stl ├── Display tilted back.stl ├── Display tilted front.stl └── Power display box lid.stl ├── LICENSE ├── settings.h ├── README.md ├── Free_Fonts.h ├── PowerDisplayHomeAssistant.ino └── icons.h /Images/Display1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johannyren/PowerDisplayHomeAssistant/HEAD/Images/Display1.jpg -------------------------------------------------------------------------------- /Images/Wiring_ILI9341.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johannyren/PowerDisplayHomeAssistant/HEAD/Images/Wiring_ILI9341.jpg -------------------------------------------------------------------------------- /Casing/Power display box.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johannyren/PowerDisplayHomeAssistant/HEAD/Casing/Power display box.stl -------------------------------------------------------------------------------- /Images/Wiring__WemosD1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johannyren/PowerDisplayHomeAssistant/HEAD/Images/Wiring__WemosD1.jpg -------------------------------------------------------------------------------- /Casing/Display tilted back.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johannyren/PowerDisplayHomeAssistant/HEAD/Casing/Display tilted back.stl -------------------------------------------------------------------------------- /Casing/Display tilted front.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johannyren/PowerDisplayHomeAssistant/HEAD/Casing/Display tilted front.stl -------------------------------------------------------------------------------- /Casing/Power display box lid.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johannyren/PowerDisplayHomeAssistant/HEAD/Casing/Power display box lid.stl -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 johannyren 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /settings.h: -------------------------------------------------------------------------------- 1 | // Modify the settings in this file to suit your network, your Home Assistant installation 2 | // and your personal preferences: 3 | 4 | // Define the price levels (SEK/kWh) 5 | #define VERY_CHEAP 0.5 6 | #define CHEAP 1.0 7 | #define NORMAL 1.5 8 | #define EXPENSIVE 3.0 9 | #define VERY_EXPENSIVE 4.0 10 | #define EXTREMELY_EXPENSIVE 5.0 11 | 12 | // Enter just the base of the URL to Home Assistant (not http://) 13 | #define HA_HOST "" 14 | 15 | // Set to true if using https, otherwise set to false. 16 | #define SECURE_SERVER true 17 | 18 | // For HTTPS requests. Uncomment if using https. 19 | // WiFiClientSecure client; 20 | 21 | // Important! If using https, also uncomment the line 22 | // client.setInsecure(); 23 | // in the setup() function in PowerDisplayHomeAssist.ino 24 | 25 | 26 | // For HTTPS requests only. OPTIONAL - The fingerprint of the site you want to connect to. 27 | //#define HA_HOST_FINGERPRINT "BC 73 A5 9C 6E EE 38 43 A6 37 FC 32 CF 08 16 DC CF F1 5A 66" 28 | 29 | // For HTTP requests. Comment if using https. 30 | WiFiClient client; 31 | 32 | // Your Home Assistant bearer token. https://www.home-assistant.io/docs/authentication/ 33 | String bearerToken = ""; 34 | 35 | 36 | 37 | // Set up your sensors, as they are named in your Home Assistant installation 38 | //#define SENSOR_CURRENT_CONSUMPTION "sensor.house_power_consumption" // If using Home Assistant Glow pulse counter. https://klaasnicolaas.github.io/home-assistant-glow/ 39 | #define SENSOR_CURRENT_CONSUMPTION "sensor.momentary_active_import" // If using ESPHome HAN port reader https://github.com/psvanstrom/esphome-p1reader 40 | #define SENSOR_POWER_MULTIPLIER 1 // Convert between kW and W, if needed. If the consumption is in kW then change this to 1000. 41 | #define SENSOR_CONSUMPTION_TODAY "sensor.forbrukning_huset_per_dag" // From Tibber 42 | #define SENSOR_ELECTRICITY_PRICE "sensor.nordpool" // From NordPool, but you can also use Tibber 43 | #define SENSOR_NORDPOOL "sensor.nordpool" // Expecting Home Assistant NordPool Integration. https://github.com/custom-components/nordpool 44 | 45 | #define SOLAR_PANELS true // Change to true if using solar panels, and add the sensor below. 46 | #define SENSOR_CURRENT_PRODUCTION "sensor.momentary_active_export" // If using ESPHome HAN port reader https://github.com/psvanstrom/esphome-p1reader 47 | 48 | 49 | // Home assistant 50 | char ssid[] = ""; // your network SSID (name) 51 | char password[] = ""; // your network key 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PowerDisplayHomeAssistant 2 | 3 | ### Update: This display is now ported to ESPHome, which has many benefits over this implementation. I recommend using that instead, although it will require an ESP32 instead of an ESP8266. This implementation works but will no longer be maintained. See link: [https://github.com/johannyren/PowerDisplayESPHome] 4 | 5 | 6 | This is a small display that shows the current electricity consumption, together with a graph of the today's electricity price, using either NordPool or Tibber. The software pulls the data from a Home Assistant instance, so all sources must be available there. 7 |

8 | 9 |

10 | 11 | ![alt text](https://github.com/johannyren/PowerDisplayHomeAssistant/blob/main/Images/Display1.jpg?raw=true) 12 | 13 | The hardware consists of a Wemos D1 Mini and a ILI9341 display. 14 | 15 | ## Wiring of the ILI9341: 16 | 17 | ``` 18 | ILI9341 -> WEMOS D1 19 | VCC -> 3.3V 20 | GND -> GND 21 | CS -> D2 (GPIO4) 22 | RESET -> D3 (GPIO0) 23 | D/C -> D4 (GPIO2) 24 | SDI(MOSI) -> D7 (GPIO13) 25 | SCK -> D5 (GPIO14) 26 | LED -> 3.3V 27 | ``` 28 |

29 | 30 |

31 | 32 | ![alt text](https://github.com/johannyren/PowerDisplayHomeAssistant/blob/main/Images/Wiring_ILI9341.jpg?raw=true) 33 | 34 | 35 | ![alt text](https://github.com/johannyren/PowerDisplayHomeAssistant/blob/main/Images/Wiring__WemosD1.jpg?raw=true) 36 | 37 | ## Libraries 38 | This sketch id using the library TFT_eSPI (https://github.com/Bodmer/TFT_eWidget) 39 | Be sure to update the file User_Setup.h in the \libraries\TFT_eSPI folder to set pin numbers. 40 | 41 | To match the pin numbers for the ILI9341 wiring above, use the following: 42 | ``` 43 | // For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation 44 | #define TFT_CS PIN_D2 // Chip select control pin 45 | #define TFT_DC PIN_D4 // Data Command control pin 46 | #define TFT_RST PIN_D3 // Reset pin (could connect to NodeMCU RST, see next line) 47 | ``` 48 | ## Datasources and connection to Home Assistant 49 | Data sources from Home Assistant are defined in settings.h, together with WiFi details and bearer token for accessing Home Assistant. 50 | 51 | Icons for Grid and Solar symbols are defined in icons.h. A few variants are available - choose the ones you prefer. 52 | 53 | ## Casing 54 | STL files are available for 3D printing a casing for the display. Two variants - one straight for putting on a wall, and one tilted, optimal for a desktop display. 55 | 56 | 57 | -------------------------------------------------------------------------------- /Free_Fonts.h: -------------------------------------------------------------------------------- 1 | // Attach this header file to your sketch to use the GFX Free Fonts. You can write 2 | // sketches without it, but it makes referencing them easier. 3 | 4 | // This calls up ALL the fonts but they only get loaded if you actually 5 | // use them in your sketch. 6 | // 7 | // No changes are needed to this header file unless new fonts are added to the 8 | // library "Fonts/GFXFF" folder. 9 | // 10 | // To save a lot of typing long names, each font can easily be referenced in the 11 | // sketch in three ways, either with: 12 | // 13 | // 1. Font file name with the & in front such as &FreeSansBoldOblique24pt7b 14 | // an example being: 15 | // 16 | // tft.setFreeFont(&FreeSansBoldOblique24pt7b); 17 | // 18 | // 2. FF# where # is a number determined by looking at the list below 19 | // an example being: 20 | // 21 | // tft.setFreeFont(FF32); 22 | // 23 | // 3. An abbreviation of the file name. Look at the list below to see 24 | // the abbreviations used, for example: 25 | // 26 | // tft.setFreeFont(FSSBO24) 27 | // 28 | // Where the letters mean: 29 | // F = Free font 30 | // M = Mono 31 | // SS = Sans Serif (double S to distinguish is form serif fonts) 32 | // S = Serif 33 | // B = Bold 34 | // O = Oblique (letter O not zero) 35 | // I = Italic 36 | // # = point size, either 9, 12, 18 or 24 37 | // 38 | // Setting the font to NULL will select the GLCD font: 39 | // 40 | // tft.setFreeFont(NULL); // Set font to GLCD 41 | 42 | #define LOAD_GFXFF 43 | 44 | #ifdef LOAD_GFXFF // Only include the fonts if LOAD_GFXFF is defined in User_Setup.h 45 | 46 | // Use these when printing or drawing text in GLCD and high rendering speed fonts 47 | #define GFXFF 1 48 | #define GLCD 0 49 | #define FONT2 2 50 | #define FONT4 4 51 | #define FONT6 6 52 | #define FONT7 7 53 | #define FONT8 8 54 | 55 | // Use the following when calling setFont() 56 | // 57 | // Reserved for GLCD font // FF0 58 | // 59 | 60 | #define TT1 &TomThumb 61 | 62 | #define FM9 &FreeMono9pt7b 63 | #define FM12 &FreeMono12pt7b 64 | #define FM18 &FreeMono18pt7b 65 | #define FM24 &FreeMono24pt7b 66 | 67 | #define FMB9 &FreeMonoBold9pt7b 68 | #define FMB12 &FreeMonoBold12pt7b 69 | #define FMB18 &FreeMonoBold18pt7b 70 | #define FMB24 &FreeMonoBold24pt7b 71 | 72 | #define FMO9 &FreeMonoOblique9pt7b 73 | #define FMO12 &FreeMonoOblique12pt7b 74 | #define FMO18 &FreeMonoOblique18pt7b 75 | #define FMO24 &FreeMonoOblique24pt7b 76 | 77 | #define FMBO9 &FreeMonoBoldOblique9pt7b 78 | #define FMBO12 &FreeMonoBoldOblique12pt7b 79 | #define FMBO18 &FreeMonoBoldOblique18pt7b 80 | #define FMBO24 &FreeMonoBoldOblique24pt7b 81 | 82 | #define FSS9 &FreeSans9pt7b 83 | #define FSS12 &FreeSans12pt7b 84 | #define FSS18 &FreeSans18pt7b 85 | #define FSS24 &FreeSans24pt7b 86 | 87 | #define FSSB9 &FreeSansBold9pt7b 88 | #define FSSB12 &FreeSansBold12pt7b 89 | #define FSSB18 &FreeSansBold18pt7b 90 | #define FSSB24 &FreeSansBold24pt7b 91 | 92 | #define FSSO9 &FreeSansOblique9pt7b 93 | #define FSSO12 &FreeSansOblique12pt7b 94 | #define FSSO18 &FreeSansOblique18pt7b 95 | #define FSSO24 &FreeSansOblique24pt7b 96 | 97 | #define FSSBO9 &FreeSansBoldOblique9pt7b 98 | #define FSSBO12 &FreeSansBoldOblique12pt7b 99 | #define FSSBO18 &FreeSansBoldOblique18pt7b 100 | #define FSSBO24 &FreeSansBoldOblique24pt7b 101 | 102 | #define FS9 &FreeSerif9pt7b 103 | #define FS12 &FreeSerif12pt7b 104 | #define FS18 &FreeSerif18pt7b 105 | #define FS24 &FreeSerif24pt7b 106 | 107 | #define FSI9 &FreeSerifItalic9pt7b 108 | #define FSI12 &FreeSerifItalic12pt7b 109 | #define FSI19 &FreeSerifItalic18pt7b 110 | #define FSI24 &FreeSerifItalic24pt7b 111 | 112 | #define FSB9 &FreeSerifBold9pt7b 113 | #define FSB12 &FreeSerifBold12pt7b 114 | #define FSB18 &FreeSerifBold18pt7b 115 | #define FSB24 &FreeSerifBold24pt7b 116 | 117 | #define FSBI9 &FreeSerifBoldItalic9pt7b 118 | #define FSBI12 &FreeSerifBoldItalic12pt7b 119 | #define FSBI18 &FreeSerifBoldItalic18pt7b 120 | #define FSBI24 &FreeSerifBoldItalic24pt7b 121 | 122 | #define FF0 NULL //ff0 reserved for GLCD 123 | #define FF1 &FreeMono9pt7b 124 | #define FF2 &FreeMono12pt7b 125 | #define FF3 &FreeMono18pt7b 126 | #define FF4 &FreeMono24pt7b 127 | 128 | #define FF5 &FreeMonoBold9pt7b 129 | #define FF6 &FreeMonoBold12pt7b 130 | #define FF7 &FreeMonoBold18pt7b 131 | #define FF8 &FreeMonoBold24pt7b 132 | 133 | #define FF9 &FreeMonoOblique9pt7b 134 | #define FF10 &FreeMonoOblique12pt7b 135 | #define FF11 &FreeMonoOblique18pt7b 136 | #define FF12 &FreeMonoOblique24pt7b 137 | 138 | #define FF13 &FreeMonoBoldOblique9pt7b 139 | #define FF14 &FreeMonoBoldOblique12pt7b 140 | #define FF15 &FreeMonoBoldOblique18pt7b 141 | #define FF16 &FreeMonoBoldOblique24pt7b 142 | 143 | #define FF17 &FreeSans9pt7b 144 | #define FF18 &FreeSans12pt7b 145 | #define FF19 &FreeSans18pt7b 146 | #define FF20 &FreeSans24pt7b 147 | 148 | #define FF21 &FreeSansBold9pt7b 149 | #define FF22 &FreeSansBold12pt7b 150 | #define FF23 &FreeSansBold18pt7b 151 | #define FF24 &FreeSansBold24pt7b 152 | 153 | #define FF25 &FreeSansOblique9pt7b 154 | #define FF26 &FreeSansOblique12pt7b 155 | #define FF27 &FreeSansOblique18pt7b 156 | #define FF28 &FreeSansOblique24pt7b 157 | 158 | #define FF29 &FreeSansBoldOblique9pt7b 159 | #define FF30 &FreeSansBoldOblique12pt7b 160 | #define FF31 &FreeSansBoldOblique18pt7b 161 | #define FF32 &FreeSansBoldOblique24pt7b 162 | 163 | #define FF33 &FreeSerif9pt7b 164 | #define FF34 &FreeSerif12pt7b 165 | #define FF35 &FreeSerif18pt7b 166 | #define FF36 &FreeSerif24pt7b 167 | 168 | #define FF37 &FreeSerifItalic9pt7b 169 | #define FF38 &FreeSerifItalic12pt7b 170 | #define FF39 &FreeSerifItalic18pt7b 171 | #define FF40 &FreeSerifItalic24pt7b 172 | 173 | #define FF41 &FreeSerifBold9pt7b 174 | #define FF42 &FreeSerifBold12pt7b 175 | #define FF43 &FreeSerifBold18pt7b 176 | #define FF44 &FreeSerifBold24pt7b 177 | 178 | #define FF45 &FreeSerifBoldItalic9pt7b 179 | #define FF46 &FreeSerifBoldItalic12pt7b 180 | #define FF47 &FreeSerifBoldItalic18pt7b 181 | #define FF48 &FreeSerifBoldItalic24pt7b 182 | 183 | // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 184 | // Now we define "s"tring versions for easy printing of the font name so: 185 | // tft.println(sFF5); 186 | // will print 187 | // Mono bold 9 188 | // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 189 | 190 | #define sFF0 "GLCD" 191 | #define sTT1 "Tom Thumb" 192 | #define sFF1 "Mono 9" 193 | #define sFF2 "Mono 12" 194 | #define sFF3 "Mono 18" 195 | #define sFF4 "Mono 24" 196 | 197 | #define sFF5 "Mono bold 9" 198 | #define sFF6 "Mono bold 12" 199 | #define sFF7 "Mono bold 18" 200 | #define sFF8 "Mono bold 24" 201 | 202 | #define sFF9 "Mono oblique 9" 203 | #define sFF10 "Mono oblique 12" 204 | #define sFF11 "Mono oblique 18" 205 | #define sFF12 "Mono oblique 24" 206 | 207 | #define sFF13 "Mono bold oblique 9" 208 | #define sFF14 "Mono bold oblique 12" 209 | #define sFF15 "Mono bold oblique 18" 210 | #define sFF16 "Mono bold oblique 24" // Full text line is too big for 480 pixel wide screen 211 | 212 | #define sFF17 "Sans 9" 213 | #define sFF18 "Sans 12" 214 | #define sFF19 "Sans 18" 215 | #define sFF20 "Sans 24" 216 | 217 | #define sFF21 "Sans bold 9" 218 | #define sFF22 "Sans bold 12" 219 | #define sFF23 "Sans bold 18" 220 | #define sFF24 "Sans bold 24" 221 | 222 | #define sFF25 "Sans oblique 9" 223 | #define sFF26 "Sans oblique 12" 224 | #define sFF27 "Sans oblique 18" 225 | #define sFF28 "Sans oblique 24" 226 | 227 | #define sFF29 "Sans bold oblique 9" 228 | #define sFF30 "Sans bold oblique 12" 229 | #define sFF31 "Sans bold oblique 18" 230 | #define sFF32 "Sans bold oblique 24" 231 | 232 | #define sFF33 "Serif 9" 233 | #define sFF34 "Serif 12" 234 | #define sFF35 "Serif 18" 235 | #define sFF36 "Serif 24" 236 | 237 | #define sFF37 "Serif italic 9" 238 | #define sFF38 "Serif italic 12" 239 | #define sFF39 "Serif italic 18" 240 | #define sFF40 "Serif italic 24" 241 | 242 | #define sFF41 "Serif bold 9" 243 | #define sFF42 "Serif bold 12" 244 | #define sFF43 "Serif bold 18" 245 | #define sFF44 "Serif bold 24" 246 | 247 | #define sFF45 "Serif bold italic 9" 248 | #define sFF46 "Serif bold italic 12" 249 | #define sFF47 "Serif bold italic 18" 250 | #define sFF48 "Serif bold italic 24" 251 | 252 | #else // LOAD_GFXFF not defined so setup defaults to prevent error messages 253 | 254 | // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 255 | // Free fonts are not loaded in User_Setup.h so we must define all as font 1 256 | // to prevent compile error messages 257 | // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 258 | 259 | #define GFXFF 1 260 | #define GLCD 1 261 | #define FONT2 2 262 | #define FONT4 4 263 | #define FONT6 6 264 | #define FONT7 7 265 | #define FONT8 8 266 | 267 | #define FF0 1 268 | #define FF1 1 269 | #define FF2 1 270 | #define FF3 1 271 | #define FF4 1 272 | #define FF5 1 273 | #define FF6 1 274 | #define FF7 1 275 | #define FF8 1 276 | #define FF9 1 277 | #define FF10 1 278 | #define FF11 1 279 | #define FF12 1 280 | #define FF13 1 281 | #define FF14 1 282 | #define FF15 1 283 | #define FF16 1 284 | #define FF17 1 285 | #define FF18 1 286 | #define FF19 1 287 | #define FF20 1 288 | #define FF21 1 289 | #define FF22 1 290 | #define FF23 1 291 | #define FF24 1 292 | #define FF25 1 293 | #define FF26 1 294 | #define FF27 1 295 | #define FF28 1 296 | #define FF29 1 297 | #define FF30 1 298 | #define FF31 1 299 | #define FF32 1 300 | #define FF33 1 301 | #define FF34 1 302 | #define FF35 1 303 | #define FF36 1 304 | #define FF37 1 305 | #define FF38 1 306 | #define FF39 1 307 | #define FF40 1 308 | #define FF41 1 309 | #define FF42 1 310 | #define FF43 1 311 | #define FF44 1 312 | #define FF45 1 313 | #define FF46 1 314 | #define FF47 1 315 | #define FF48 1 316 | 317 | #define FM9 1 318 | #define FM12 1 319 | #define FM18 1 320 | #define FM24 1 321 | 322 | #define FMB9 1 323 | #define FMB12 1 324 | #define FMB18 1 325 | #define FMB24 1 326 | 327 | #define FMO9 1 328 | #define FMO12 1 329 | #define FMO18 1 330 | #define FMO24 1 331 | 332 | #define FMBO9 1 333 | #define FMBO12 1 334 | #define FMBO18 1 335 | #define FMBO24 1 336 | 337 | #define FSS9 1 338 | #define FSS12 1 339 | #define FSS18 1 340 | #define FSS24 1 341 | 342 | #define FSSB9 1 343 | #define FSSB12 1 344 | #define FSSB18 1 345 | #define FSSB24 1 346 | 347 | #define FSSO9 1 348 | #define FSSO12 1 349 | #define FSSO18 1 350 | #define FSSO24 1 351 | 352 | #define FSSBO9 1 353 | #define FSSBO12 1 354 | #define FSSBO18 1 355 | #define FSSBO24 1 356 | 357 | #define FS9 1 358 | #define FS12 1 359 | #define FS18 1 360 | #define FS24 1 361 | 362 | #define FSI9 1 363 | #define FSI12 1 364 | #define FSI19 1 365 | #define FSI24 1 366 | 367 | #define FSB9 1 368 | #define FSB12 1 369 | #define FSB18 1 370 | #define FSB24 1 371 | 372 | #define FSBI9 1 373 | #define FSBI12 1 374 | #define FSBI18 1 375 | #define FSBI24 1 376 | 377 | #endif // LOAD_GFXFF 378 | -------------------------------------------------------------------------------- /PowerDisplayHomeAssistant.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include "Free_Fonts.h" // Include the header file attached to this sketch 7 | #include "SPI.h" 8 | #include "TFT_eSPI.h" // https://github.com/Bodmer/TFT_eWidget 9 | #include // Widget library 10 | #include "icons.h" 11 | #include "settings.h" 12 | #define BLANKTEXT " " // Text that will be printed on screen in any font 13 | 14 | // Define colours used in graph etc. 15 | #define DKGREY 0x4A49 16 | #define LTGREY 0xE71C 17 | #define LTBLUE 0xB6DF 18 | #define LTTEAL 0xBF5F 19 | #define LTGREEN 0xBFF7 20 | #define LTCYAN 0xC7FF 21 | #define LTRED 0xFD34 22 | #define LTMAGENTA 0xFD5F 23 | #define LTYELLOW 0xFFF8 24 | #define LTORANGE 0xFE73 25 | #define LTPINK 0xFDDF 26 | #define LTPURPLE 0xCCFF 27 | #define LTGREY 0xE71C 28 | #define BLUE 0x001F 29 | #define TEAL 0x0438 30 | #define GREEN 0x07E0 31 | #define CYAN 0x07FF 32 | #define RED 0xF800 33 | #define MAGENTA 0xF81F 34 | #define YELLOW 0xFFE0 35 | #define ORANGE 0xFC00 36 | #define PINK 0xF81F 37 | #define PURPLE 0x8010 38 | #define GREY 0xC618 39 | #define WHITE 0xFFFF 40 | #define BLACK 0x0000 41 | 42 | #define DKBLUE 0x000D 43 | #define DKTEAL 0x020C 44 | #define DKGREEN 0x03E0 45 | #define DKCYAN 0x03EF 46 | #define DKRED 0x6000 47 | #define DKMAGENTA 0x8008 48 | #define DKYELLOW 0x8400 49 | #define DKORANGE 0x8200 50 | #define DKPINK 0x9009 51 | #define DKPURPLE 0x4010 52 | #define DKGREY 0x4A49 53 | 54 | 55 | // Display 56 | /* Using library TFT_eSPI https://github.com/Bodmer/TFT_eWidget. 57 | * Be sure to update the file User_Setup.h in the \libraries\TFT_eSPI folder to set pin numbers. 58 | * To match the pin numbers, use the following: 59 | * // For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation 60 | #define TFT_CS PIN_D2 // Chip select control pin D8 61 | #define TFT_DC PIN_D4 // Data Command control pin 62 | #define TFT_RST PIN_D3 // Reset pin (could connect to NodeMCU RST, see next line) 63 | 64 | */ 65 | 66 | // Use hardware SPI 67 | TFT_eSPI tft = TFT_eSPI(); 68 | unsigned long drawTime = 0; 69 | WiFiUDP ntpUDP; 70 | 71 | 72 | void reconnect(); 73 | 74 | String message = ""; 75 | bool messageReady = false; 76 | 77 | // Handle delays 78 | unsigned long powerStarted, priceStarted, graphStarted, nordpoolStarted = 0; 79 | const long powerInterval = 10000; 80 | const long priceInterval = 20000; 81 | const long graphInterval = 120000; 82 | 83 | // Price level 84 | String price_kr, currentPrice_kr; 85 | String currentPriceLevel = "NORMAL"; 86 | String price = "Normalt"; 87 | String priceLevel; 88 | String currentPower; 89 | String dailyEnergy; 90 | float accumulatedCost, prevDailyEnergy; 91 | 92 | // Set up graph widget 93 | GraphWidget gr = GraphWidget(&tft); // Graph widget gr instance with pointer to tft 94 | TraceWidget tr = TraceWidget(&gr); // Graph trace tr with pointer to gr 95 | TraceWidget tr2 = TraceWidget(&gr); // Graph trace tr with pointer to gr 96 | uint32_t textColour = TFT_WHITE; 97 | uint32_t textHighlightColour = TFT_ORANGE; 98 | uint32_t bgColour = TFT_BLACK; 99 | bool graphDrawn = false; 100 | 101 | const float gxLow = 0.0; 102 | const float gxHigh = 24.0; // Number of hours 103 | const float gyLow = 0.0; 104 | const float gyHigh = 11.00; // Max price 105 | static float gx = 0.0, gy = 0.0; 106 | 107 | 108 | void setup(void) { 109 | 110 | // For HTTPS requests only. Keep commented otherwise! 111 | // If you don't need to check the fingerprint 112 | client.setInsecure(); 113 | // If you want to check the fingerprint 114 | // client.setFingerprint(HA_HOST_FINGERPRINT); 115 | 116 | pinMode(LED_BUILTIN, OUTPUT); // Initialize the LED_BUILTIN pin as an output 117 | Serial.begin(115200); 118 | 119 | // TFT setup 120 | tft.begin(); 121 | tft.setRotation(2); 122 | tft.setTextFont(2); 123 | tft.fillScreen(DKGREY); // Clear screen with Grey background 124 | 125 | // Connect to the WiFI 126 | WiFi.mode(WIFI_STA); 127 | WiFi.disconnect(); 128 | delay(100); 129 | 130 | // Attempt to connect to Wifi network: 131 | Serial.print("Connecting Wifi: "); 132 | Serial.println(ssid); 133 | tft.println(); 134 | tft.println(); 135 | tft.print("Connecting Wifi: "); 136 | tft.println(ssid); 137 | 138 | 139 | WiFi.begin(ssid, password); 140 | while (WiFi.status() != WL_CONNECTED) { 141 | Serial.print("."); 142 | delay(500); 143 | } 144 | IPAddress ip = WiFi.localIP(); 145 | Serial.println(""); 146 | Serial.println("WiFi connected"); 147 | Serial.println("IP address: "); 148 | Serial.println(ip); 149 | 150 | tft.println(""); 151 | tft.println("WiFi connected"); 152 | tft.println("IP address: "); 153 | tft.println(ip); 154 | delay(2000); 155 | tft.fillScreen(bgColour); // Clear screen 156 | 157 | } 158 | 159 | void loop() { 160 | //const size_t capacity = JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + 1024; 161 | DynamicJsonDocument document(6144); 162 | float currentPowerConsumption = 55, currentPowerProduction = 0; 163 | 164 | unsigned long currentMillis = millis(); 165 | // Execute every 10 seconds 166 | if (currentMillis - powerStarted >= powerInterval) { 167 | powerStarted = currentMillis; 168 | document = makeGETRequest(SENSOR_CURRENT_CONSUMPTION); 169 | currentPowerConsumption = ExtractJSONAttribute(document, "state").toFloat(); 170 | 171 | document = makeGETRequest(SENSOR_CONSUMPTION_TODAY); 172 | dailyEnergy = ExtractJSONAttribute(document, "state"); 173 | if (dailyEnergy.toFloat() < 0.2) { 174 | accumulatedCost = 0; 175 | prevDailyEnergy = 0; 176 | } 177 | if (SOLAR_PANELS) 178 | { 179 | document = makeGETRequest(SENSOR_CURRENT_PRODUCTION); 180 | currentPowerProduction = ExtractJSONAttribute(document, "state").toFloat(); 181 | WriteCurrentPower(130, 15, ((currentPowerConsumption - currentPowerProduction) * SENSOR_POWER_MULTIPLIER)); 182 | } 183 | else 184 | WriteCurrentPower(130, 15, ((currentPowerConsumption) * SENSOR_POWER_MULTIPLIER)); 185 | 186 | WriteTotal(120, 70); 187 | } 188 | 189 | // Execute every 20 seconds 190 | if (currentMillis - priceStarted >= priceInterval) { 191 | priceStarted = currentMillis; 192 | document = makeGETRequest(SENSOR_ELECTRICITY_PRICE); 193 | 194 | // Check price level 195 | price_kr = ExtractJSONAttribute(document, "state"); 196 | priceLevel = ExtractJSONAttribute(document, "attributes", "price_level"); 197 | 198 | document = makeGETRequest(SENSOR_CURRENT_CONSUMPTION); 199 | currentPowerConsumption = ExtractJSONAttribute(document, "state").toFloat(); 200 | 201 | if (SOLAR_PANELS) 202 | { 203 | document = makeGETRequest(SENSOR_CURRENT_PRODUCTION); 204 | currentPowerProduction = ExtractJSONAttribute(document, "state").toFloat(); 205 | WriteCurrentPower(130, 15, ((currentPowerConsumption - currentPowerProduction) * SENSOR_POWER_MULTIPLIER)); 206 | } 207 | else 208 | WriteCurrentPower(130, 15, ((currentPowerConsumption) * SENSOR_POWER_MULTIPLIER)); 209 | 210 | WriteTotal(120, 70); 211 | WritePriceText(120, 237); 212 | } 213 | 214 | // Execute every 120 seconds 215 | if (currentMillis - graphStarted >= graphInterval or !graphDrawn) { 216 | graphStarted = currentMillis; 217 | graphDrawn = true; 218 | document = makeGETRequest(SENSOR_NORDPOOL); 219 | PlotGraph(document); 220 | } 221 | } 222 | 223 | void CreateGraph (int xPos, int yPos, float maxPriceToday ) 224 | { 225 | // Clear scale in y axis 226 | tft.fillRect(xPos-10, yPos, 20, 90, TFT_BLACK); 227 | tft.setFreeFont(); // Select the font 228 | tft.setTextSize(1); 229 | // Graph area is 220 pixels wide, 80 pixels high, dark grey background 230 | gr.createGraph(220, 80, tft.color565(5, 5, 5)); 231 | gr.setGraphScale(gxLow, gxHigh, gyLow, maxPriceToday); 232 | 233 | // X grid starts at 0 with lines every 2 x-scale units 234 | // Y grid starts at 0 with lines every 2 y-scale units 235 | // Dark grey grid 236 | gr.setGraphGrid(gxLow, 2.0, gyLow, 1.0, DKGREY); 237 | 238 | // Draw empty graph, top left corner at pixel coordinate 40,10 on TFT 239 | gr.drawGraph(xPos, yPos); 240 | 241 | // Draw the x axis scale 242 | tft.setTextDatum(TC_DATUM); // Top centre text datum 243 | for (int x=2; x<=24; x+=2){ 244 | tft.drawNumber(x, gr.getPointX(x), gr.getPointY(0.0) + 3); 245 | } 246 | 247 | // Draw the y axis scale 248 | tft.setTextDatum(MR_DATUM); // Middle right text datum 249 | for (float y=0; y<=maxPriceToday; y+=2){ 250 | tft.drawNumber(y, gr.getPointX(0.0), gr.getPointY(y)); 251 | } 252 | } 253 | 254 | void PlotGraph (DynamicJsonDocument nordPoolDocument) 255 | { 256 | double lastprice = 0; 257 | double price; 258 | float maxPricetoday = nordPoolDocument["attributes"]["max"]; 259 | Serial.println("***************************"); 260 | Serial.print("Max price today: "); 261 | Serial.println(maxPricetoday); 262 | CreateGraph (10, 128, maxPricetoday); 263 | PlotTimeline(maxPricetoday); 264 | 265 | for (int priceCount=0;priceCount<24;priceCount++) 266 | { 267 | price = nordPoolDocument["attributes"]["today"][priceCount]; 268 | lastprice = AddPrice(priceCount, price, priceCount-1, lastprice); 269 | } 270 | price = nordPoolDocument["attributes"]["tomorrow"][0]; 271 | if (price > 0) 272 | lastprice = AddPrice(24, price, 23, lastprice); 273 | } 274 | 275 | void PlotTimeline(float maxPriceToday) 276 | { 277 | // Get current time, to draw a timeline 278 | NTPClient timeClient(ntpUDP, "se.pool.ntp.org", 3600); 279 | 280 | timeClient.update(); 281 | Serial.println("Timeline value: "); 282 | double hours = timeClient.getHours(); 283 | double minutes = timeClient.getMinutes(); 284 | double timeLineVal = hours + (minutes/60); 285 | tr2.startTrace(LTGREY); 286 | tr2.addPoint(timeLineVal, 0); 287 | tr2.addPoint(timeLineVal, maxPriceToday); 288 | } 289 | 290 | double AddPrice(int hour, double price, int lastHour, double lastPrice) 291 | { 292 | if(lastHour<0) 293 | lastHour=0; 294 | 295 | if(lastPrice==0) 296 | lastPrice = price; 297 | 298 | tr.startTrace(PriceColour(lastPrice)); 299 | tr.addPoint(lastHour, lastPrice); 300 | tr.addPoint(hour, price); 301 | return price; 302 | } 303 | 304 | uint32_t PriceColour (float nNewPrice) 305 | { 306 | uint32_t colour; 307 | //nNewPrice = nNewPrice; 308 | if (inRange(nNewPrice, EXTREMELY_EXPENSIVE, 100)) {colour = TFT_MAROON;} 309 | else if (inRange(nNewPrice, VERY_EXPENSIVE, EXTREMELY_EXPENSIVE)){colour = TFT_RED;} 310 | else if (inRange(nNewPrice, EXPENSIVE, VERY_EXPENSIVE)){colour = TFT_ORANGE;} 311 | else if (inRange(nNewPrice, NORMAL, EXPENSIVE)){colour = TFT_GREENYELLOW;} 312 | else if (inRange(nNewPrice, CHEAP, NORMAL)){colour = TFT_GREEN;} 313 | else if (inRange(nNewPrice, VERY_CHEAP, CHEAP)){colour = TFT_DARKGREEN;} 314 | else if (inRange(nNewPrice, 0, VERY_CHEAP)){colour = TFT_DARKGREEN;} 315 | return colour; 316 | } 317 | 318 | void WriteCurrentPower(int xPos, int yPos, int nCurrentPower) 319 | { 320 | tft.setSwapBytes(true); 321 | currentPower = String(nCurrentPower); 322 | tft.setFreeFont(FF23); // Select the font 323 | tft.setTextColor(textHighlightColour, bgColour); 324 | tft.drawCentreString(BLANKTEXT, xPos, yPos, GFXFF);// Clear the line 325 | tft.drawCentreString(currentPower + " W", xPos, yPos, GFXFF); 326 | if (nCurrentPower > 0) 327 | tft.pushImage(xPos-115, yPos-5, 32, 32, electric_pole); 328 | else 329 | tft.pushImage(xPos-115, yPos-5, 32, 32, sunny_solar32); 330 | } 331 | 332 | void WriteTotal(int xPos, int yPos) 333 | { 334 | tft.setTextColor(textColour, bgColour); 335 | tft.setFreeFont(FF17); // Select the font 336 | tft.drawCentreString(BLANKTEXT, xPos, yPos, GFXFF);// Clear the line 337 | tft.drawCentreString("Idag: " + dailyEnergy + " kWh", xPos, yPos, GFXFF); 338 | tft.drawCentreString(BLANKTEXT, xPos, yPos+25, GFXFF);// Clear the line 339 | tft.drawCentreString("Kostnad: " + CalculateAccumulatedCost(price_kr, dailyEnergy) + " kr", xPos, yPos+25, GFXFF); 340 | } 341 | 342 | void WritePriceText(int xPos, int yPos) 343 | { 344 | 345 | if (!price_kr.equals(currentPrice_kr)){ 346 | Serial.println("Current price: " + currentPrice_kr); 347 | Serial.println("New price: " + price_kr); 348 | currentPrice_kr = price_kr; 349 | float nNewPrice = price_kr.toFloat(); 350 | bgColour = TFT_BLACK; 351 | //price = PriceText(nNewPrice); 352 | 353 | if (inRange(nNewPrice, EXTREMELY_EXPENSIVE, 100)) {price = "Extremt dyrt";} 354 | else if (inRange(nNewPrice, VERY_EXPENSIVE, EXTREMELY_EXPENSIVE)){price = "Mycket dyrt";} 355 | else if (inRange(nNewPrice, EXPENSIVE, VERY_EXPENSIVE)){price = "Dyrt";} 356 | else if (inRange(nNewPrice, NORMAL, EXPENSIVE)){price = "Normalt";} 357 | else if (inRange(nNewPrice, CHEAP, NORMAL)){price = "Billigt";} 358 | else if (inRange(nNewPrice, VERY_CHEAP, CHEAP)){price = "Mycket Billigt";} 359 | else if (inRange(nNewPrice, 0, VERY_CHEAP)){price = "Mycket billigt";} 360 | 361 | 362 | textHighlightColour = PriceColour(nNewPrice); 363 | tft.setFreeFont(FF18); // Select the font 364 | tft.drawCentreString(BLANKTEXT, xPos, yPos, GFXFF);// Clear the line 365 | tft.drawCentreString(price_kr + " kr/kWh", xPos, yPos, GFXFF); 366 | tft.setFreeFont(FF23); // Select the font 367 | tft.setTextColor(textHighlightColour, bgColour); 368 | tft.drawCentreString(BLANKTEXT, xPos, yPos+30, GFXFF);// Clear the line 369 | tft.drawCentreString("" + price,xPos, yPos+30,GFXFF); 370 | } 371 | } 372 | 373 | String CalculateAccumulatedCost(String currentPrice, String dailyEnergy) { 374 | float nCurrentPrice = currentPrice.toFloat(); 375 | if (nCurrentPrice == 0) 376 | return "0"; 377 | float nDailyEnergy = dailyEnergy.toFloat(); 378 | float nEnergyDelta = nDailyEnergy - prevDailyEnergy; 379 | prevDailyEnergy = nDailyEnergy; 380 | accumulatedCost += (nEnergyDelta * nCurrentPrice); 381 | 382 | Serial.println("Price: " + String(nCurrentPrice)); 383 | Serial.println("DailyEnergy: " + String(nDailyEnergy)); 384 | Serial.println("Delta: " + String(nEnergyDelta)); 385 | Serial.println("AccumulatedCost: " + String(accumulatedCost)); 386 | return String(accumulatedCost); 387 | } 388 | 389 | DynamicJsonDocument makeGETRequest(String entity_id) 390 | { 391 | if (entity_id == "") 392 | { 393 | Serial.println("Error: Entity id is null"); 394 | } 395 | 396 | // Opening connection to server (Use 8123 as port if HTTP) 397 | if (SECURE_SERVER) 398 | { 399 | if (!client.connect(HA_HOST, 443)) 400 | { 401 | Serial.println("Connection to " + String(HA_HOST) + " failed using port 443"); 402 | } 403 | } 404 | else 405 | { 406 | if (!client.connect(HA_HOST, 8123)) 407 | { 408 | Serial.println("Connection to " + String(HA_HOST) + " failed failed using port 8123"); 409 | } 410 | } 411 | 412 | // Send HTTP request 413 | client.print(F("GET ")); 414 | // This is the second half of a request (everything that comes after the base URL) 415 | Serial.print("header: "); 416 | Serial.println ("/api/states/" + entity_id); 417 | client.print("/api/states/" + entity_id); 418 | client.println(F(" HTTP/1.1")); 419 | 420 | //Headers 421 | client.print(F("Host: ")); 422 | client.println(HA_HOST); 423 | client.println("Authorization: Bearer " + bearerToken); 424 | client.println(); 425 | // Message JSON 426 | if (client.println() == 0) 427 | { 428 | Serial.println(F("Failed to send request")); 429 | if (WiFi.status() != WL_CONNECTED) 430 | { 431 | Serial.println(F("Network Connection lost. Trying to reconnect")); 432 | reconnect(); 433 | } 434 | } 435 | 436 | // Check HTTP status 437 | char status[32] = {0}; 438 | client.readBytesUntil('\r', status, sizeof(status)); 439 | Serial.print(F("Response: ")); 440 | Serial.println(status); 441 | 442 | // Skip HTTP headers 443 | char endOfHeaders[] = "\r\n\r\n"; 444 | if (!client.find(endOfHeaders)) 445 | { 446 | Serial.println(F("Invalid response")); 447 | } 448 | 449 | // Allocate the JSON document 450 | // Use arduinojson.org/v6/assistant to compute the capacity. 451 | DynamicJsonDocument doc(6144); 452 | 453 | // Parse JSON object 454 | DeserializationError error = deserializeJson(doc, client); 455 | if (error) { 456 | Serial.print(F("deserializeJson() failed: ")); 457 | Serial.println(error.f_str()); 458 | //return error.f_str(); 459 | } 460 | return doc; 461 | } 462 | 463 | DynamicJsonDocument makeGETRequestForTime(String entity_id) 464 | { 465 | String hostURL = "http://worldtimeapi.org"; 466 | 467 | // Opening connection to server (Use 80 as port if HTTP) 468 | if (!client.connect(hostURL, 80)) 469 | { 470 | Serial.println(F("Connection failed")); 471 | } 472 | 473 | // Send HTTP request 474 | client.print(F("GET ")); 475 | // This is the second half of a request (everything that comes after the base URL) 476 | Serial.print("header: "); 477 | Serial.println ("/api/ip" + entity_id); 478 | client.print("/api/ip" + entity_id); 479 | client.println(F(" HTTP/1.1")); 480 | 481 | //Headers 482 | client.print(F("Host: ")); 483 | client.println(hostURL); 484 | // client.println("Authorization: Bearer " + bearerToken); 485 | // client.println(); 486 | // Message JSON 487 | if (client.println() == 0) 488 | { 489 | Serial.println(F("Failed to send request")); 490 | if (WiFi.status() != WL_CONNECTED) 491 | { 492 | Serial.println(F("Network Connection lost. Trying to reconnect")); 493 | reconnect(); 494 | } 495 | } 496 | 497 | // Check HTTP status 498 | char status[32] = {0}; 499 | client.readBytesUntil('\r', status, sizeof(status)); 500 | Serial.print(F("Response: ")); 501 | Serial.println(status); 502 | 503 | // Skip HTTP headers 504 | char endOfHeaders[] = "\r\n\r\n"; 505 | if (!client.find(endOfHeaders)) 506 | { 507 | Serial.println(F("Invalid response")); 508 | } 509 | 510 | // Allocate the JSON document 511 | // Use arduinojson.org/v6/assistant to compute the capacity. 512 | DynamicJsonDocument doc(6144); 513 | 514 | // Parse JSON object 515 | DeserializationError error = deserializeJson(doc, client); 516 | if (error) { 517 | Serial.print(F("deserializeJson() failed: ")); 518 | Serial.println(error.f_str()); 519 | //return error.f_str(); 520 | } 521 | return doc; 522 | } 523 | 524 | 525 | bool inRange(float val, float minimum, float maximum) 526 | { 527 | return ((minimum <= val) && (val <= maximum)); 528 | } 529 | 530 | void reconnect() 531 | { 532 | int wifitries = 0; 533 | Serial.print("Reconnecting"); 534 | WiFi.mode(WIFI_STA); 535 | WiFi.begin(ssid, password); 536 | while (WiFi.status() != WL_CONNECTED) { 537 | wifitries++; 538 | delay(1000); 539 | Serial.print("."); 540 | if (wifitries == 10) 541 | { 542 | Serial.print("Reconnect failed. Waiting 1 min before retrying."); 543 | delay(60000); 544 | return; 545 | } 546 | } 547 | Serial.println("Connected!"); 548 | } 549 | 550 | String ExtractJSONAttribute(DynamicJsonDocument doc, String attribute) 551 | { 552 | String value = doc[attribute].as(); 553 | Serial.println("Attribute: " + attribute + " Value: " + value); 554 | return value; 555 | } 556 | 557 | String ExtractJSONAttribute(DynamicJsonDocument doc, String attribute1, String attribute2) 558 | { 559 | String value = doc[attribute1][attribute2].as(); 560 | Serial.println("Attribute: " + attribute1 + "/" + attribute2 + " Value: " + value); 561 | return value; 562 | } 563 | 564 | double ExtractJSONAttributeFloat(DynamicJsonDocument doc, String attribute1, String attribute2) 565 | { 566 | double value = doc[attribute1][attribute2]; 567 | Serial.print("Attribute: " + attribute1 + "/" + attribute2 + " Value: "); 568 | Serial.println (value, 2); 569 | return value; 570 | } 571 | 572 | String ExtractJSONAttribute(DynamicJsonDocument doc, String attribute1, String attribute2, String attribute3) 573 | { 574 | String value = doc[attribute1][attribute2][attribute3].as(); 575 | Serial.println("Attribute: " + attribute1 + "/" + attribute2 + "/" + attribute3 + " Value: " + value); 576 | return value; 577 | } 578 | 579 | 580 | // There follows a crude way of flagging that this example sketch needs fonts which 581 | // have not been enbabled in the User_Setup.h file inside the TFT_HX8357 library. 582 | // 583 | // These lines produce errors during compile time if settings in User_Setup are not correct 584 | // 585 | // The error will be "does not name a type" but ignore this and read the text between '' 586 | // it will indicate which font or feature needs to be enabled 587 | // 588 | // Either delete all the following lines if you do not want warnings, or change the lines 589 | // to suit your sketch modifications. 590 | 591 | #ifndef LOAD_GLCD 592 | //ERROR_Please_enable_LOAD_GLCD_in_User_Setup 593 | #endif 594 | 595 | #ifndef LOAD_GFXFF 596 | ERROR_Please_enable_LOAD_GFXFF_in_User_Setup! 597 | #endif 598 | -------------------------------------------------------------------------------- /icons.h: -------------------------------------------------------------------------------- 1 | // "Icons made by Freepik from www.flaticon.com" 2 | 3 | const unsigned short solar_energy32[0x400] PROGMEM ={ 4 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, // 0x0010 (16) 5 | 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) 6 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF2F, 0xFF4F, 0xFFEF, 0x0000, 0x0000, 0x0000, 0xFF2F, // 0x0030 (48) 7 | 0xFF2F, 0xFFEF, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0040 (64) 8 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0xFEAF, 0x0000, 0xFF2F, 0xFF4F, // 0x0050 (80) 9 | 0xFF4F, 0xFF2F, 0x0000, 0xFFFF, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) 10 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF2B, 0xFF66, 0xFF08, 0xFF08, // 0x0070 (112) 11 | 0xFF08, 0xFEE8, 0xFEA5, 0xFF2B, 0xFF4F, 0xFF4F, 0xFF2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0080 (128) 12 | 0x0000, 0x0000, 0x0000, 0x0000, 0xF70F, 0xFF2F, 0xFFFF, 0x0000, 0x0000, 0xFF2D, 0xFF0A, 0xFF06, 0xFEE6, 0xFEE6, 0xFEE5, 0xFEE6, // 0x0090 (144) 13 | 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFF06, 0xFF0A, 0xFF4D, 0x0000, 0x0000, 0xFFE0, 0xFF2F, 0xF70F, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00A0 (160) 14 | 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0xFEE9, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE4, 0xFEC3, 0xFEC2, 0xFEA1, // 0x00B0 (176) 15 | 0xFEA1, 0xFEC2, 0xFEC3, 0xFEE5, 0xFEE6, 0xFEE6, 0xFEE6, 0xFF09, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF2F, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00C0 (192) 16 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF0A, 0xFEE6, 0xFEE6, 0xFEC4, 0xFE61, 0xFE80, 0xFEA0, 0xFEA0, 0xFEA0, // 0x00D0 (208) 17 | 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA1, 0xFEE4, 0xFEE6, 0xFEE6, 0xFF0A, 0xFF4F, 0xFF2F, 0xFFE0, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00E0 (224) 18 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF0A, 0xFEE6, 0xFEE5, 0xFE82, 0xFE20, 0xFE80, 0xFEA0, 0xFEA0, 0xFEA1, 0xFEA1, // 0x00F0 (240) 19 | 0xFEA1, 0xFEA1, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEC2, 0xFEE5, 0xFEE6, 0xFF0A, 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0100 (256) 20 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF09, 0xFEE6, 0xFEE5, 0xFE61, 0xFE20, 0xFE60, 0xFEA0, 0xFEC3, 0xFEE5, 0xFEE6, 0xFEE6, // 0x0110 (272) 21 | 0xFEE6, 0xFEE6, 0xFEE5, 0xFEC3, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA2, 0xFEE5, 0xFEE6, 0xFEE8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0120 (288) 22 | 0x0000, 0xFF4F, 0xFF4F, 0xFF2F, 0xFF2D, 0xFF06, 0xFEE6, 0xFE82, 0xFE20, 0xFE40, 0xFEA1, 0xFEE5, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, // 0x0130 (304) 23 | 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE5, 0xFEA1, 0xFEA0, 0xFEA0, 0xFEC2, 0xFEE5, 0xFF06, 0xFF2D, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, // 0x0140 (320) 24 | 0x0000, 0xFF4F, 0xFF2F, 0xFF4F, 0xFF0A, 0xFEE6, 0xFEC4, 0xFE20, 0xFE20, 0xFE81, 0xFEE5, 0xFEE6, 0xFEE6, 0xFE04, 0xFC82, 0xFC82, // 0x0150 (336) 25 | 0xFC82, 0xFC82, 0xFC82, 0xFC82, 0xFEA5, 0xFEE5, 0xFEA1, 0xFEA0, 0xFEA0, 0xFEE4, 0xFEE6, 0xFF0A, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, // 0x0160 (352) 26 | 0x0000, 0x0000, 0xFF2F, 0xFF2F, 0xFF06, 0xFEE6, 0xFE61, 0xFE20, 0xFE20, 0xFEE5, 0xFEE6, 0xFEE6, 0xFEE6, 0xFC61, 0xFB40, 0xFB40, // 0x0170 (368) 27 | 0xFB40, 0xFB40, 0xFB40, 0xFC21, 0xFEE6, 0xFEE6, 0xFEE5, 0xFEA0, 0xFEA0, 0xFEA1, 0xFEE6, 0xFF06, 0xFF4F, 0xFF4F, 0xFBEF, 0x0000, // 0x0180 (384) 28 | 0x0000, 0x0000, 0x0000, 0xFF0A, 0xFEE5, 0xFEC4, 0xFE20, 0xFE20, 0xFE61, 0xFEE6, 0xFEE6, 0xFEE6, 0xFE85, 0xFB40, 0xFB40, 0xFB40, // 0x0190 (400) 29 | 0xFB40, 0xFB40, 0xFB60, 0xFE65, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEC3, 0xFEA0, 0xFEA0, 0xFEE5, 0xFEE6, 0xFF0B, 0xFEAF, 0x0000, 0x0000, // 0x01A0 (416) 30 | 0x0000, 0x0000, 0x0000, 0x0000, 0xFEE6, 0xFE83, 0xFE20, 0xFE20, 0xFEA1, 0xFEE6, 0xFEE6, 0xFEE6, 0xFD23, 0xFB40, 0xFB40, 0xFB40, // 0x01B0 (432) 31 | 0xFB40, 0xFB40, 0xFD23, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE5, 0xFEA0, 0xFEA0, 0xFEC3, 0xFEE6, 0xFEC6, 0x0000, 0x0000, 0x0000, // 0x01C0 (448) 32 | 0x0000, 0xFFEF, 0xFF4F, 0xFF08, 0xFEE6, 0xFE62, 0xFE20, 0xFE40, 0xFEA1, 0xFEE6, 0xFEE6, 0xFEE6, 0xFBA0, 0xFB40, 0xFB40, 0xFB40, // 0x01D0 (464) 33 | 0xFB40, 0xFB40, 0xFBC0, 0xFC01, 0xFE24, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEA1, 0xFEA0, 0xFEC2, 0xFEE5, 0xFF07, 0xFF4F, 0x0000, 0x0000, // 0x01E0 (480) 34 | 0xFF4F, 0xFF2F, 0xFF4F, 0xFF08, 0xFEE6, 0xFE61, 0xFE20, 0xFE40, 0xFEA1, 0xFEE6, 0xFEE6, 0xFE44, 0xFB60, 0xFB60, 0xFB60, 0xFB40, // 0x01F0 (496) 35 | 0xFB40, 0xFB40, 0xFB40, 0xFC21, 0xFEE5, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEA1, 0xFEA0, 0xFEA1, 0xFEE6, 0xFF08, 0xFF2F, 0xFF2F, 0xFF4F, // 0x0200 (512) 36 | 0xFF4F, 0xFF4F, 0xFF4F, 0xFF08, 0xFEE6, 0xFE61, 0xFE20, 0xFE40, 0xFEA0, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFC01, // 0x0210 (528) 37 | 0xFB40, 0xFB40, 0xFB80, 0xFE85, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEA1, 0xFEA0, 0xFEA1, 0xFEE6, 0xFF08, 0xFF4F, 0xFF4F, 0xFF4F, // 0x0220 (544) 38 | 0x0000, 0xFFF3, 0xFF4F, 0xFF08, 0xFEE6, 0xFE62, 0xFE20, 0xFE40, 0xFEA0, 0xFEE4, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEC5, 0xFB60, // 0x0230 (560) 39 | 0xFB40, 0xFB40, 0xFDE4, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEA1, 0xFEA0, 0xFEC2, 0xFEE6, 0xFEE8, 0xFF4F, 0xFF2F, 0x0000, // 0x0240 (576) 40 | 0x0000, 0x0000, 0x0000, 0xFEA5, 0xFEE6, 0xFE83, 0xFE20, 0xFE20, 0xFE80, 0xFEC2, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFE24, 0xFB40, // 0x0250 (592) 41 | 0xFB40, 0xFCE2, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE5, 0xFEA0, 0xFEA0, 0xFEC3, 0xFEE6, 0xFEE7, 0x0000, 0x0000, 0x0000, // 0x0260 (608) 42 | 0x0000, 0x0000, 0x0000, 0xFF2B, 0xFEE6, 0xFEC4, 0xFE20, 0xFE20, 0xFE60, 0xFEA0, 0xFEE5, 0xFEE6, 0xFEE6, 0xFEE6, 0xFD43, 0xFB40, // 0x0270 (624) 43 | 0xFC21, 0xFEE5, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEC3, 0xFEA0, 0xFEA0, 0xFEE5, 0xFEE5, 0xFF2A, 0x0000, 0x0000, 0x0000, // 0x0280 (640) 44 | 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF06, 0xFEE6, 0xFE61, 0xFE20, 0xFE20, 0xFE80, 0xFEA1, 0xFEE6, 0xFEE6, 0xFEE6, 0xFC82, 0xFB80, // 0x0290 (656) 45 | 0xFE85, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE5, 0xFEA0, 0xFEA0, 0xFEA1, 0xFEE6, 0xFF06, 0xFF2F, 0xFF4F, 0x0000, 0x0000, // 0x02A0 (672) 46 | 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF0A, 0xFEE6, 0xFEC4, 0xFE20, 0xFE20, 0xFE40, 0xFEA0, 0xFEC3, 0xFEE6, 0xFEE6, 0xFBA0, 0xFDE4, // 0x02B0 (688) 47 | 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE5, 0xFEA1, 0xFEA0, 0xFEA0, 0xFEE4, 0xFEE6, 0xFF0A, 0xFF4F, 0xFF2F, 0xFF4F, 0x0000, // 0x02C0 (704) 48 | 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4D, 0xFEE6, 0xFEE5, 0xFE82, 0xFE20, 0xFE20, 0xFE40, 0xFE80, 0xFEC2, 0xFEE5, 0xFE24, 0xFEE6, // 0x02D0 (720) 49 | 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE5, 0xFEA1, 0xFEA0, 0xFEA0, 0xFEC2, 0xFEE6, 0xFEE6, 0xFF2D, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, // 0x02E0 (736) 50 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF29, 0xFEE6, 0xFEE5, 0xFE61, 0xFE20, 0xFE20, 0xFE20, 0xFE60, 0xFEA1, 0xFEE4, 0xFEE6, // 0x02F0 (752) 51 | 0xFEE6, 0xFEE6, 0xFEE5, 0xFEC3, 0xFEA0, 0xFEA0, 0xFEA0, 0xFEA2, 0xFEE5, 0xFEE5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0300 (768) 52 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF0A, 0xFEE6, 0xFEE5, 0xFE82, 0xFE20, 0xFE20, 0xFE20, 0xFE20, 0xFE40, 0xFE61, // 0x0310 (784) 53 | 0xFE81, 0xFE81, 0xFEA0, 0xFEA0, 0xFEA0, 0xFE80, 0xFEC2, 0xFEE5, 0xFEE6, 0xFF0A, 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0320 (800) 54 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF0A, 0xFEE6, 0xFEE5, 0xFEC4, 0xFE61, 0xFE20, 0xFE20, 0xFE20, 0xFE20, // 0x0330 (816) 55 | 0xFE20, 0xFE20, 0xFE20, 0xFE20, 0xFE61, 0xFEC4, 0xFEE5, 0xFEE6, 0xFF0A, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0340 (832) 56 | 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF4F, 0xFF28, 0xFEE6, 0xFEE6, 0xFEE6, 0xFEC4, 0xFE83, 0xFE62, 0xFE61, // 0x0350 (848) 57 | 0xFE61, 0xFE62, 0xFE83, 0xFEC4, 0xFEE6, 0xFEE6, 0xFEE6, 0xFF29, 0xFF4F, 0xFF4F, 0xFF2F, 0xF74F, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0360 (864) 58 | 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0xFF4D, 0xFF0A, 0xFF06, 0xFEE5, 0xFEE6, 0xFEE6, 0xFEE6, // 0x0370 (880) 59 | 0xFEE6, 0xFEE6, 0xFEE6, 0xFEE6, 0xFF06, 0xFF0A, 0xFF4D, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0380 (896) 60 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF2F, 0xFF0A, 0xFFE0, 0xFF08, 0xFF08, // 0x0390 (912) 61 | 0xFF08, 0xFEE8, 0xFFE0, 0xFF2B, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03A0 (928) 62 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF2F, 0xFF4F, 0x0000, 0x0000, 0xFF4F, 0xFF4F, // 0x03B0 (944) 63 | 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03C0 (960) 64 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0xFFF3, 0xFF4F, // 0x03D0 (976) 65 | 0xFF2F, 0xFFEF, 0x0000, 0x0000, 0x0000, 0xFF2F, 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03E0 (992) 66 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF4F, // 0x03F0 (1008) 67 | 0xFF4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0400 (1024) 68 | }; 69 | 70 | const unsigned short electrical_tower32[0x400] PROGMEM ={ 71 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, // 0x0010 (16) 72 | 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) 73 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3B9F, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x0030 (48) 74 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3B9F, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0040 (64) 75 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3B9F, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x0050 (80) 76 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3B9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) 77 | 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x0070 (112) 78 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0080 (128) 79 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, // 0x0090 (144) 80 | 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x00A0 (160) 81 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x00B0 (176) 82 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x00C0 (192) 83 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x00D0 (208) 84 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x00E0 (224) 85 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, // 0x00F0 (240) 86 | 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0100 (256) 87 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3B7F, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, // 0x0110 (272) 88 | 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3B7F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0120 (288) 89 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x0130 (304) 90 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0140 (320) 91 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3B9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x0150 (336) 92 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x3B9F, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0160 (352) 93 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, // 0x0170 (368) 94 | 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x0180 (384) 95 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x335F, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x0190 (400) 96 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x335F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x01A0 (416) 97 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x01B0 (432) 98 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x01C0 (448) 99 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01D0 (464) 100 | 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) 101 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01F0 (496) 102 | 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0200 (512) 103 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) 104 | 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0220 (544) 105 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3B9F, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0230 (560) 106 | 0x0000, 0x0000, 0x0000, 0x0000, 0x3B9F, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) 107 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, // 0x0250 (592) 108 | 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0260 (608) 109 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3B9F, 0x3BBF, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, // 0x0270 (624) 110 | 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x3BDF, 0x3B9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0280 (640) 111 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, // 0x0290 (656) 112 | 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02A0 (672) 113 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x3B9F, 0x3BBF, // 0x02B0 (688) 114 | 0x3BBF, 0x3B9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02C0 (704) 115 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BDF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, // 0x02D0 (720) 116 | 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02E0 (736) 117 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, // 0x02F0 (752) 118 | 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0300 (768) 119 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3B9F, 0x0000, // 0x0310 (784) 120 | 0x0000, 0x3B9F, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0320 (800) 121 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3B9F, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x337F, 0x0000, 0x0000, // 0x0330 (816) 122 | 0x0000, 0x0000, 0x337F, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3B9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0340 (832) 123 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0350 (848) 124 | 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0360 (864) 125 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0370 (880) 126 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0380 (896) 127 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x337F, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0390 (912) 128 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x337F, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03A0 (928) 129 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3B9F, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03B0 (944) 130 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3B9F, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03C0 (960) 131 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03D0 (976) 132 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03E0 (992) 133 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03F0 (1008) 134 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0400 (1024) 135 | }; 136 | const unsigned short electricity[0x400] PROGMEM ={ 137 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0010 (16) 138 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, // 0x0020 (32) 139 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) 140 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9C2E, 0x0000, 0x9C2E, 0x0000, 0x0000, 0x7BEF, 0x8410, 0x8410, 0x7BEF, // 0x0040 (64) 141 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0050 (80) 142 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9C2E, 0x0000, 0x9C2E, 0x0000, 0x0000, 0x7BEF, 0x8410, 0x8410, 0x7BEF, // 0x0060 (96) 143 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0070 (112) 144 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0xAD55, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE59, // 0x0080 (128) 145 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0090 (144) 146 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0xA534, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE59, // 0x00A0 (160) 147 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00B0 (176) 148 | 0x0000, 0x0000, 0x0000, 0x0000, 0x9492, 0x8410, 0x8410, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x8410, 0x8410, 0x7BEF, // 0x00C0 (192) 149 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00D0 (208) 150 | 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x7BEF, 0x0000, 0x9C2E, 0x0000, 0x9C2E, 0x0000, 0x0000, 0x8C51, 0x8C71, 0x8C71, 0x8C51, // 0x00E0 (224) 151 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00F0 (240) 152 | 0x0000, 0x0000, 0x0000, 0x8410, 0x7BEF, 0x7BEF, 0x0000, 0x9C2E, 0x0000, 0x9C2E, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x0100 (256) 153 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0110 (272) 154 | 0x0000, 0x0000, 0x7BEF, 0x8410, 0x7BEF, 0x8410, 0xA534, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE59, // 0x0120 (288) 155 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0130 (304) 156 | 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x8410, 0xB596, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE79, 0xCE59, // 0x0140 (320) 157 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, // 0x0150 (336) 158 | 0x7BEF, 0x7BEF, 0x8430, 0x7BEF, 0x8410, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x8410, 0x8410, 0x7BEF, // 0x0160 (352) 159 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8410, 0x8410, 0x7BEF, // 0x0170 (368) 160 | 0x7BEF, 0x7BEF, 0x8410, 0x7BEF, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7BEF, 0x8410, 0x8410, 0x7BEF, // 0x0180 (384) 161 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x942E, 0x840F, 0x7BEF, 0x8410, 0x7BEF, // 0x0190 (400) 162 | 0x7BEF, 0x7BEF, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C51, 0x8C71, 0x8C71, 0x8C51, // 0x01A0 (416) 163 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x948D, 0x9C2E, 0x942E, 0x942E, 0x942F, 0x840F, 0x8C71, // 0x01B0 (432) 164 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x01C0 (448) 165 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x942E, 0x9C4E, // 0x01D0 (464) 166 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x01E0 (480) 167 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA44E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0xA48F, 0xA48F, 0x9C2E, 0x9C2E, 0x9C2E, // 0x01F0 (496) 168 | 0x942E, 0xA44E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x0200 (512) 169 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C4F, 0xB551, 0xCDF3, 0xCDF3, 0xB531, 0x9C4F, 0x9C2E, // 0x0210 (528) 170 | 0x9C2E, 0x942E, 0x9C2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x0220 (544) 171 | 0x0000, 0x0000, 0x0000, 0x9C4E, 0x942E, 0x942E, 0x9C2E, 0x9C2E, 0xACF0, 0xC5D3, 0xCDF3, 0xCE34, 0xCE34, 0xCDF3, 0xC5D3, 0xACF0, // 0x0230 (560) 172 | 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x8BED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x0240 (576) 173 | 0x0000, 0x0000, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0xA46F, 0xBD92, 0xCDF3, 0xCE14, 0xDE76, 0xEE70, 0xEE70, 0xDE76, 0xCE14, 0xCDF3, // 0x0250 (592) 174 | 0xBD92, 0xA46F, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x0260 (608) 175 | 0x942D, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C4E, 0xB531, 0xCDF3, 0xCDF3, 0xD655, 0xE6D7, 0xEE70, 0xED85, 0xED85, 0xEE70, 0xE6D7, 0xD655, // 0x0270 (624) 176 | 0xCDF3, 0xCDF3, 0xB531, 0x9C4E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x0280 (640) 177 | 0x9C2E, 0x9C2E, 0x9C2E, 0xACD0, 0xC5B3, 0xCDF3, 0xCE14, 0xE6B6, 0xEEF7, 0xEEF7, 0xEE70, 0xED85, 0xED85, 0xEE70, 0xEEF7, 0xEEF7, // 0x0290 (656) 178 | 0xE6B6, 0xCE14, 0xCDF3, 0xC5B3, 0xACD0, 0x9C2E, 0x9C2E, 0x9C2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x02A0 (672) 179 | 0x9C2E, 0x942E, 0xB551, 0xCDF3, 0xCDF4, 0xDE76, 0xE6F7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEE70, 0xEE70, 0xE6F7, 0xEEF7, 0xEEF7, // 0x02B0 (688) 180 | 0xEEF7, 0xE6F7, 0xDE76, 0xCE14, 0xCDF3, 0xB551, 0x9C2E, 0x9C2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x02C0 (704) 181 | 0x9C0E, 0x9BEF, 0xCDF3, 0xD655, 0xE6D7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, // 0x02D0 (720) 182 | 0xEEF7, 0xEEF7, 0xEEF7, 0xE6D7, 0xD655, 0xCDF3, 0x9BEF, 0x9C2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x02E0 (736) 183 | 0x0000, 0x0000, 0xE6D7, 0xEEF7, 0xEF39, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, // 0x02F0 (752) 184 | 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xE6D7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x0300 (768) 185 | 0x0000, 0x0000, 0xE6F7, 0xEEF7, 0xEF39, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xB512, 0xB512, 0xB512, 0xB512, 0xB512, 0xB512, 0xEEF7, // 0x0310 (784) 186 | 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xE6F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x0320 (800) 187 | 0x0000, 0x0000, 0xE6F7, 0xEEF7, 0xEF39, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xA4B0, 0xA4B0, 0xA4B0, 0xA4B0, 0xA4B0, 0xA4B0, 0xEEF7, // 0x0330 (816) 188 | 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xE6F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x0340 (832) 189 | 0x0000, 0x0000, 0xE6F7, 0xEEF7, 0xF77B, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0xEEF7, // 0x0350 (848) 190 | 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xE6F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x0360 (864) 191 | 0x0000, 0x0000, 0xE6F7, 0xEEF7, 0xF77B, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0x9C2E, 0x9C2E, 0x9C2E, 0x83CD, 0x83CD, 0x9C2E, 0xEEF7, // 0x0370 (880) 192 | 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xE6F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x0380 (896) 193 | 0x0000, 0x0000, 0xE6F7, 0xEEF7, 0xF77B, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0xEEF7, // 0x0390 (912) 194 | 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xE6F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x03A0 (928) 195 | 0x0000, 0x0000, 0xE6F7, 0xEEF7, 0xF77B, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0xEEF7, // 0x03B0 (944) 196 | 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xE6F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x03C0 (960) 197 | 0x0000, 0x0000, 0xE6F7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0xEEF7, // 0x03D0 (976) 198 | 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xEEF7, 0xE6F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0x9CD3, 0x9CD3, 0x9CD3, // 0x03E0 (992) 199 | 0x0000, 0x0000, 0xE6F7, 0xE6F7, 0xE6F7, 0xE6F7, 0xE6F7, 0xE6F7, 0xE6F7, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0x9C2E, 0xE6F7, // 0x03F0 (1008) 200 | 0xE6F7, 0xE6F7, 0xE6F7, 0xE6F7, 0xE6F7, 0xE6F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x94B2, 0x9CD3, 0x9CD3, 0x94B2, // 0x0400 (1024) 201 | }; 202 | 203 | const unsigned short sunny_solar32[0x400] PROGMEM ={ 204 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD20, // 0x0010 (16) 205 | 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) 206 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD20, 0xFD20, // 0x0030 (48) 207 | 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0xF800, 0xFD20, 0xFCE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0040 (64) 208 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD20, 0xFD20, // 0x0050 (80) 209 | 0xFD20, 0xFD20, 0xFFE0, 0x0000, 0xFD00, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) 210 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0xFD00, 0xFD20, 0xFD20, // 0x0070 (112) 211 | 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0080 (128) 212 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD40, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, // 0x0090 (144) 213 | 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00A0 (160) 214 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, // 0x00B0 (176) 215 | 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0xFDE0, 0xFD00, 0xFD40, 0x0000, 0x0000, 0x0000, // 0x00C0 (192) 216 | 0x0000, 0x0000, 0xFD00, 0xFD20, 0xFD20, 0xFD00, 0xFCC0, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD60, 0xFDE2, 0xFE43, 0xFE63, // 0x00D0 (208) 217 | 0xFE43, 0xFE01, 0xFDA0, 0xFD40, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, // 0x00E0 (224) 218 | 0x0000, 0x0000, 0xFD00, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD60, 0xFE43, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, // 0x00F0 (240) 219 | 0xFEC5, 0xFEC5, 0xFEC4, 0xFE61, 0xFDE0, 0xFD40, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, // 0x0100 (256) 220 | 0x0000, 0x0000, 0x0000, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFDC2, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, // 0x0110 (272) 221 | 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEA3, 0xFE20, 0xFD60, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0120 (288) 222 | 0x0000, 0x0000, 0x0000, 0xFD40, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFDC2, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, // 0x0130 (304) 223 | 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEA3, 0xFE40, 0xFD60, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0140 (320) 224 | 0x0000, 0x0000, 0x0000, 0x0000, 0xFD20, 0xFD20, 0xFD20, 0xFD60, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFDA3, 0xFD83, 0xFD83, // 0x0150 (336) 225 | 0xFD83, 0xFD83, 0xFD83, 0xFE44, 0xFEC5, 0xFEC5, 0xFE82, 0xFE20, 0xFD40, 0xFD20, 0xFD20, 0xFD20, 0xFDE0, 0x0000, 0x0000, 0x0000, // 0x0160 (352) 226 | 0x0000, 0x0000, 0x0000, 0xFD40, 0xFD20, 0xFD20, 0xFD20, 0xFE64, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE24, 0xFB40, 0xFB40, 0xFB40, // 0x0170 (368) 227 | 0xFB40, 0xFB40, 0xFB40, 0xFE04, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE60, 0xFDC0, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD40, // 0x0180 (384) 228 | 0xFCC0, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD60, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFCC2, 0xFB40, 0xFB40, 0xFB40, // 0x0190 (400) 229 | 0xFB40, 0xFB40, 0xFCA2, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE82, 0xFE40, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, // 0x01A0 (416) 230 | 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFDE2, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEA5, 0xFB80, 0xFB40, 0xFB40, 0xFB40, // 0x01B0 (432) 231 | 0xFB40, 0xFBA0, 0xFEA5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC4, 0xFE40, 0xFD80, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFCC0, // 0x01C0 (448) 232 | 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFE43, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFD83, 0xFB40, 0xFB40, 0xFB40, 0xFB40, // 0x01D0 (464) 233 | 0xFB40, 0xFBE1, 0xFD02, 0xFDC4, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE40, 0xFDC0, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFC80, 0x0000, // 0x01E0 (480) 234 | 0x0000, 0xFD00, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFE64, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFC21, 0xFB40, 0xFB40, 0xFB40, 0xFB40, // 0x01F0 (496) 235 | 0xFB40, 0xFB40, 0xFB40, 0xFDC3, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE60, 0xFDC0, 0xFD20, 0xFD20, 0xFD20, 0xFDE0, 0x0000, 0x0000, // 0x0200 (512) 236 | 0x0000, 0x0000, 0xFBE0, 0xFD20, 0xFD20, 0xFD20, 0xFE64, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE64, 0xFE24, 0xFE24, 0xFD02, 0xFB40, // 0x0210 (528) 237 | 0xFB40, 0xFB40, 0xFCE2, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE60, 0xFDC0, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, // 0x0220 (544) 238 | 0x0000, 0x0000, 0xFD40, 0xFD20, 0xFD20, 0xFD20, 0xFE43, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFCE2, 0xFB40, // 0x0230 (560) 239 | 0xFB40, 0xFC01, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE40, 0xFDA0, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, // 0x0240 (576) 240 | 0x0000, 0xFD40, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFDE2, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFC21, 0xFB40, // 0x0250 (592) 241 | 0xFB80, 0xFE65, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEA4, 0xFE40, 0xFD60, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, // 0x0260 (608) 242 | 0xFCE0, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD60, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFB60, 0xFB40, // 0x0270 (624) 243 | 0xFDC3, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE82, 0xFE20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, // 0x0280 (640) 244 | 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFE23, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE24, 0xFB40, 0xFCE2, // 0x0290 (656) 245 | 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE40, 0xFDA0, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD00, 0x0000, // 0x02A0 (672) 246 | 0x0000, 0xFDA0, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD40, 0xFEA5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFD63, 0xFC01, 0xFEC5, // 0x02B0 (688) 247 | 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE82, 0xFE00, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02C0 (704) 248 | 0x0000, 0x0000, 0x0000, 0x0000, 0xFFE0, 0xFD20, 0xFD20, 0xFD20, 0xFD81, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFDE4, 0xFE65, 0xFEC5, // 0x02D0 (720) 249 | 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE83, 0xFE20, 0xFD40, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFFE0, 0x0000, 0x0000, 0x0000, // 0x02E0 (736) 250 | 0x0000, 0x0000, 0x0000, 0x0000, 0xFD00, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD81, 0xFEA5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, // 0x02F0 (752) 251 | 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, 0xFE82, 0xFE00, 0xFD40, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, // 0x0300 (768) 252 | 0x0000, 0x0000, 0x0000, 0x0000, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD40, 0xFE03, 0xFEC5, 0xFEC5, 0xFEC5, 0xFEC5, // 0x0310 (784) 253 | 0xFEC5, 0xFEC5, 0xFEA4, 0xFE41, 0xFDA0, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, // 0x0320 (800) 254 | 0x0000, 0x0000, 0x0000, 0xFBE0, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD40, 0xFDA1, 0xFE02, 0xFE23, // 0x0330 (816) 255 | 0xFE02, 0xFDC0, 0xFD60, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFCC0, 0x0000, 0x0000, // 0x0340 (832) 256 | 0x0000, 0x0000, 0x0000, 0xFD40, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, // 0x0350 (848) 257 | 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0360 (864) 258 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, // 0x0370 (880) 259 | 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0380 (896) 260 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0xFD20, // 0x0390 (912) 261 | 0xFD20, 0xFD20, 0xFD20, 0xFD00, 0xFD20, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03A0 (928) 262 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD20, 0xFD20, 0xFD20, 0xFD40, 0x0000, 0xFD20, 0xFD20, // 0x03B0 (944) 263 | 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0xFD20, 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03C0 (960) 264 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD20, 0xFD20, 0xFCC0, 0x0000, 0x0000, 0x0000, 0xFD20, // 0x03D0 (976) 265 | 0xFD20, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD00, 0xFD20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03E0 (992) 266 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD00, // 0x03F0 (1008) 267 | 0xFD20, 0xFD40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0400 (1024) 268 | }; 269 | 270 | const unsigned short electric_pole[0x400] PROGMEM ={ 271 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x0000, // 0x0010 (16) 272 | 0x0000, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) 273 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x5CD4, 0x5CD4, 0x0000, // 0x0030 (48) 274 | 0x0000, 0x5CD4, 0x5CD4, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0040 (64) 275 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x5CD4, 0x5CD4, // 0x0050 (80) 276 | 0x5CD4, 0x5CD4, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) 277 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, // 0x0070 (112) 278 | 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x64F5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0080 (128) 279 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x5CD4, 0x5CD4, 0x3C33, 0x3C33, 0x0000, // 0x0090 (144) 280 | 0x0000, 0x3C33, 0x0000, 0x5CD4, 0x5CD4, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00A0 (160) 281 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x5CD4, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x3C33, 0x3C33, // 0x00B0 (176) 282 | 0x3C33, 0x33F2, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x5CD4, 0x5CF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00C0 (192) 283 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6493, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, // 0x00D0 (208) 284 | 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x6493, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00E0 (224) 285 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x73D0, 0x73F0, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x3C33, 0x3C33, 0x0000, // 0x00F0 (240) 286 | 0x0000, 0x3C33, 0x3433, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x73F0, 0x73F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0100 (256) 287 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x3C33, 0x3C33, // 0x0110 (272) 288 | 0x3C33, 0x3C54, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0120 (288) 289 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, // 0x0130 (304) 290 | 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0140 (320) 291 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x5CD4, 0x5CD4, 0x3C33, 0x3433, 0x0000, // 0x0150 (336) 292 | 0x0000, 0x3C33, 0x3C54, 0x5CD4, 0x5CD4, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0160 (352) 293 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x5CD4, 0x0000, 0x5CD4, 0x0000, 0x3C33, 0x3433, // 0x0170 (368) 294 | 0x3C54, 0x3C33, 0x0000, 0x5CD4, 0x0000, 0x5CD4, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0180 (384) 295 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x632C, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, // 0x0190 (400) 296 | 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x6C51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01A0 (416) 297 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x73D0, 0x73F0, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x3C33, 0x0000, 0x0000, // 0x01B0 (432) 298 | 0x0000, 0x3C54, 0x3C33, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x73F0, 0x73F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01C0 (448) 299 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x73D0, 0x73EF, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x3C33, 0x0000, // 0x01D0 (464) 300 | 0x33F3, 0x3C33, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x73F0, 0x73F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) 301 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x5CD4, 0x5CD4, 0x54B4, // 0x01F0 (496) 302 | 0x54B4, 0x5CD4, 0x5CD4, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0200 (512) 303 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x5CD4, 0x54B4, 0x5CD4, 0x5CD4, // 0x0210 (528) 304 | 0x5CD4, 0x5CD4, 0x54B4, 0x5CD4, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0220 (544) 305 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5471, 0x5CD4, 0x5CD4, 0x5CD4, 0x33D2, 0x3C33, 0x0000, // 0x0230 (560) 306 | 0x0000, 0x3C33, 0x0000, 0x5CD4, 0x5CD4, 0x5CD4, 0x54B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) 307 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x5CD4, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x33D2, 0x3C33, // 0x0250 (592) 308 | 0x3C33, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x5CD4, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0260 (608) 309 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x73CF, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, // 0x0270 (624) 310 | 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x5CD4, 0x73D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0280 (640) 311 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x73D0, 0x73F0, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x3C33, 0x0000, 0x0000, // 0x0290 (656) 312 | 0x0000, 0x0000, 0x3C33, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x73F0, 0x73F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02A0 (672) 313 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CF4, 0x6515, 0x3C33, 0x3C33, 0x0000, // 0x02B0 (688) 314 | 0x0000, 0x3C33, 0x3C54, 0x5CF5, 0x6515, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02C0 (704) 315 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x3C33, 0x0000, // 0x02D0 (720) 316 | 0x0000, 0x3C33, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02E0 (736) 317 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x3473, 0x3C33, // 0x02F0 (752) 318 | 0x3C33, 0x3412, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0300 (768) 319 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CF4, 0x5CB4, 0x5CB4, 0x5CB4, 0x5CB4, 0x4473, // 0x0310 (784) 320 | 0x4473, 0x5CB4, 0x5CB4, 0x5CB4, 0x5CD4, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0320 (800) 321 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x64F5, 0x64F5, 0x64F5, 0x64F5, 0x5CD4, // 0x0330 (816) 322 | 0x5CD4, 0x64F5, 0x64F5, 0x64F5, 0x64F5, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0340 (832) 323 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x3C33, 0x3C33, 0x0000, // 0x0350 (848) 324 | 0x0000, 0x3C33, 0x3C33, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0360 (864) 325 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x54D4, 0x0000, 0x3C33, 0x3C33, 0x0000, 0x0000, // 0x0370 (880) 326 | 0x0000, 0x0000, 0x3C33, 0x3C33, 0x0000, 0x5CD4, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0380 (896) 327 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x0000, 0x3C33, 0x3C33, 0x0000, 0x0000, 0x0000, // 0x0390 (912) 328 | 0x0000, 0x0000, 0x0000, 0x3C33, 0x3C33, 0x0000, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03A0 (928) 329 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x3C33, 0x3C54, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03B0 (944) 330 | 0x0000, 0x0000, 0x0000, 0x0000, 0x3C54, 0x3C33, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03C0 (960) 331 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5CD4, 0x3C33, 0x3433, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03D0 (976) 332 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C33, 0x3C33, 0x5CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03E0 (992) 333 | 0x0000, 0x0000, 0x0000, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, // 0x03F0 (1008) 334 | 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x5C2D, 0x0000, 0x0000, 0x0000, // 0x0400 (1024) 335 | }; 336 | --------------------------------------------------------------------------------