下一步,准备用网页滑块去控制不同天气下的颜色显示并保存进EEPROM,以达到自定义颜色的目的。
天气代码有二十多种,每种都有红绿蓝三个数值,因此要存进EEPROM的东西非常杂乱。
身为强迫症,这种情况是不允许的。
于是把每种天气的红绿蓝三数值整合到一个JSON串中,无论是网页交互还是保存进EEPROM都是JSON串,需要用到的时候解析即可,一下子整洁了不少。
大致的代码如下:
uint32_t color;//颜色
int tianqi = 0;//天气代码。
String rgbJsonQing = "{\"r\":255,\"g\":255,\"b\":150}";
String rgbJsonDuoyun = "{\"r\":255,\"g\":255,\"b\":225}";
String rgbJsonYin = "{\"r\":0,\"g\":221,\"b\":255}";
String rgbJsonZhenyu = "{\"r\":0,\"g\":186,\"b\":255}";
String rgbJsonLeiZhenYu = "{\"r\":255,\"g\":242,\"b\":0}";
String rgbJsonBingBao = "{\"r\":255,\"g\":242,\"b\":0}";
String rgbJsonXiaoYu = "{\"r\":0,\"g\":175,\"b\":255}";
String rgbJsonZhongYu = "{\"r\":0,\"g\":135,\"b\":255}";
String rgbJsonDaYu = "{\"r\":48,\"g\":0,\"b\":255}";
String rgbJsonBaoYu = "{\"r\":211,\"g\":0,\"b\":255}";
String rgbJsonDaBaoYu = "{\"r\":255,\"g\":0,\"b\":201}";
String rgbJsonTeDaBaoYu = "{\"r\":255,\"g\":0,\"b\":160}";
String rgbJsonDongYu = "{\"r\":255,\"g\":242,\"b\":0}";
String rgbJsonYuJiaXue = "{\"r\":255,\"g\":242,\"b\":0}";
String rgbJsonXiaoXue = "{\"r\":0,\"g\":175,\"b\":255}";
String rgbJsonZhongXue = "{\"r\":48,\"g\":0,\"b\":255}";
String rgbJsonDaXue = "{\"r\":255,\"g\":0,\"b\":201}";
String rgbJsonBaoXue = "{\"r\":255,\"g\":0,\"b\":160}";
String rgbJsonFuChen = "{\"r\":255,\"g\":191,\"b\":0}";
String rgbJsonShaChenBao = "{\"r\":255,\"g\":124,\"b\":0}";
String rgbJsonWuMai = "{\"r\":255,\"g\":68,\"b\":0}";
String rgbJsonTaiFeng = "{\"r\":255,\"g\":0,\"b\":0}";
void loop() {
//不同天气,赋值不同颜色。这里可以自己任意修改。
if (tianqi == 0 || tianqi == 1 || tianqi == 2 || tianqi == 3) //晴
{
formatRGBFromJson(rgbJsonQing);
}
else if (tianqi == 4 || tianqi == 5 || tianqi == 6 || tianqi == 7 || tianqi == 8) //多云
{
formatRGBFromJson(rgbJsonDuoyun);
}
else if (tianqi == 9) //阴
{
formatRGBFromJson(rgbJsonYin);
}
else if (tianqi == 10) //阵雨
{
formatRGBFromJson(rgbJsonZhenyu);
}
else if (tianqi == 11) //雷阵雨
{
formatRGBFromJson(rgbJsonLeiZhenYu);
}
else if (tianqi == 12) //冰雹
{
formatRGBFromJson(rgbJsonBingBao);
}
else if (tianqi == 19) //冻雨
{
formatRGBFromJson(rgbJsonDongYu);
}
else if (tianqi == 20) //雨夹雪
{
formatRGBFromJson(rgbJsonYuJiaXue);
}
else if (tianqi == 13) //小雨
{
formatRGBFromJson(rgbJsonXiaoYu);
}
else if (tianqi == 22) //小雪
{
formatRGBFromJson(rgbJsonXiaoXue);
}
else if (tianqi == 14) //中雨
{
formatRGBFromJson(rgbJsonZhongYu);
}
else if (tianqi == 15) //大雨
{
formatRGBFromJson(rgbJsonDaYu);
}
else if (tianqi == 23) //中雪
{
formatRGBFromJson(rgbJsonZhongXue);
}
else if (tianqi == 16) //暴雨
{
formatRGBFromJson(rgbJsonDaYu);
}
else if (tianqi == 17 ) //大暴雨
{
formatRGBFromJson(rgbJsonBaoYu);
}
else if (tianqi == 24) //大雪
{
formatRGBFromJson(rgbJsonDaXue);
}
else if (tianqi == 18) //特大暴雨
{
formatRGBFromJson(rgbJsonTeDaBaoYu);
}
else if (tianqi == 25) //暴雪
{
formatRGBFromJson(rgbJsonBaoXue);
}
else if (tianqi == 26 || tianqi == 27) //浮尘,扬沙
{
formatRGBFromJson(rgbJsonFuChen);
}
else if (tianqi == 28 || tianqi == 29) //沙尘暴,强沙尘暴
{
formatRGBFromJson(rgbJsonShaChenBao);
}
else if (tianqi == 30 || tianqi == 31) //雾,霾
{
formatRGBFromJson(rgbJsonWuMai);
}
else if (tianqi == 32 || tianqi == 33 || tianqi == 34 || tianqi == 35 || tianqi == 36) //风,大风,飓风,热带风暴,龙卷风
{
formatRGBFromJson(rgbJsonTaiFeng);
}
else
{
formatRGBFromJson(rgbJsonQing);
}
for (i = 0; i < 9; i++)
{
strip.setPixelColor(i, color);
}
strip.show();//更新彩灯状态
}
//解析JSON串,根据不同天气代码,将color赋值为不同颜色。
void formatRGBFromJson(String json)
{
Serial.println(json);
DynamicJsonDocument doc(100);//rgb字符串长度不会大于25,所以这里设定50即可
DeserializationError error = deserializeJson(doc, json);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
JsonObject obj = doc.as<JsonObject>();
color = strip.Color(obj["r"], obj["g"], obj["b"]);
}
代码中的tianqi变量,是通过解析心知天气的JSON串得来的,获得方法参照
ESP8266制作天气预报海藻球微景观生态缸记录(三)-更换原装灯为彩灯,实现根据未来天气变色
也可以下载完整的代码文件
ESP01S人体感应开关WS2812天气预报彩灯代码V1.0 https://download.csdn.net/download/tansuo2005/83607705
其实这个生态缸灯早已可用,现在做的工作都是在为它增加设置功能。总不能要改个亮度和颜色都要重新编译下载吧。
这真是突出了ESP系列的一个巨大优点,那就是借用手机这个人手一只的物件就可以远程操作,而无需单独用显示屏和按键写复杂的UI控制(还只能本地操作)。就凭这一点,哪怕你的小制作不需要用到WiFi,也是该选用ESP系列的。