#include "WeatherIcons.h" #include "WeatherIcons48.h" // Weather icon glyph source attribution: // https://github.com/erikflowers/weather-icons // Large icons are provided by generated WI48_* arrays in WeatherIcons48.h. // ============================================================================ // 24x24 Small Weather Icons (1-bit, MSB-first) // Each row = 24 pixels = 3 bytes. Total = 24 * 3 = 72 bytes per icon. // ============================================================================ #if WEATHER_ENABLE_SMALL_ICONS // clang-format off // Small Clear Day - Sun static const uint8_t ICON_CLEAR_DAY_24[] = { 0xFF,0xFF,0xFF, 0xFF,0xE7,0xFF, 0xFF,0xE7,0xFF, 0xFF,0xE7,0xFF, 0xF3,0xE7,0xCF, 0xF9,0x00,0x9F, 0xFF,0x00,0xFF, 0xFE,0x00,0x7F, 0xFC,0x00,0x3F, 0xFC,0x00,0x3F, 0xE0,0x00,0x07, 0xE0,0x00,0x07, 0xE0,0x00,0x07, 0xE0,0x00,0x07, 0xFC,0x00,0x3F, 0xFC,0x00,0x3F, 0xFE,0x00,0x7F, 0xFF,0x00,0xFF, 0xF9,0x00,0x9F, 0xF3,0xE7,0xCF, 0xFF,0xE7,0xFF, 0xFF,0xE7,0xFF, 0xFF,0xE7,0xFF, 0xFF,0xFF,0xFF, }; // Small Clear Night - Moon static const uint8_t ICON_CLEAR_NIGHT_24[] = { 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xF0,0xFF, 0xFF,0xE0,0x7F, 0xFF,0xC0,0x3F, 0xFF,0x80,0x3F, 0xFF,0x80,0x7F, 0xFF,0x00,0xFF, 0xFF,0x01,0xFF, 0xFF,0x03,0xFF, 0xFF,0x03,0xFF, 0xFF,0x03,0xFF, 0xFF,0x03,0xFF, 0xFF,0x03,0xFF, 0xFF,0x01,0xFF, 0xFF,0x00,0xFF, 0xFF,0x80,0x7F, 0xFF,0x80,0x3F, 0xFF,0xC0,0x3F, 0xFF,0xE0,0x7F, 0xFF,0xF0,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, }; // Small Partly Cloudy static const uint8_t ICON_PARTLY_CLOUDY_24[] = { 0xFF,0xFF,0xFF, 0xFF,0xE7,0xFF, 0xFB,0xE7,0xDF, 0xFD,0x00,0xBF, 0xFF,0x00,0xFF, 0xFE,0x00,0x7F, 0xFE,0x00,0x7F, 0xFC,0x00,0x3F, 0xFF,0x00,0x7F, 0xFE,0x00,0x3F, 0xFC,0x00,0x1F, 0xF8,0x00,0x0F, 0xF0,0x00,0x0F, 0xF0,0x00,0x07, 0xE0,0x00,0x07, 0xE0,0x00,0x07, 0xE0,0x00,0x07, 0xE0,0x00,0x07, 0xF0,0x00,0x0F, 0xF8,0x00,0x1F, 0xFF,0x00,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, }; // Small Overcast - Cloud static const uint8_t ICON_OVERCAST_24[] = { 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xF0,0xFF, 0xFF,0xE0,0x7F, 0xFF,0xC0,0x3F, 0xFF,0x80,0x1F, 0xFF,0x00,0x1F, 0xFE,0x00,0x0F, 0xFC,0x00,0x07, 0xF8,0x00,0x07, 0xF0,0x00,0x03, 0xE0,0x00,0x03, 0xE0,0x00,0x03, 0xE0,0x00,0x03, 0xE0,0x00,0x03, 0xF0,0x00,0x07, 0xF8,0x00,0x0F, 0xFE,0x00,0x7F, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, }; // Small Rain static const uint8_t ICON_RAIN_24[] = { 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xF0,0xFF, 0xFF,0xE0,0x7F, 0xFF,0x80,0x1F, 0xFF,0x00,0x0F, 0xFE,0x00,0x07, 0xFC,0x00,0x07, 0xF0,0x00,0x03, 0xE0,0x00,0x03, 0xE0,0x00,0x03, 0xE0,0x00,0x03, 0xF0,0x00,0x07, 0xF8,0x00,0x0F, 0xFF,0x00,0xFF, 0xFF,0xFF,0xFF, 0xFE,0xF7,0xBF, 0xFD,0xEF,0x7F, 0xFD,0xEF,0x7F, 0xFB,0xDF,0x7F, 0xFB,0xDF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, }; // Small Snow static const uint8_t ICON_SNOW_24[] = { 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xF0,0xFF, 0xFF,0xE0,0x7F, 0xFF,0x80,0x1F, 0xFF,0x00,0x0F, 0xFE,0x00,0x07, 0xFC,0x00,0x07, 0xF0,0x00,0x03, 0xE0,0x00,0x03, 0xE0,0x00,0x03, 0xE0,0x00,0x03, 0xF0,0x00,0x07, 0xF8,0x00,0x0F, 0xFF,0x00,0xFF, 0xFF,0xFF,0xFF, 0xFE,0xF7,0xBF, 0xFF,0x7B,0xDF, 0xFE,0xF7,0xBF, 0xFF,0x7B,0xDF, 0xFE,0xF7,0xBF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, }; // Small Thunderstorm static const uint8_t ICON_THUNDERSTORM_24[] = { 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xF0,0xFF, 0xFF,0xE0,0x7F, 0xFF,0x80,0x1F, 0xFF,0x00,0x0F, 0xFE,0x00,0x07, 0xFC,0x00,0x07, 0xF0,0x00,0x03, 0xE0,0x00,0x03, 0xE0,0x00,0x03, 0xE0,0x00,0x03, 0xF0,0x00,0x07, 0xF8,0x00,0x0F, 0xFF,0x00,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xF1,0xFF, 0xFF,0xE3,0xFF, 0xFF,0xC0,0xFF, 0xFF,0xF1,0xFF, 0xFF,0xE3,0xFF, 0xFF,0xC7,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, }; // Small Fog static const uint8_t ICON_FOG_24[] = { 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xF0,0x00,0x0F, 0xE0,0x00,0x07, 0xF0,0x00,0x0F, 0xFF,0xFF,0xFF, 0xF8,0x00,0x1F, 0xF0,0x00,0x0F, 0xF8,0x00,0x1F, 0xFF,0xFF,0xFF, 0xF0,0x00,0x0F, 0xE0,0x00,0x07, 0xF0,0x00,0x0F, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF, }; // clang-format on #endif // WEATHER_ENABLE_SMALL_ICONS // ============================================================================ // Lookup functions // ============================================================================ const uint8_t* getWeatherIconLarge(WeatherIconType type) { switch (type) { case WeatherIconType::CLEAR_DAY: return WI48_CLEAR_DAY; case WeatherIconType::CLEAR_NIGHT: return WI48_CLEAR_NIGHT; case WeatherIconType::PARTLY_CLOUDY_DAY: return WI48_PARTLY_CLOUDY_DAY; case WeatherIconType::PARTLY_CLOUDY_NIGHT: return WI48_PARTLY_CLOUDY_NIGHT; case WeatherIconType::OVERCAST: return WI48_OVERCAST; case WeatherIconType::FOG: return WI48_FOG; case WeatherIconType::DRIZZLE: return WI48_DRIZZLE; case WeatherIconType::RAIN: case WeatherIconType::SHOWERS: return WI48_RAIN; case WeatherIconType::SNOW: return WI48_SNOW; case WeatherIconType::THUNDERSTORM: return WI48_THUNDERSTORM; default: return WI48_OVERCAST; } } #if WEATHER_ENABLE_SMALL_ICONS const uint8_t* getWeatherIconSmall(WeatherIconType type) { switch (type) { case WeatherIconType::CLEAR_DAY: return ICON_CLEAR_DAY_24; case WeatherIconType::CLEAR_NIGHT: return ICON_CLEAR_NIGHT_24; case WeatherIconType::PARTLY_CLOUDY_DAY: case WeatherIconType::PARTLY_CLOUDY_NIGHT: return ICON_PARTLY_CLOUDY_24; case WeatherIconType::OVERCAST: return ICON_OVERCAST_24; case WeatherIconType::FOG: return ICON_FOG_24; case WeatherIconType::DRIZZLE: case WeatherIconType::RAIN: case WeatherIconType::SHOWERS: return ICON_RAIN_24; case WeatherIconType::SNOW: return ICON_SNOW_24; case WeatherIconType::THUNDERSTORM: return ICON_THUNDERSTORM_24; default: return ICON_OVERCAST_24; } } #endif // WEATHER_ENABLE_SMALL_ICONS const char* getWindDirectionText(int degrees) { // Normalize to 0-360 degrees = ((degrees % 360) + 360) % 360; if (degrees >= 338 || degrees < 23) return "N"; if (degrees < 68) return "NE"; if (degrees < 113) return "E"; if (degrees < 158) return "SE"; if (degrees < 203) return "S"; if (degrees < 248) return "SW"; if (degrees < 293) return "W"; return "NW"; }