这个问题其实没有一个**全球统一"固定数量"**的天气状态标准,不同气象机构(比如中国气象局、WMO、METAR航空天气)分类都不一样。
但在嵌入式/APP开发里,一般会用一个**"工程上够用 + 覆盖常见情况"**的分类,大概 20~40种状态比较合理。
我给你一套非常实用、工程可落地的完整天气枚举(约30种),适合你ESP32 + LVGL项目直接用 👇
✅ 常见天气状态分类(工程版)
☀️ 晴天类
- 晴
- 少云
- 多云
- 阴
🌧️ 雨类
- 小雨
- 中雨
- 大雨
- 暴雨
- 雷阵雨
- 雷阵雨伴有冰雹
❄️ 雪类
- 小雪
- 中雪
- 大雪
- 暴雪
- 雨夹雪
🌫️ 能见度类
- 雾
- 浓雾
- 霾(PM2.5)
- 浮尘
- 扬沙
- 沙尘暴
🌬️ 风类
- 微风
- 大风
- 烈风
- 台风
🌡️ 特殊天气
- 冰雹
- 冻雨
- 霜
- 高温
- 低温
- 龙卷风
✅ C语言枚举定义(推荐直接用)
c
typedef enum
{
WEATHER_UNKNOWN = 0,
// ☀️ 晴天类
WEATHER_CLEAR, // 晴
WEATHER_PARTLY_CLOUDY, // 少云
WEATHER_CLOUDY, // 多云
WEATHER_OVERCAST, // 阴
// 🌧️ 雨类
WEATHER_LIGHT_RAIN, // 小雨
WEATHER_MODERATE_RAIN, // 中雨
WEATHER_HEAVY_RAIN, // 大雨
WEATHER_STORM_RAIN, // 暴雨
WEATHER_THUNDER_SHOWER, // 雷阵雨
WEATHER_HAIL_THUNDER, // 雷阵雨伴冰雹
// ❄️ 雪类
WEATHER_LIGHT_SNOW, // 小雪
WEATHER_MODERATE_SNOW, // 中雪
WEATHER_HEAVY_SNOW, // 大雪
WEATHER_BLIZZARD, // 暴雪
WEATHER_SLEET, // 雨夹雪
// 🌫️ 能见度
WEATHER_FOG, // 雾
WEATHER_HEAVY_FOG, // 浓雾
WEATHER_HAZE, // 霾
WEATHER_DUST, // 浮尘
WEATHER_SAND, // 扬沙
WEATHER_SANDSTORM, // 沙尘暴
// 🌬️ 风
WEATHER_BREEZE, // 微风
WEATHER_STRONG_WIND, // 大风
WEATHER_GALE, // 烈风
WEATHER_TYPHOON, // 台风
// 🌡️ 特殊
WEATHER_HAIL, // 冰雹
WEATHER_FREEZING_RAIN, // 冻雨
WEATHER_FROST, // 霜
WEATHER_HEAT, // 高温
WEATHER_COLD, // 低温
WEATHER_TORNADO, // 龙卷风
WEATHER_MAX
} weather_type_t;
✅ 实战建议(非常关键)
你这个是做 ESP32天气显示 + LVGL UI,建议这样设计:
1️⃣ 枚举 + 字符串映射
c
const char *weather_str[] = {
"未知",
"晴",
"少云",
"多云",
"阴",
...
};
2️⃣ 图标映射(LVGL)
c
const lv_img_dsc_t *weather_icon[] = {
&img_unknown,
&img_sunny,
&img_cloudy,
...
};
3️⃣ API适配层(重点)
天气API(比如和风天气)返回的是字符串:
json
"weather": "小雨"
你需要写转换函数:
c
weather_type_t weather_parse(const char *str)
{
if (strcmp(str, "晴") == 0) return WEATHER_CLEAR;
if (strcmp(str, "小雨") == 0) return WEATHER_LIGHT_RAIN;
...
}
🚀 如果你想做"高级一点"(建议)
可以扩展成:
c
typedef struct {
weather_type_t type;
int temperature;
int humidity;
int wind_level;
} weather_info_t;
这样你以后可以做:
- 动态UI动画 🌧️🌩️❄️
- 温湿度图形化(你之前说要做艺术风)
- 天气趋势曲线
👍 总结一句话
👉 没有统一标准,但工程上30种左右最实用
👉 关键不是"有多少种",而是"API怎么映射 + UI怎么展示"