Random work
This commit is contained in:
parent
ac11576550
commit
a702f2f9aa
@ -613,38 +613,3 @@ const unsigned char esphub_lrg [] PROGMEM = {
|
|||||||
0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
|
0x00, 0x7f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
const unsigned char sun [] PROGMEM = {
|
|
||||||
// 'sun, 64x64px
|
|
||||||
0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xef, 0xff, 0xf8, 0x1f, 0xff, 0xf7, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff,
|
|
||||||
0xff, 0x83, 0xff, 0xfe, 0x7f, 0xff, 0xc1, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff,
|
|
||||||
0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xfe, 0x03, 0xff,
|
|
||||||
0xff, 0xe0, 0x3f, 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xfc, 0x0f, 0xff,
|
|
||||||
0xff, 0xf8, 0x7f, 0xf0, 0x0f, 0xfe, 0x1f, 0xff, 0xff, 0xfc, 0xff, 0x80, 0x01, 0xff, 0x3f, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x03, 0xc0, 0x0f, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xe0, 0x1f, 0xf8, 0x07, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xfc, 0x03, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xc0, 0x7f, 0xfe, 0x03, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x01, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0x81, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xc1, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0x03, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xc0, 0x7f, 0x03, 0xff, 0xff, 0xc0, 0xfe, 0x03,
|
|
||||||
0x00, 0x3f, 0x07, 0xff, 0xff, 0xe0, 0xfc, 0x00, 0x00, 0x1f, 0x07, 0xff, 0xff, 0xe0, 0xf8, 0x00,
|
|
||||||
0x00, 0x1f, 0x07, 0xff, 0xff, 0xe0, 0xf8, 0x00, 0x00, 0x3f, 0x07, 0xff, 0xff, 0xe0, 0xfc, 0x00,
|
|
||||||
0xc0, 0x7f, 0x03, 0xff, 0xff, 0xc0, 0xfe, 0x03, 0xff, 0xff, 0x03, 0xff, 0xff, 0xc0, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0x83, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0x81, 0xff, 0xff, 0x81, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0x80, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7f, 0xfe, 0x03, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xe0, 0x3f, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xf8, 0x07, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xf0, 0x03, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xfc, 0xff, 0x80, 0x01, 0xff, 0x3f, 0xff, 0xff, 0xf8, 0x7f, 0xf0, 0x0f, 0xfe, 0x1f, 0xff,
|
|
||||||
0xff, 0xf0, 0x3f, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xfc, 0x07, 0xff,
|
|
||||||
0xff, 0xc0, 0x7f, 0xff, 0xff, 0xfe, 0x03, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0x01, 0xff,
|
|
||||||
0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x81, 0xff, 0xff, 0x83, 0xff, 0xfe, 0x7f, 0xff, 0xc1, 0xff,
|
|
||||||
0xff, 0x87, 0xff, 0xfc, 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xff
|
|
||||||
};
|
|
@ -19,6 +19,14 @@ struct Config {
|
|||||||
String ncUrl;
|
String ncUrl;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Active Features
|
||||||
|
struct ActiveFeatures {
|
||||||
|
bool network;
|
||||||
|
bool homeassistant;
|
||||||
|
bool calendar;
|
||||||
|
bool weather;
|
||||||
|
};
|
||||||
|
|
||||||
Config loadConfig();
|
Config loadConfig();
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -35,17 +35,28 @@ SPIClass hspi(HSPI);
|
|||||||
// <Local Includes>
|
// <Local Includes>
|
||||||
#include "bitmap.h"
|
#include "bitmap.h"
|
||||||
#include "config_loader.h"
|
#include "config_loader.h"
|
||||||
|
#include "weather.h"
|
||||||
|
#include "helper_fn.h"
|
||||||
|
|
||||||
// <Fonts>
|
// <Fonts>
|
||||||
#include <Fonts/FreeMono9pt7b.h>
|
#include <Fonts/FreeMono9pt7b.h>
|
||||||
|
#include <Fonts/FreeMonoBold9pt7b.h>
|
||||||
|
#include <Fonts/FreeMonoBold12pt7b.h>
|
||||||
|
#include <Fonts/FreeSans9pt7b.h>
|
||||||
|
#include <Fonts/FreeSansBold24pt7b.h>
|
||||||
|
|
||||||
// <Connectivity>
|
// <Connectivity>
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
|
#include <WiFiClientSecure.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <HTTPClient.h>
|
#include <HTTPClient.h>
|
||||||
|
#include "tls_certificates.h"
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
// Globals
|
// Globals
|
||||||
Config conf;
|
Config conf;
|
||||||
|
ActiveFeatures activeFeatures;
|
||||||
|
int loopIteration = 0;
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
@ -75,8 +86,10 @@ void setup()
|
|||||||
conf = loadConfig();
|
conf = loadConfig();
|
||||||
if (connect_WiFi(conf.ssid.c_str(), conf.wifiPass.c_str())) {
|
if (connect_WiFi(conf.ssid.c_str(), conf.wifiPass.c_str())) {
|
||||||
bootMsg("WiFi Connection: OK", text_y);
|
bootMsg("WiFi Connection: OK", text_y);
|
||||||
|
activeFeatures.network = true;
|
||||||
} else {
|
} else {
|
||||||
bootMsg("WiFi Connection: FAIL", text_y);
|
bootMsg("WiFi Connection: FAIL", text_y);
|
||||||
|
activeFeatures.network = false;
|
||||||
}
|
}
|
||||||
text_y += line_height;
|
text_y += line_height;
|
||||||
if (update_time()) {
|
if (update_time()) {
|
||||||
@ -87,18 +100,54 @@ void setup()
|
|||||||
text_y += line_height;
|
text_y += line_height;
|
||||||
if (checkUrlPing(conf.haUrl)) { // FAILS FOR SOME REASON -- DEBUG ME
|
if (checkUrlPing(conf.haUrl)) { // FAILS FOR SOME REASON -- DEBUG ME
|
||||||
bootMsg("Home Assistant URL Reachable: OK", text_y);
|
bootMsg("Home Assistant URL Reachable: OK", text_y);
|
||||||
// Check home entity is reachable here.
|
text_y += line_height;
|
||||||
|
if (haAnybodyHome() < 0) {
|
||||||
|
bootMsg("Home Assistant Home Entity Check: FAIL", text_y);
|
||||||
|
activeFeatures.homeassistant = false;
|
||||||
|
} else {
|
||||||
|
activeFeatures.homeassistant = true;
|
||||||
|
bootMsg("Home Assistant Home Entity Check: OK", text_y);
|
||||||
|
}
|
||||||
|
text_y += line_height;
|
||||||
} else {
|
} else {
|
||||||
bootMsg("Home Assistant URL Reachable: FAIL", text_y);
|
bootMsg("Home Assistant URL Reachable: FAIL", text_y);
|
||||||
|
text_y += line_height;
|
||||||
|
activeFeatures.homeassistant = false;
|
||||||
|
}
|
||||||
|
if (getWeather(conf.latitude, conf.longitude).latitude) {
|
||||||
|
bootMsg("Fetch Weather Data: OK", text_y);
|
||||||
|
activeFeatures.weather = true;
|
||||||
|
} else {
|
||||||
|
bootMsg("Fetch Weather Data: FAIL", text_y);
|
||||||
|
activeFeatures.weather = false;
|
||||||
}
|
}
|
||||||
text_y += line_height;
|
text_y += line_height;
|
||||||
// Check Nextcloud reachable here
|
// Check Nextcloud reachable here
|
||||||
display.hibernate();
|
displayActiveFeatures(activeFeatures);
|
||||||
|
bootMsg("Weather Icons sourced from flaticon.com", text_y);
|
||||||
|
text_y += 2 * line_height;
|
||||||
|
bootMsg("Starting main loop...", text_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
// Run loop here
|
struct tm timeinfo;
|
||||||
|
if (!getLocalTime(&timeinfo)) {
|
||||||
|
Serial.println("Unable to get time, some features will be buggy");
|
||||||
|
}
|
||||||
|
WeatherData weather = getWeather(conf.latitude, conf.longitude);
|
||||||
|
Serial.printf("Loop iteration %d\n", loopIteration);
|
||||||
|
display.setFullWindow();
|
||||||
|
|
||||||
|
do {
|
||||||
|
display.fillScreen(GxEPD_WHITE);
|
||||||
|
display.fillRect(0, 0, 800, 80, GxEPD_BLACK);
|
||||||
|
displayHeaderText(timeinfo);
|
||||||
|
displayWeather(weather);
|
||||||
|
} while (display.nextPage());
|
||||||
|
display.hibernate();
|
||||||
|
delay(3600000);
|
||||||
|
loopIteration ++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Places the boot logo in position at the top of the screen
|
// Places the boot logo in position at the top of the screen
|
||||||
@ -112,7 +161,6 @@ void bootLogo() {
|
|||||||
display.drawBitmap(img_x, 15, esphub_lrg, 648, 120, GxEPD_BLACK);
|
display.drawBitmap(img_x, 15, esphub_lrg, 648, 120, GxEPD_BLACK);
|
||||||
}
|
}
|
||||||
while (display.nextPage());
|
while (display.nextPage());
|
||||||
delay(2000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prints a one-line message to the screen, aligned with the boot logo at `y_pos`
|
// Prints a one-line message to the screen, aligned with the boot logo at `y_pos`
|
||||||
@ -127,7 +175,46 @@ void bootMsg(const char* msg, const uint16_t y_pos) {
|
|||||||
display.nextPage(); // Only needed for e-ink paginated updates
|
display.nextPage(); // Only needed for e-ink paginated updates
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void displayActiveFeatures(const ActiveFeatures activeFeatures) {
|
||||||
|
constexpr uint16_t x_pos = 650; // X Position
|
||||||
|
uint16_t y_pos = 180; // Y Position
|
||||||
|
uint16_t line_height = 17;
|
||||||
|
display.setPartialWindow(0, 0, display.width(), display.height());
|
||||||
|
display.setFont(&FreeSans9pt7b); // Set font
|
||||||
|
display.setTextColor(GxEPD_WHITE); // Set color
|
||||||
|
//display.firstPage();
|
||||||
|
do {
|
||||||
|
// Convert booleans to "Y"/"N"
|
||||||
|
auto boolToYN = [](bool value) -> const char* { return value ? "Y" : "N"; };
|
||||||
|
|
||||||
|
display.fillRect(x_pos - line_height, y_pos - line_height, 170, 7 * line_height, GxEPD_BLACK);
|
||||||
|
|
||||||
|
display.setCursor(x_pos, y_pos);
|
||||||
|
display.print("Enabled Features\n");
|
||||||
|
|
||||||
|
display.setCursor(x_pos, y_pos + 2 * line_height);
|
||||||
|
display.print("Network: ");
|
||||||
|
display.print(boolToYN(activeFeatures.network));
|
||||||
|
|
||||||
|
display.setCursor(x_pos, y_pos + 3 * line_height);
|
||||||
|
display.print("HASS: ");
|
||||||
|
display.print(boolToYN(activeFeatures.homeassistant));
|
||||||
|
|
||||||
|
display.setCursor(x_pos, y_pos + 4 * line_height);
|
||||||
|
display.print("Calendar: ");
|
||||||
|
display.print(boolToYN(activeFeatures.calendar));
|
||||||
|
|
||||||
|
display.setCursor(x_pos, y_pos + 5 * line_height);
|
||||||
|
display.print("Weather: ");
|
||||||
|
display.print(boolToYN(activeFeatures.weather));
|
||||||
|
|
||||||
|
}
|
||||||
|
while (display.nextPage());
|
||||||
|
}
|
||||||
|
|
||||||
bool connect_WiFi(String ssid, String pass) {
|
bool connect_WiFi(String ssid, String pass) {
|
||||||
|
Serial.print("Connecting to SSID ");
|
||||||
|
Serial.println(ssid);
|
||||||
WiFi.begin(ssid, pass);
|
WiFi.begin(ssid, pass);
|
||||||
int retries = 10;
|
int retries = 10;
|
||||||
while (WiFi.status() != WL_CONNECTED && retries > 0) {
|
while (WiFi.status() != WL_CONNECTED && retries > 0) {
|
||||||
@ -152,17 +239,162 @@ bool update_time() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool checkUrlPing(const String& url) {
|
bool checkUrlPing(const String& url) {
|
||||||
HTTPClient http;
|
WiFiClientSecure *client = new WiFiClientSecure;
|
||||||
WiFiClient client;
|
if (client) {
|
||||||
|
client -> setCACert(letsencrypt_root_ca);
|
||||||
|
{
|
||||||
|
HTTPClient https;
|
||||||
|
Serial.println("Starting HTTPS Request");
|
||||||
|
if (https.begin(*client, url)) {
|
||||||
|
int httpCode = https.GET();
|
||||||
|
Serial.printf("HTTPS GET code: %d\n", httpCode);
|
||||||
|
|
||||||
http.begin(client, url);
|
if (httpCode > 0) {
|
||||||
int httpCode = http.GET();
|
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
|
||||||
|
https.end();
|
||||||
if (httpCode == HTTP_CODE_OK) {
|
delete client;
|
||||||
http.end();
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
}
|
||||||
http.end();
|
}
|
||||||
|
}
|
||||||
|
https.end();
|
||||||
|
delete client;
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float haAnybodyHome() {
|
||||||
|
WiFiClientSecure *client = new WiFiClientSecure;
|
||||||
|
if (client) {
|
||||||
|
client -> setCACert(letsencrypt_root_ca);
|
||||||
|
|
||||||
|
String url = conf.haUrl + "/api/states/" + conf.homeEntity;
|
||||||
|
Serial.println("URL: " + url);
|
||||||
|
HTTPClient https;
|
||||||
|
|
||||||
|
Serial.println("Starting HTTPS Request to Home Assistant");
|
||||||
|
if (https.begin(*client, url)) {
|
||||||
|
https.addHeader("Authorization", "Bearer " + conf.haKey);
|
||||||
|
int httpCode = https.GET();
|
||||||
|
Serial.printf("Home Assistant GET Code: %d\n", httpCode);
|
||||||
|
|
||||||
|
if (httpCode == HTTP_CODE_OK) {
|
||||||
|
String payload = https.getString();
|
||||||
|
DynamicJsonDocument doc(1024);
|
||||||
|
|
||||||
|
DeserializationError error = deserializeJson(doc, payload);
|
||||||
|
if (error) {
|
||||||
|
Serial.println("Failed to Parse JSON Response");
|
||||||
|
https.end();
|
||||||
|
delete client;
|
||||||
|
return -0.1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float state = doc["state"].as<float>();
|
||||||
|
Serial.printf("Entity %s state: %f\n", conf.homeEntity.c_str(), state);
|
||||||
|
|
||||||
|
https.end();
|
||||||
|
delete client;
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
return -0.2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String getGreeting(struct tm timeinfo) {
|
||||||
|
if (!getLocalTime(&timeinfo)) {
|
||||||
|
Serial.println("Failed to obtain time from RTC");
|
||||||
|
return "Hello";
|
||||||
|
}
|
||||||
|
int currentHour = timeinfo.tm_hour; // Get the current hour
|
||||||
|
|
||||||
|
if (currentHour >= 5 && currentHour < 12) {
|
||||||
|
return "Good morning";
|
||||||
|
} else if (currentHour >= 12 && currentHour < 18) {
|
||||||
|
return "Good afternoon";
|
||||||
|
} else if (currentHour >= 18 && currentHour < 22) {
|
||||||
|
return "Good evening";
|
||||||
|
} else {
|
||||||
|
return "Good night";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String getDate(struct tm timeinfo) {
|
||||||
|
char dateStr[11];
|
||||||
|
strftime(dateStr, sizeof(dateStr), "%d/%m/%Y", &timeinfo);
|
||||||
|
|
||||||
|
return String(dateStr); // Convert the C string to a String object and return it
|
||||||
|
}
|
||||||
|
|
||||||
|
String getDayOfWeek(struct tm timeinfo) {
|
||||||
|
char dayStr[10];
|
||||||
|
strftime(dayStr, sizeof(dayStr), "%A", &timeinfo);
|
||||||
|
return String(dayStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayHeaderText(struct tm timeinfo) {
|
||||||
|
display.setTextColor(GxEPD_WHITE);
|
||||||
|
|
||||||
|
// Define vars for bound calculations
|
||||||
|
int16_t tbx, tby;
|
||||||
|
uint16_t tbw, tbh;
|
||||||
|
|
||||||
|
// Get Greeting and notable day
|
||||||
|
String greeting = getGreeting(timeinfo);
|
||||||
|
String notableDay = getNotableDay(timeinfo.tm_mon + 1, timeinfo.tm_mday);
|
||||||
|
String date = getDate(timeinfo);
|
||||||
|
String dayOfWeek = getDayOfWeek(timeinfo);
|
||||||
|
|
||||||
|
display.setFont(&FreeSansBold24pt7b); // Set Greeting Font
|
||||||
|
|
||||||
|
// Calculate Bounds for Greeting
|
||||||
|
display.getTextBounds(greeting, 0, 0, &tbx, &tby, &tbw, &tbh);
|
||||||
|
uint16_t gx = (display.width() - tbw) / 2;
|
||||||
|
uint16_t gy = 42;
|
||||||
|
|
||||||
|
// Print Greeting
|
||||||
|
display.setCursor(gx, gy);
|
||||||
|
display.print(greeting);
|
||||||
|
|
||||||
|
display.setFont(&FreeMonoBold9pt7b); // Set Notable Day Font
|
||||||
|
|
||||||
|
// Calculate Bounds for Notable Day
|
||||||
|
display.getTextBounds(notableDay, 0, 0, &tbx, &tby, &tbw, &tbh);
|
||||||
|
uint16_t nx = (display.width() - tbw) / 2;
|
||||||
|
uint16_t ny = 70;
|
||||||
|
// Print Notable Day
|
||||||
|
display.setCursor(nx, ny);
|
||||||
|
display.print(notableDay);
|
||||||
|
|
||||||
|
// Print date
|
||||||
|
display.setCursor(680, 25);
|
||||||
|
display.print(date);
|
||||||
|
display.setCursor(680, 60);
|
||||||
|
display.print(dayOfWeek);
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayWeather(WeatherData weather) {
|
||||||
|
display.setFont(&FreeMonoBold12pt7b);
|
||||||
|
display.setTextColor(GxEPD_WHITE);
|
||||||
|
display.setCursor(5, 23);
|
||||||
|
display.print(String((int)round(weather.current.temperature_2m)) + "°C");
|
||||||
|
display.drawBitmap(5, 27, hi, 22, 22, GxEPD_WHITE); // Draw 'max temp' bitmap
|
||||||
|
display.setFont(&FreeMonoBold9pt7b);
|
||||||
|
display.setCursor(18, 44);
|
||||||
|
display.print(String((int)round(weather.daily.temperature_2m_max)) + "°C");
|
||||||
|
display.drawBitmap(5, 50, lo, 22, 22, GxEPD_WHITE); // Draw 'min temp' bitmap
|
||||||
|
display.setCursor(18, 64);
|
||||||
|
display.print(String((int)round(weather.daily.temperature_2m_min)) + "°C");
|
||||||
|
display.drawBitmap(65, 10, getWeatherBitmap(weather.daily.weather_code), 64, 64, GxEPD_WHITE); // Draw Weather Bitmap
|
||||||
|
display.drawBitmap(129, 8, wind, 22, 22, GxEPD_WHITE); // Draw 'wind speed' bitmap
|
||||||
|
display.setCursor(153, 23);
|
||||||
|
display.print("km/h");
|
||||||
|
display.setCursor(133, 45);
|
||||||
|
display.print(String(weather.daily.wind_speed_10m_max));
|
||||||
|
display.setCursor(133, 64);
|
||||||
|
display.print(String(weather.daily.wind_gusts_10m_max));
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayFullScreenArt() {}
|
||||||
|
69
NewDisplayDriver/esphub/helper_fn.cpp
Normal file
69
NewDisplayDriver/esphub/helper_fn.cpp
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#include "helper_fn.h"
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
NotableDay notableDays[] = { // Max characters in a notable day is 39 characters
|
||||||
|
{1, 1, {"New Years Day!"}},
|
||||||
|
{1, 4, {"National Trivia Day", "World Braille Day"}},
|
||||||
|
{1, 5, {"The Twelfth Night of Christmas"}},
|
||||||
|
{1, 16, {"Blue Monday"}},
|
||||||
|
{1, 18, {"Whinnie the Pooh Day"}},
|
||||||
|
{1, 24, {"International Day of Education"}},
|
||||||
|
{1, 25, {"Burns Night"}},
|
||||||
|
{1, 26, {"International Day of Clean Energy"}},
|
||||||
|
{1, 27, {"Holocaust Memorial Day"}},
|
||||||
|
{2, 2, {"Candlemas", "World Wetlands Day"}},
|
||||||
|
{2, 4, {"World Cancer Day", "International Day of Human Fraternity"}},
|
||||||
|
{2, 6, {"Anti-FGM Day"}},
|
||||||
|
{2, 10, {"Intl. Day of the Arabian Leopard", "World Pulses Day"}},
|
||||||
|
{2, 11, {"Internation Day of Women and Girls in Science"}},
|
||||||
|
{2, 13, {"World Radio Day"}},
|
||||||
|
{2, 14, {"St. Valentine's Day"}},
|
||||||
|
{2, 15, {"International Choldhood Cancer Day"}},
|
||||||
|
{2, 17, {"Global Tourism Resilience Day"}},
|
||||||
|
{2, 20, {"World Day of Social Justice"}},
|
||||||
|
{2, 21, {"International Mother Language Day"}},
|
||||||
|
{2, 22, {"World Thinking Day"}},
|
||||||
|
{2, 29, {"Leap Year Day"}},
|
||||||
|
{3, 1, {"St. David's Day", "Zero Discrimination Day", "World Seagrass Day"}},
|
||||||
|
{3, 3, {"World Wildlife Day"}},
|
||||||
|
{3, 8, {"International Women's Day"}},
|
||||||
|
{3, 10, {"International Day of Women Judges"}},
|
||||||
|
{3, 15, {"Combat Islamophobia Day"}},
|
||||||
|
{3, 20, {"International Happiness Day", "French Language Day"}},
|
||||||
|
{3, 21, {"World Poetry Day", "Intl. Day of Nowruz", "World Down Syndrome Day"}},
|
||||||
|
{3, 22, {"World Water Day"}},
|
||||||
|
{3, 23, {"World Meteorological Day"}},
|
||||||
|
{3, 24, {"World Tuberculosis Day"}},
|
||||||
|
{3, 25, {"Transatlantic Slavery Remembrance Day"}},
|
||||||
|
{3, 30, {"International Zero Waste Day"}},
|
||||||
|
{5, 5, {"St. Piran's Day"}},
|
||||||
|
{11, 30, {"St. Andrew's Day", "Computer Security Day"}},
|
||||||
|
{12, 21, {"Abolishion of Slavery Day"}},
|
||||||
|
{12, 24, {"Christmas Eve"}},
|
||||||
|
{12, 25, {"Christmas Day"}},
|
||||||
|
{12, 26, {"Boxing Day"}},
|
||||||
|
{12, 27, {"Epidemic Preparedness Day"}},
|
||||||
|
{12, 31, {"New Year's Eve"}}
|
||||||
|
};
|
||||||
|
|
||||||
|
String getNotableDay(int month, int day) {
|
||||||
|
for (NotableDay notable : notableDays) {
|
||||||
|
if (notable.month == month && notable.day == day) {
|
||||||
|
// Count the number of non-empty notable days
|
||||||
|
int count = 0;
|
||||||
|
for (String notableDay : notable.notableDays) {
|
||||||
|
if (notableDay != "") {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count > 0) {
|
||||||
|
// Pick a random notable day
|
||||||
|
int randomIndex = rand() % count;
|
||||||
|
return notable.notableDays[randomIndex];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "Today is not a special day"; // Return an empty string if no notable day is found
|
||||||
|
}
|
14
NewDisplayDriver/esphub/helper_fn.h
Normal file
14
NewDisplayDriver/esphub/helper_fn.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef HELPER_FN_H
|
||||||
|
#define HELPER_FN_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
struct NotableDay {
|
||||||
|
int month;
|
||||||
|
int day;
|
||||||
|
String notableDays[5];
|
||||||
|
};
|
||||||
|
|
||||||
|
String getNotableDay(int month, int day);
|
||||||
|
|
||||||
|
#endif
|
38
NewDisplayDriver/esphub/tls_certificates.h
Normal file
38
NewDisplayDriver/esphub/tls_certificates.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#ifndef TLS_CERTIFICATES_H
|
||||||
|
#define TLS_CERTIFICATES_H
|
||||||
|
|
||||||
|
const char letsencrypt_root_ca[] = R"(
|
||||||
|
"-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
|
||||||
|
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
|
||||||
|
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
|
||||||
|
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
|
||||||
|
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
|
||||||
|
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
|
||||||
|
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
|
||||||
|
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
|
||||||
|
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
|
||||||
|
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
|
||||||
|
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
|
||||||
|
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
|
||||||
|
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
|
||||||
|
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
|
||||||
|
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
|
||||||
|
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
|
||||||
|
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
|
||||||
|
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
|
||||||
|
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
|
||||||
|
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
|
||||||
|
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
|
||||||
|
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
|
||||||
|
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
|
||||||
|
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
|
||||||
|
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
|
||||||
|
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
|
||||||
|
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
|
||||||
|
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
|
||||||
|
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
)";
|
||||||
|
|
||||||
|
#endif
|
536
NewDisplayDriver/esphub/weather.cpp
Normal file
536
NewDisplayDriver/esphub/weather.cpp
Normal file
@ -0,0 +1,536 @@
|
|||||||
|
#include "weather.h"
|
||||||
|
#include "tls_certificates.h"
|
||||||
|
#include <WiFiClientSecure.h>
|
||||||
|
#include <HTTPClient.h>
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
|
WeatherData getWeather(float latitude, float longitude) {
|
||||||
|
// Correct the URL construction
|
||||||
|
String url = "https://api.open-meteo.com/v1/forecast?latitude=" + String(latitude, 6) + "&longitude=" + String(longitude, 6);
|
||||||
|
url += "¤t=temperature_2m&daily=weather_code,temperature_2m_max,temperature_2m_min,sunrise,sunset,precipitation_sum,wind_speed_10m_max,wind_gusts_10m_max";
|
||||||
|
url += "&timezone=Europe%2FLondon&forecast_days=1";
|
||||||
|
|
||||||
|
Serial.println("Weather URL: " + url);
|
||||||
|
|
||||||
|
// Create a WiFiClientSecure object
|
||||||
|
WiFiClientSecure *client = new WiFiClientSecure;
|
||||||
|
if (client) {
|
||||||
|
client->setCACert(letsencrypt_root_ca); // Set the root certificate
|
||||||
|
|
||||||
|
// Create an HTTPClient object for making the GET request
|
||||||
|
HTTPClient https;
|
||||||
|
|
||||||
|
// Start the HTTPS request
|
||||||
|
Serial.println("Starting HTTPS Request to Weather API");
|
||||||
|
if (https.begin(*client, url)) { // Use the pre-defined URL
|
||||||
|
// Send GET request
|
||||||
|
int httpCode = https.GET();
|
||||||
|
Serial.printf("Weather API GET Code: %d\n", httpCode);
|
||||||
|
|
||||||
|
// Check if the request was successful
|
||||||
|
if (httpCode == HTTP_CODE_OK) {
|
||||||
|
String payload = https.getString(); // Get the JSON payload from the response
|
||||||
|
Serial.println("Weather data received, parsing...");
|
||||||
|
|
||||||
|
// Create a WeatherData object to store the parsed data
|
||||||
|
WeatherData weatherData;
|
||||||
|
|
||||||
|
// Parse the JSON response into the WeatherData structure
|
||||||
|
DynamicJsonDocument doc(4096); // Adjust size as needed
|
||||||
|
DeserializationError error = deserializeJson(doc, payload);
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
Serial.println("Failed to parse JSON");
|
||||||
|
https.end();
|
||||||
|
delete client;
|
||||||
|
return weatherData; // Return empty struct in case of error
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populate the WeatherData structure
|
||||||
|
weatherData.latitude = doc["latitude"].as<float>();
|
||||||
|
weatherData.longitude = doc["longitude"].as<float>();
|
||||||
|
weatherData.elevation = doc["elevation"].as<float>();
|
||||||
|
weatherData.timezone = doc["timezone"].as<String>();
|
||||||
|
weatherData.timezone_abbreviation = doc["timezone_abbreviation"].as<String>();
|
||||||
|
|
||||||
|
// Parse current weather data
|
||||||
|
JsonObject current = doc["current"];
|
||||||
|
weatherData.current.time = current["time"].as<String>();
|
||||||
|
weatherData.current.interval = current["interval"].as<int>();
|
||||||
|
weatherData.current.temperature_2m = current["temperature_2m"].as<float>();
|
||||||
|
|
||||||
|
// Parse daily weather data
|
||||||
|
JsonObject daily = doc["daily"];
|
||||||
|
weatherData.daily.time = daily["time"][0].as<String>();
|
||||||
|
weatherData.daily.weather_code = daily["weather_code"][0].as<int>();
|
||||||
|
weatherData.daily.temperature_2m_max = daily["temperature_2m_max"][0].as<float>();
|
||||||
|
weatherData.daily.temperature_2m_min = daily["temperature_2m_min"][0].as<float>();
|
||||||
|
weatherData.daily.sunrise = daily["sunrise"][0].as<String>();
|
||||||
|
weatherData.daily.sunset = daily["sunset"][0].as<String>();
|
||||||
|
weatherData.daily.precipitation_sum = daily["precipitation_sum"][0].as<float>();
|
||||||
|
weatherData.daily.wind_speed_10m_max = daily["wind_speed_10m_max"][0].as<float>();
|
||||||
|
weatherData.daily.wind_gusts_10m_max = daily["wind_gusts_10m_max"][0].as<float>();
|
||||||
|
|
||||||
|
https.end();
|
||||||
|
delete client; // Clean up
|
||||||
|
return weatherData; // Return the populated weather data
|
||||||
|
} else {
|
||||||
|
Serial.printf("Failed to get weather data, HTTP Code: %d\n", httpCode);
|
||||||
|
}
|
||||||
|
https.end(); // Close the connection
|
||||||
|
}
|
||||||
|
delete client; // Clean up the client if the request fails
|
||||||
|
}
|
||||||
|
|
||||||
|
return WeatherData(); // Return empty struct in case of failure
|
||||||
|
}
|
||||||
|
|
||||||
|
const unsigned char* getWeatherBitmap(int weatherCode) {
|
||||||
|
switch (weatherCode) {
|
||||||
|
case 0: // Clear Sky
|
||||||
|
return sun;
|
||||||
|
case 1: // Mainly Clear
|
||||||
|
return partialCloud;
|
||||||
|
case 2: // Partly Cloudy
|
||||||
|
return partialCloud;
|
||||||
|
case 3: // Overcast
|
||||||
|
return cloud;
|
||||||
|
case 45: // Fog
|
||||||
|
return fog;
|
||||||
|
case 48: // Depositing Rime Fog
|
||||||
|
return fog;
|
||||||
|
case 51: // Light Drizzle
|
||||||
|
return showers;
|
||||||
|
case 53: // Moderate Drizzle
|
||||||
|
return showers;
|
||||||
|
case 55: // Dense Drizzle
|
||||||
|
return rain;
|
||||||
|
case 56: // Freezing Drizzle
|
||||||
|
return hail;
|
||||||
|
case 57: // Heavy Freezing Drizzle
|
||||||
|
return hail;
|
||||||
|
case 61: // Slight Rain
|
||||||
|
return rain;
|
||||||
|
case 63: // Moderate Rain
|
||||||
|
return heavyRain;
|
||||||
|
case 65: // Heavy Rain
|
||||||
|
return heavyRain;
|
||||||
|
case 66: // Freezing Rain
|
||||||
|
return freezingRain;
|
||||||
|
case 67: // Heavy Freezing Rain
|
||||||
|
return freezingRain;
|
||||||
|
case 71: // Light Snow
|
||||||
|
return snow;
|
||||||
|
case 73: // Moderate Snow
|
||||||
|
return snow;
|
||||||
|
case 75: // Heavy Snow
|
||||||
|
return snow;
|
||||||
|
case 77: // Snow Grains
|
||||||
|
return snow;
|
||||||
|
case 80: // Rain Showers
|
||||||
|
return showers;
|
||||||
|
case 81: // Moderate Rain Showers
|
||||||
|
return showers;
|
||||||
|
case 82: // Heavy Rain Showers
|
||||||
|
return showers;
|
||||||
|
case 85: // Slight Snow Showers
|
||||||
|
return snow;
|
||||||
|
case 86: // Heavy Snow Showers
|
||||||
|
return snow;
|
||||||
|
case 95: // Thunderstorm
|
||||||
|
return hail;
|
||||||
|
case 96: // Thunderstorm with Slight Hail
|
||||||
|
return hail;
|
||||||
|
case 99: // Thunderstorm with Heavy Hail
|
||||||
|
return hail;
|
||||||
|
default:
|
||||||
|
return hail; // I need to source a default icon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const unsigned char sun [] PROGMEM = {
|
||||||
|
// 'sun, 64x64px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x70, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x70, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x04, 0x0f, 0xf0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xc3, 0xff, 0xff, 0xc3, 0xfc, 0x00,
|
||||||
|
0x00, 0x3f, 0xc3, 0xff, 0xff, 0xc3, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x80, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0f, 0xf0, 0x20, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x0e, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x38, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x0e, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char freezingRain [] PROGMEM = {
|
||||||
|
// 'weather, 64x64px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xc0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf0, 0x1f, 0xfe, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xe0, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7f, 0xc3, 0x07, 0xff, 0xc0, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0x83, 0x83, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7d, 0x83, 0x80, 0xff, 0xf0, 0x00,
|
||||||
|
0x00, 0x01, 0xe8, 0x1f, 0xe0, 0x0f, 0xf8, 0x00, 0x00, 0x03, 0xc0, 0x1f, 0xe0, 0x07, 0xf8, 0x00,
|
||||||
|
0x00, 0x0f, 0x80, 0x0f, 0xe2, 0x07, 0xf8, 0x00, 0x00, 0x0f, 0x81, 0x83, 0x87, 0x63, 0xfc, 0x00,
|
||||||
|
0x00, 0x1f, 0x1f, 0x83, 0x87, 0xf1, 0xfc, 0x00, 0x00, 0x1f, 0x1f, 0x83, 0x83, 0xe1, 0xfc, 0x00,
|
||||||
|
0x00, 0x3e, 0x0f, 0x83, 0x8f, 0xc3, 0xfc, 0x00, 0x00, 0x3f, 0x07, 0xe3, 0x9f, 0xc3, 0xfc, 0x00,
|
||||||
|
0x00, 0x3f, 0x8f, 0xfb, 0xfc, 0xe3, 0xf8, 0x00, 0x00, 0x3f, 0x8e, 0x7f, 0xf8, 0xc3, 0xf8, 0x00,
|
||||||
|
0x00, 0x1f, 0x80, 0x1f, 0xe0, 0x07, 0xf0, 0x00, 0x00, 0x1f, 0xc0, 0x0f, 0xe0, 0x03, 0xf0, 0x00,
|
||||||
|
0x00, 0x0f, 0x80, 0x1f, 0xf0, 0xc3, 0xe0, 0x00, 0x00, 0x0f, 0x8e, 0x7f, 0xfc, 0xe3, 0xc0, 0x00,
|
||||||
|
0x00, 0x03, 0x8f, 0xfb, 0x9f, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x87, 0xe3, 0x8f, 0xc0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x0f, 0x83, 0x83, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x83, 0x83, 0xf0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1f, 0xc3, 0x87, 0x20, 0x00, 0x00, 0x00, 0x00, 0x09, 0xc3, 0x83, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x01, 0x80, 0x03, 0x80, 0x00, 0x60, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x00, 0x60, 0x00,
|
||||||
|
0x00, 0x07, 0x00, 0x03, 0x80, 0x00, 0xe0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00,
|
||||||
|
0x00, 0x0e, 0x00, 0x00, 0x01, 0xc1, 0xc0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x01, 0xc3, 0x80, 0x00,
|
||||||
|
0x00, 0x1c, 0x0c, 0x00, 0x03, 0x83, 0x00, 0x00, 0x00, 0x18, 0x1c, 0x0c, 0x03, 0x07, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x18, 0x0e, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x0e, 0x02, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x70, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x38, 0x1c, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xe0, 0x70, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0x38, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x01, 0xc0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char partialCloud [] PROGMEM = {
|
||||||
|
// 'upload, 64x64px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x03, 0x80, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x38, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xe0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x7f, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1f, 0xf1, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe3, 0xff, 0xe0, 0x00, 0x00,
|
||||||
|
0x00, 0x3e, 0x1f, 0xc7, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x3e, 0x1f, 0xcf, 0xff, 0xf8, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1f, 0xcf, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x8f, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x0f, 0x9f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0x1f, 0xff, 0xff, 0xf0, 0x00,
|
||||||
|
0x00, 0x00, 0x06, 0x1f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x00, 0x61, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0xe1, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x01, 0xc3, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x03, 0x83, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x01, 0x03, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf0, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc0, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char showers [] PROGMEM = {
|
||||||
|
// 'cloud, 64x64px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x70, 0x04, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x03, 0x80, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x1c, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xe0, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x30, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf8, 0x7e, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1f, 0xf1, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xe3, 0xff, 0xe0, 0x00, 0x00,
|
||||||
|
0x00, 0x3f, 0x1f, 0xc7, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0x1f, 0x8f, 0xff, 0xf0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1f, 0x9f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, 0xff, 0xfc, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x0f, 0x9f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0x1f, 0xff, 0xff, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x04, 0x1f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x63, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x00, 0xe3, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x01, 0xc7, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x01, 0x87, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x01, 0x80, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0xc0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x83, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char cloud [] PROGMEM = {
|
||||||
|
// 'cloud(1), 64x64px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xc0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00,
|
||||||
|
0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00,
|
||||||
|
0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
|
||||||
|
0x00, 0x01, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char snow [] PROGMEM = {
|
||||||
|
// 'night, 64x64px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfe, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x0f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x80, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xc0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x3f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x1f, 0xf8, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xf0, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf0, 0x0f, 0xff, 0xc0, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xc1, 0x83, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0xc1, 0x80, 0xff, 0xf0, 0x00,
|
||||||
|
0x00, 0x00, 0xfe, 0x07, 0xe0, 0x4f, 0xf0, 0x00, 0x00, 0x03, 0xe0, 0x0f, 0xf0, 0x07, 0xf8, 0x00,
|
||||||
|
0x00, 0x07, 0xe0, 0x0f, 0xf0, 0x07, 0xf8, 0x00, 0x00, 0x0f, 0xc0, 0xc1, 0x87, 0x23, 0xf8, 0x00,
|
||||||
|
0x00, 0x1f, 0xcd, 0xc1, 0x83, 0xf1, 0xfc, 0x00, 0x00, 0x1f, 0x8f, 0xc1, 0x83, 0xf1, 0xfc, 0x00,
|
||||||
|
0x00, 0x3f, 0x8f, 0xc1, 0x87, 0xc1, 0xfc, 0x00, 0x00, 0x3f, 0x83, 0xf1, 0x8f, 0xc3, 0xf8, 0x00,
|
||||||
|
0x00, 0x3f, 0xc7, 0xfd, 0xbe, 0xe3, 0xf8, 0x00, 0x00, 0x3f, 0xc7, 0x3f, 0xf8, 0x43, 0xf8, 0x00,
|
||||||
|
0x00, 0x1f, 0xc2, 0x0f, 0xf0, 0x07, 0xf0, 0x00, 0x00, 0x1f, 0xe0, 0x07, 0xe0, 0x03, 0xf0, 0x00,
|
||||||
|
0x00, 0x0f, 0xc0, 0x0f, 0xf8, 0x43, 0xe0, 0x00, 0x00, 0x07, 0xc7, 0x3f, 0xfe, 0xe3, 0xc0, 0x00,
|
||||||
|
0x00, 0x03, 0xc7, 0xf9, 0x9f, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xf1, 0x87, 0xe0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xc1, 0x83, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc1, 0x83, 0xf0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x06, 0xe1, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc1, 0x01, 0x38, 0x00,
|
||||||
|
0x00, 0x00, 0xc0, 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0x00, 0x0f, 0xc0, 0x0f, 0xf0, 0x03, 0xf0, 0x00,
|
||||||
|
0x00, 0x0f, 0x80, 0x01, 0x80, 0x00, 0xf8, 0x00, 0x00, 0x07, 0xc0, 0x01, 0x80, 0x00, 0xfc, 0x00,
|
||||||
|
0x00, 0x07, 0xe0, 0x01, 0x80, 0x01, 0xd8, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x00,
|
||||||
|
0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x3e, 0x00, 0x60, 0x00,
|
||||||
|
0x00, 0x03, 0x03, 0xf0, 0x1f, 0x87, 0xe0, 0x00, 0x00, 0x1b, 0x83, 0xf0, 0x1f, 0x87, 0xe0, 0x00,
|
||||||
|
0x00, 0x3f, 0x01, 0xf0, 0x39, 0x03, 0xe0, 0x00, 0x00, 0x1f, 0x01, 0xf8, 0x00, 0x03, 0xf0, 0x00,
|
||||||
|
0x00, 0x0f, 0xc1, 0xd8, 0x00, 0x03, 0xb0, 0x00, 0x00, 0x0f, 0x81, 0x80, 0x00, 0x03, 0x00, 0x00,
|
||||||
|
0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char rain [] PROGMEM = {
|
||||||
|
// 'cloud(2), 64x64px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xc0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00,
|
||||||
|
0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00,
|
||||||
|
0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
|
||||||
|
0x00, 0x01, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x01, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0xe0, 0x00, 0x0c, 0x00, 0x00,
|
||||||
|
0x00, 0x03, 0x00, 0xc0, 0x0c, 0x1c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x40, 0x1c, 0x38, 0x00, 0x00,
|
||||||
|
0x00, 0x02, 0x00, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x06, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x38, 0x18, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x10, 0x18, 0x00, 0x0c, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char hail [] PROGMEM = {
|
||||||
|
// 'weather(1), 64x64px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xc0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x00,
|
||||||
|
0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00,
|
||||||
|
0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
|
||||||
|
0x00, 0x01, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x40, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x07, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xc0, 0x60, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x01, 0xc0, 0xe0, 0x0c, 0x03, 0x80, 0x00,
|
||||||
|
0x00, 0x03, 0x80, 0xc0, 0x1c, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x70, 0x0e, 0x00, 0x00,
|
||||||
|
0x00, 0x1c, 0x07, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x07, 0x00, 0x00, 0x30, 0x00, 0x00,
|
||||||
|
0x00, 0x3e, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0xc0, 0x7c, 0x00, 0x00,
|
||||||
|
0x00, 0x1c, 0x00, 0x07, 0xe0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x78, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char fog [] PROGMEM = {
|
||||||
|
// 'cloud(3), 64x64px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x0f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xc0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xc0, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00,
|
||||||
|
0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00,
|
||||||
|
0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char heavyRain [] PROGMEM = {
|
||||||
|
// 'night(1), 64x64px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xc0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00,
|
||||||
|
0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x00,
|
||||||
|
0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00,
|
||||||
|
0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00,
|
||||||
|
0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00,
|
||||||
|
0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00,
|
||||||
|
0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf0, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x40, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe1, 0xc3, 0x86, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xe1, 0xc1, 0xc3, 0x0e, 0x00, 0x00, 0x00, 0x01, 0xc1, 0x83, 0x87, 0x1c, 0x00, 0x00,
|
||||||
|
0x00, 0x01, 0xc3, 0x87, 0x0e, 0x38, 0x00, 0x00, 0x00, 0x03, 0x87, 0x0e, 0x1c, 0x38, 0x00, 0x00,
|
||||||
|
0x00, 0x07, 0x0e, 0x0e, 0x1c, 0x70, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x1c, 0x38, 0x60, 0x00, 0x00,
|
||||||
|
0x00, 0x02, 0x1c, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x30, 0xe0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x70, 0x30, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x01, 0xc0, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char hi [] PROGMEM = {
|
||||||
|
// 'menu-up-fill-custom, 22x22px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x78, 0x00, 0x00, 0xfc,
|
||||||
|
0x00, 0x01, 0xfe, 0x00, 0x03, 0xff, 0x00, 0x07, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char lo [] PROGMEM = {
|
||||||
|
// 'menu-up-fill-custom, 22x22px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, 0x03, 0xff, 0x00, 0x01, 0xfe,
|
||||||
|
0x00, 0x00, 0xfc, 0x00, 0x00, 0x78, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
const unsigned char wind [] PROGMEM = {
|
||||||
|
// 'wind, 22x22px
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x67, 0x00, 0x00, 0x67, 0x00, 0x00,
|
||||||
|
0x0e, 0x00, 0x0f, 0xfc, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x3f, 0xff,
|
||||||
|
0x80, 0x00, 0x07, 0xc0, 0x3f, 0x80, 0xe0, 0x3f, 0xc4, 0x60, 0x00, 0xec, 0xe0, 0x02, 0x6f, 0xc0,
|
||||||
|
0x06, 0xe7, 0x80, 0x07, 0xc0, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00
|
||||||
|
};
|
64
NewDisplayDriver/esphub/weather.h
Normal file
64
NewDisplayDriver/esphub/weather.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
// weather.h
|
||||||
|
#ifndef WEATHER_H
|
||||||
|
#define WEATHER_H
|
||||||
|
|
||||||
|
#include "tls_certificates.h"
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <WiFiClientSecure.h>
|
||||||
|
#include <HTTPClient.h>
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
|
// Struct for current weather data
|
||||||
|
struct CurrentWeather {
|
||||||
|
String time; // e.g., "2024-11-26T20:30"
|
||||||
|
int interval; // e.g., 900
|
||||||
|
float temperature_2m; // e.g., 7.1°C
|
||||||
|
};
|
||||||
|
|
||||||
|
// Struct for daily weather data
|
||||||
|
struct DailyWeather {
|
||||||
|
String time; // Date as string e.g., "2024-11-26"
|
||||||
|
int weather_code; // e.g., 61 (WMO code)
|
||||||
|
float temperature_2m_max; // e.g., 10.9°C
|
||||||
|
float temperature_2m_min; // e.g., 6.5°C
|
||||||
|
String sunrise; // e.g., "2024-11-26T06:47"
|
||||||
|
String sunset; // e.g., "2024-11-26T14:59"
|
||||||
|
float precipitation_sum; // e.g., 2.3 mm
|
||||||
|
float wind_speed_10m_max; // e.g., 11.5 km/h
|
||||||
|
float wind_gusts_10m_max; // e.g., 25.6 km/h
|
||||||
|
};
|
||||||
|
|
||||||
|
// Main weather data structure
|
||||||
|
struct WeatherData {
|
||||||
|
float latitude; // e.g., 52.52
|
||||||
|
float longitude; // e.g., 13.419998
|
||||||
|
float elevation; // e.g., 38 meters
|
||||||
|
String timezone; // e.g., "Europe/London"
|
||||||
|
String timezone_abbreviation; // e.g., "GMT"
|
||||||
|
|
||||||
|
// Current weather data
|
||||||
|
CurrentWeather current;
|
||||||
|
|
||||||
|
// Daily weather data
|
||||||
|
DailyWeather daily;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Bitmap Images
|
||||||
|
extern const unsigned char sun[] PROGMEM;
|
||||||
|
extern const unsigned char freezingRain[] PROGMEM;
|
||||||
|
extern const unsigned char partialCloud[] PROGMEM;
|
||||||
|
extern const unsigned char showers[] PROGMEM;
|
||||||
|
extern const unsigned char cloud[] PROGMEM;
|
||||||
|
extern const unsigned char snow[] PROGMEM;
|
||||||
|
extern const unsigned char rain[] PROGMEM;
|
||||||
|
extern const unsigned char hail[] PROGMEM;
|
||||||
|
extern const unsigned char fog[] PROGMEM;
|
||||||
|
extern const unsigned char heavyRain[] PROGMEM;
|
||||||
|
extern const unsigned char hi[] PROGMEM;
|
||||||
|
extern const unsigned char lo[] PROGMEM;
|
||||||
|
extern const unsigned char wind[] PROGMEM;
|
||||||
|
|
||||||
|
WeatherData getWeather(float latitude, float longitude);
|
||||||
|
const unsigned char* getWeatherBitmap(int weatherCode);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user