接上篇 esp8266 mixly blynk远程控制 + NTP+天气预报及一体 智能钟
时钟原理图见上篇文章

心知天气、农历API用的是ArduinoJson6解析。且采用的char* 变量 。上一版本用的ArduinoJson5 实时解析

Mixly1.20版本

Mixly1.20版本:https://gitee.com/mixlyplus/Mixly

钟还是那个钟,只是换了个灵魂 。这个时钟在2019年就做完,用到至今。当时采用的blynk,因blynk服务器不稳定,最近都无法登录。所以用点灯科技重新写了这个程序。
网络时钟功能及原理:
APP端配置:一个按钮控件:远程重启esp8266,温湿度数据控件:远程查看室内温湿度,WiFi信号数据控件:远程查看WiFi信号强弱 - db

功能:时钟时间由点灯授时,集成了点灯空气指数:自动定时更新、心知天气API:定时更新频率60分钟/次,心知天气无限制刷新、农历日历API:更新频率每天1次。农历日期记事定时提醒。如:生日或更难忘的日子。 整点、半点报时:WS2812 8灯以随机数方式自动点亮。 更多请自行研究。
**时钟可以用农历时间定时。**具体实现看程序代码
滚屏模式:按秒进行切换 特别处30S为记事显示。未到定时不显示内容。
有人会问官方有天气预报功能你用不香吗?
回答:官方的当然好。这不是为了给官方服务器减轻负担吗!哈哈。官方更新限制次数,特别是调试期。不知不觉中下载完程序然后报错,esp8266无限重启。你玩你就懂了。

特别说明:调试时尽量关闭上电更新点灯空气质量和农历API,这俩货每天是有访问次数的。主要症状:点灯 会无限重启报错 。农历 不显示信息
mcu:esp8266 作用:你想做的都由它负责。哈哈
显示:12864LCD 作用:显示你要看到的各个参数
传感器:DH22 & DH11 作用:观察室内实时温湿度变化
LED灯:WS2812 作用:整点/半点报时亮起
NMOS:mos管一只 作用:pWm调整液晶背光亮度。如:20点后调亮度为暗,6点调为明亮//有的lcD不支持调亮度,那你就高低电平控制
原理图附上:

心知天气显示

农历显示

室内温湿度

时间/日期

点灯空气质量

esp8266的IP地址

上电显示

未配网络显示,配网完成不显示

图太大没截全

点灯模块库

编译所用的库,及版本

调试时钟时用的液晶,这液晶2元某宝淘的。很Good。哈哈

分享完整代码。

#include <DHT.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <U8g2lib.h>
#include <ArduinoJson.h>
#include <Adafruit_NeoPixel.h>
//#include <ArduinoJson.h>#define BLINKER_PRINT Serial
#define BLINKER_ALIGENIE_OUTLET
#define BLINKER_WIFI
#include <Blinker.h>volatile int ws28122; //2812整点亮报时
volatile int shengri;//备忘定时提醒
volatile int g1;     //更新时间
volatile int g2;     //更新时间
volatile int airgxcs; //空气更新次数
volatile int xzgxcs;  //心知更新记数
volatile int nlgxcs;  //农历记数
volatile int nlgx;
volatile int kjgxtq; //上电更新天气农历空气开关
volatile int a1;
DHT dht5(5, 11);
volatile float dhtemp; //DH11温度
volatile float dhhumi; //DH11湿度
String host;           //心知服务器域名
String hosts;          //农历服务器域名
volatile int su_1;
volatile int xzgxkg;   //心知天气开关
volatile int nlgxkg;   //农历天气开关
volatile int airgxkg;  //点灯科技质量开关
Adafruit_NeoPixel rgb_display_4 = Adafruit_NeoPixel(8,4,NEO_RGB + NEO_KHZ800);char auth[] = "改成你的点灯科技密钥";
char ssid[] = "";
char pswd[] = "";#ifdef U8X8_HAVE_HW_ISP          //定义lcd连接方式为isp
#include <Wire.h>
#endif
#ifdef U8X8_HAVE_HW_SPI          //定义LCD连接方式为SPI
#include <SPI.h>
#endif
//此处可以改OLED 12864
U8G2_ST7565_LX12864_F_4W_SW_SPI u8g2(U8G2_R0,   /* clock=*/ 14, /* data=*/ 13, /* cs=*/ 15, /* dc=*/ 12, /* reset=*/ 16);
char x_weizhi[12]  = ""; //白天
char x_weather[12] = ""; //晚上天气
char x_uptemp[10]  = ""; //室外高温度
char x_dntemp[10]  = ""; //室外低温度
char x_humi[24]    = ""; //湿度
char x_wind[10]    = ""; //风向
char x_power[10]   = ""; //风力等级
//char x_update[25]  = ""; //更新时间
char x_speed[15]   = ""; //风速
char x_map[18]     = ""; //地理位置char a_aqi[12]   = ""; //空气质量
char a_level[12] = ""; //空气等级
char a_pm25[10]  = ""; //pm2.5
//char a_update[25] =""; //更新时间
//char a_o3[10]    =""; //臭氧,单位 μg/m³
//char a_pm10[10]  =""; //pm10
char n_nongli[30]    ="";  //农历2021年3月2日
//char n_chines[30]    ="";  //"二零二一年三月初二"
char n_ganzhi[12]    ="";  //"辛丑"
char n_shengxiao[12] ="";  //属性
char n_yue[10]       ="";  // 月份
char n_ri[10]        ="";  // 日
BlinkerNumber wendu("temp");
BlinkerNumber shidu("humi");
BlinkerNumber rssi("wifi");
void heartbeat(){//心跳包wendu.print(dhtemp);shidu.print(dhhumi);rssi.print(WiFi.RSSI());//WiFi信号APP端查看
}
void airData(const String & data) {BLINKER_LOG("空气质量: ", data);DynamicJsonDocument jsonBuffer(512);DeserializationError error = deserializeJson(jsonBuffer, data);JsonObject doc = jsonBuffer.as<JsonObject>();if (data[0] == '{') {strcpy(a_aqi, jsonBuffer["aqi"]); //空气质量strcpy(a_level, jsonBuffer["level"]); //空气等级strcpy(a_pm25, jsonBuffer["pm25"]); //pm2.5//strcpy(a_o3, jsonBuffer["O3"]); //臭氧,单位 μg/m³//strcpy(a_pm10, jsonBuffer["pm10"]); //臭氧,单位 μg/m³//strcpy(a_update, jsonBuffer["updateTime"]); //更新时间}else {BLINKER_LOG("airData_error!");//Serial.println(error.c_str());delay(1000);return;}
}
BlinkerButton Button("btn-A1");
void Button_callback(const String & state) {if (state == "on") {rest_0();Button.print("on");Button.text("重置成功");Blinker.vibrate(500);} else if (state == "off") {Button.print("off");Button.text("点击重置");Blinker.vibrate(500);}
}
BlinkerSlider slider1("ran-A1");
void slider1_callback(int32_t value) {analogWrite(0,value);su_1 = value;Blinker.vibrate(200);slider1.print(value);
}
void rest_1() {//esp8266软重启ESP.restart();
}void tianqi() {//点灯空气质量更新Blinker.air();Blinker.delay(5000);
}void ye_mei() {uint8_t status = 0;status = Blinker.connected();;if (status == true) {} else {u8g2.firstPage();do{u8g2.setFont(u8g2_font_ncenB08_tf);u8g2.setFontPosTop();u8g2.drawHLine(0,10,128);u8g2.setCursor(0,0);u8g2.print("----");u8g2.setFont(u8g2_font_wqy12_t_gb2312a);u8g2.setFontPosTop();u8g2.setCursor(8,25);u8g2.print("正在连接点灯服务器");u8g2.setCursor(10,45);u8g2.print("2019.9.17运行至今");}while(u8g2.nextPage());}Blinker.run();
}void rest_0() {//点灯重置/重置后需重新配网Blinker.reset();
}void ws2812(int R, int G, int B, int w_1) {//ws2812rgb_display_4.show();rgb_display_4.setPixelColor((w_1)-1, ((R & 0xffffff) << 16) | ((G & 0xffffff) << 8) | B);rgb_display_4.setPixelColor((w_1)-1, ((R & 0xffffff) << 16) | ((G & 0xffffff) << 8) | B);rgb_display_4.setPixelColor((w_1)-1, ((R & 0xffffff) << 16) | ((G & 0xffffff) << 8) | B);rgb_display_4.setPixelColor((w_1)-1, ((R & 0xffffff) << 16) | ((G & 0xffffff) << 8) | B);rgb_display_4.setPixelColor((w_1)-1, ((R & 0xffffff) << 16) | ((G & 0xffffff) << 8) | B);rgb_display_4.setPixelColor((w_1)-1, ((R & 0xffffff) << 16) | ((G & 0xffffff) << 8) | B);rgb_display_4.setPixelColor((w_1)-1, ((R & 0xffffff) << 16) | ((G & 0xffffff) << 8) | B);rgb_display_4.setPixelColor((w_1)-1, ((R & 0xffffff) << 16) | ((G & 0xffffff) << 8) | B);
}void xing_qi() {//计算星期显示在LCDu8g2.setFont(u8g2_font_wqy12_t_gb2312a);u8g2.setFontPosTop();if (Blinker.wday() == 0) {u8g2.setCursor(93,21);u8g2.print("星期日");}if (Blinker.wday() == 1) {u8g2.setCursor(93,21);u8g2.print("星期一");}if (Blinker.wday() == 2) {u8g2.setCursor(93,21);u8g2.print("星期二");}if (Blinker.wday() == 3) {u8g2.setCursor(93,21);u8g2.print("星期三");}if (Blinker.wday() == 4) {u8g2.setCursor(93,21);u8g2.print("星期四");}if (Blinker.wday() == 5) {u8g2.setCursor(93,21);u8g2.print("星期五");}if (Blinker.wday() == 6) {u8g2.setCursor(93,21);u8g2.print("星期六");}
}void shengri_1() {//记事功能定时启动,占用30秒/时间为阳历/来源为点灯授时if (Blinker.month() == 2 && Blinker.mday() == 5) {if (Blinker.second() == 30) {u8g2.firstPage();do{u8g2.setFont(u8g2_font_ncenB08_tf);u8g2.setFontPosTop();u8g2.drawHLine(0,10,128);u8g2.setCursor(0,0);u8g2.print("Wifi");u8g2.setCursor(40,0);u8g2.print(String(dhtemp) + String("C"));u8g2.setCursor(90,0);u8g2.print(String(dhhumi) + String("%"));u8g2.setFont(u8g2_font_wqy12_t_gb2312a);u8g2.setFontPosTop();u8g2.setCursor(0,14);u8g2.print("   今天是你生日");u8g2.setCursor(0,26);u8g2.print("朕祝你生日快乐");u8g2.setFont(u8g2_font_ncenB24_tf);u8g2.setFontPosTop();u8g2.setCursor(-2,37);u8g2.print(String(String(String(String(Blinker.hour()) + String(":")) + String(Blinker.minute())) + String(":")) + String(Blinker.second()));}while(u8g2.nextPage());Blinker.delay(5000);}}
}void dingsi_2812() {//整点/半点亮ws2812点亮为随机参数if (Blinker.year() != -1) {if (ws28122 == 0) {if (Blinker.minute() == 0) {randomSeed(millis());ws2812(random(1, 60), random(1, 50), random(1, 30), random(1, 8));Blinker.run();} else {ws2812(0, 0, 0, random(1, 8));Blinker.run();}if (Blinker.minute() == 30) {randomSeed(millis());ws2812(random(1, 20), random(1, 40), random(1, 30), random(1, 8));Blinker.run();} else {ws2812(0, 0, 0, random(1, 8));Blinker.run();}}}
}void guanbipingmu() {//每月1日定时重启esp8266if (Blinker.mday() == 1) {if (Blinker.hour() == 3) {if (Blinker.minute() == 0) {Blinker.delay(1000);rest_1();Blinker.run();}}}//定时每天6点调整LCD亮度 最亮if (Blinker.hour() == 6) {if (Blinker.minute() == 0) {digitalWrite(0,HIGH);ws28122 = 0;Blinker.run();}}//定时每天20点调整LCD亮度 最暗if (Blinker.hour() >= 20) {digitalWrite(0,LOW);ws28122 = 1;Blinker.delay(1000);Blinker.run();}
}void shengri_2() {//记事1功能定时启动,占用30秒/时间为农历/来源为api农历if (String(n_yue).equals(String("4")) && String(n_ri).equals(String("26"))) {if (Blinker.second() == 30) {u8g2.firstPage();do{u8g2.setFont(u8g2_font_ncenB08_tf);u8g2.setFontPosTop();u8g2.drawHLine(0,10,128);u8g2.setCursor(0,0);u8g2.print("Wifi");u8g2.setCursor(40,0);u8g2.print(String(dhtemp) + String("C"));u8g2.setCursor(90,0);u8g2.print(String(dhhumi) + String("%"));u8g2.setFont(u8g2_font_wqy12_t_gb2312a);u8g2.setFontPosTop();u8g2.setCursor(0,14);u8g2.print("  今天是你生日");u8g2.setCursor(0,26);u8g2.print("朕祝你生日快乐");u8g2.setFont(u8g2_font_ncenB24_tf);u8g2.setFontPosTop();u8g2.setCursor(-2,37);u8g2.print(String(String(String(String(Blinker.hour()) + String(":")) + String(Blinker.minute())) + String(":")) + String(Blinker.second()));}while(u8g2.nextPage());Blinker.delay(5000);}}
}void xunhuan2() {if (Blinker.hour() != -1) {//上电更新天气/空气质量/农历if (kjgxtq == 0) {tianqi();Blinker.delay(5000);nongli();Blinker.delay(5000);xinzhitq();kjgxtq = 1;}//按秒进行滚动显示/30秒处为定时记事显示if (Blinker.second() == 0) {u8g2.firstPage();do{u8g2.setFont(u8g2_font_ncenB08_tf);u8g2.setFontPosTop();u8g2.drawHLine(0,10,128);u8g2.setCursor(0,0);u8g2.print("Wifi");u8g2.setCursor(40,0);u8g2.print(String(dhtemp) + String("C"));u8g2.setCursor(90,0);u8g2.print(String(dhhumi) + String("%"));u8g2.setFont(u8g2_font_wqy12_t_gb2312a);u8g2.setFontPosTop();u8g2.setCursor(0,14);u8g2.print(String("白天: ") + String(x_weizhi));u8g2.setCursor(0,26);u8g2.print(String("夜间: ") + String(x_weather));u8g2.setCursor(65,14);u8g2.print(String(String("最高: ") + String(x_uptemp)) + String(" ℃"));u8g2.setCursor(65,26);u8g2.print(String(String("最低: ") + String(x_dntemp)) + String(" ℃"));u8g2.setCursor(0,38);u8g2.print(String("等级: ") + String(x_power));u8g2.setCursor(65,38);u8g2.print(String("风向: ") + String(x_wind));u8g2.setCursor(0,52);u8g2.print(String("湿度: ") + String(x_humi));u8g2.setCursor(65,52);u8g2.print(String(String("风速:") + String(x_speed)) + String("km/h"));}while(u8g2.nextPage());Blinker.delay(5000);BLINKER_LOG(String("农历:") + String(nlgxkg), String("心知:") + String(xzgxkg), String("空气:") + String(airgxkg));}if (Blinker.second() == 10) {u8g2.firstPage();do{u8g2.setFont(u8g2_font_ncenB08_tf);u8g2.setFontPosTop();u8g2.drawHLine(0,10,128);u8g2.setCursor(0,0);u8g2.print("Wifi");u8g2.setCursor(40,0);u8g2.print(String(dhtemp) + String("C"));u8g2.setCursor(90,0);u8g2.print(String(dhhumi) + String("%"));u8g2.setFont(u8g2_font_wqy12_t_gb2312a);u8g2.setFontPosTop();u8g2.setCursor(0,14);u8g2.print(String("温度:") + String(dhtemp));u8g2.setCursor(65,14);u8g2.print(String(String("湿度:") + String(dhhumi)) + String("%"));u8g2.setCursor(0,26);u8g2.print(String("心知:") + String(xzgxcs));u8g2.setCursor(42,26);u8g2.print(String("点灯:") + String(airgxcs));u8g2.setCursor(84,26);u8g2.print(String("农历:") + String(nlgxcs));u8g2.setFont(u8g2_font_ncenB24_tf);u8g2.setFontPosTop();u8g2.setCursor(-2,37);u8g2.print(String(String(String(String(Blinker.hour()) + String(":")) + String(Blinker.minute())) + String(":")) + String(Blinker.second()));}while(u8g2.nextPage());Blinker.delay(5000);}if (Blinker.second() == 20) {u8g2.firstPage();do{u8g2.setFont(u8g2_font_ncenB08_tf);u8g2.setFontPosTop();u8g2.drawHLine(0,10,128);u8g2.setCursor(0,0);u8g2.print("Wifi");u8g2.setCursor(40,0);u8g2.print(String(dhtemp) + String(" C"));u8g2.setCursor(90,0);u8g2.print(String(dhhumi) + String("%"));u8g2.setCursor(0,12);u8g2.print("LoIP:");u8g2.setCursor(34,12);u8g2.print(WiFi.localIP());u8g2.setCursor(0,24);u8g2.print(String("RSSI:  ") + String(WiFi.RSSI()));u8g2.setFont(u8g2_font_ncenB24_tf);u8g2.setFontPosTop();u8g2.setCursor(-2,37);u8g2.print(String(String(String(String(Blinker.hour()) + String(":")) + String(Blinker.minute())) + String(":")) + String(Blinker.second()));}while(u8g2.nextPage());Blinker.delay(5000);}if (Blinker.second() == 40) {u8g2.firstPage();do{u8g2.setFont(u8g2_font_ncenB08_tf);u8g2.setFontPosTop();u8g2.drawHLine(0,10,128);u8g2.setCursor(0,0);u8g2.print("Wifi");u8g2.setCursor(40,0);u8g2.print(String(dhtemp) + String("C"));u8g2.setCursor(90,0);u8g2.print(String(dhhumi) + String("%"));u8g2.setFont(u8g2_font_wqy12_t_gb2312a);u8g2.setFontPosTop();u8g2.setCursor(15,14);u8g2.print(n_nongli);u8g2.setCursor(65,14);u8g2.print("");u8g2.setCursor(0,27);u8g2.print(String("干支: ") + String(n_ganzhi));u8g2.setCursor(66,27);u8g2.print(String("生肖: ") + String(n_shengxiao));u8g2.setFont(u8g2_font_ncenB24_tf);u8g2.setFontPosTop();u8g2.setCursor(-2,37);u8g2.print(String(String(String(String(Blinker.hour()) + String(":")) + String(Blinker.minute())) + String(":")) + String(Blinker.second()));}while(u8g2.nextPage());Blinker.delay(5000);}if (Blinker.second() == 50) {u8g2.firstPage();do{u8g2.setFont(u8g2_font_ncenB08_tf);u8g2.setFontPosTop();u8g2.drawHLine(0,10,128);u8g2.setCursor(0,0);u8g2.print("Wifi");u8g2.setCursor(40,0);u8g2.print(String(dhtemp) + String("C"));u8g2.setCursor(90,0);u8g2.print(String(dhhumi) + String("%"));u8g2.setFont(u8g2_font_wqy12_t_gb2312a);u8g2.setFontPosTop();u8g2.setCursor(0,14);u8g2.print(String("位置: ") + String(x_map));u8g2.setCursor(65,14);u8g2.print(String("Pm25: ") + String(a_pm25));u8g2.setCursor(0,27);u8g2.print(String("质量: ") + String(a_aqi));u8g2.setCursor(65,27);u8g2.print(String("等级: ") + String(a_level));u8g2.setFont(u8g2_font_ncenB24_tf);u8g2.setFontPosTop();u8g2.setCursor(-2,37);u8g2.print(String(String(String(String(Blinker.hour()) + String(":")) + String(Blinker.minute())) + String(":")) + String(Blinker.second()));}while(u8g2.nextPage());Blinker.delay(5000);}}
}void dingshi_air() {//定时更新心知天气及点灯的空气质量if (airgxkg == 0) {if (Blinker.hour() == 4) {g2 = 4;}if (Blinker.hour() == 6) {g2 = 6;}if (Blinker.hour() == 8) {g2 = 8;}if (Blinker.hour() == 11) {g2 = 11;}if (Blinker.hour() == 15) {g2 = 15;}if (Blinker.hour() == 18) {g2 = 18;}if (Blinker.hour() == 20) {g2 = 20;}if (Blinker.hour() == g2) {if (Blinker.minute() == 0) {tianqi();Blinker.delay(3000);airgxcs = airgxcs + 1;airgxkg = 1;Blinker.run();}}}
}void nongli() {//农历生肖日期https://api.xlongwei.com/service/datetime/convert.json// Connect to APISerial.print("连接nongli服务器::::");Serial.println(hosts);// Use WiFiClient class to create TCP connectionsWiFiClient client;const int httpPort = 80;if (!client.connect(hosts, httpPort)) {Serial.println("连接失败");return;}// We now create a URI for the requestString url = "/service/datetime/convert.json";Serial.print("Requesting URL: ");Serial.println(url);// This will send the request to the serverclient.print(String("GET ") + url + " HTTP/1.1\r\n" +"Host: " + hosts + "\r\n" +"Connection: close\r\n\r\n");delay(100);// Read all the lines of the reply from server and print them to SerialString nong_data;while (client.available()) {String line = client.readStringUntil('\r');nong_data += line;}client.stop();Serial.println();Serial.println("关闭连接");Serial.println();// Convert to JSONString json_nong_data;int jsonIndex;for (int i = 0; i < nong_data.length(); i++) {if (nong_data[i] == '{') {jsonIndex = i;break;}}// Get JSON datajson_nong_data = nong_data.substring(jsonIndex);Serial.println();Serial.println(json_nong_data);// String input;StaticJsonDocument<512> doc;DeserializationError error = deserializeJson(doc, json_nong_data);if (error) {Serial.print(F("deserializeJson() failed: "));Serial.println(error.f_str());return;}//char state = 0;char string[25];char string1[25];strcpy(n_nongli, doc["nongli"]); //农历2021年3月2日//strcpy(n_chines, doc["chinese"]); //二零二一年三月初二//干支strcpy(n_ganzhi, doc["ganzhi"]); //"辛丑"//生肖strcpy(n_shengxiao, doc["shengxiao"]); //"牛"//月份itoa(doc["lunarMonth"], string, 10);strcpy(n_yue, string); //月份//memcpy(n_yue, doc["lunarMonth"]); // 3 月份//日 初一itoa(doc["lunarDay"], string1, 10);strcpy(n_ri, string1); //日//memcpy(n_ri, doc["lunarDay"]); // 日
}void nongligengxin() {//农历日期更新/每天更新一次if (nlgxkg == 0) {if (Blinker.hour() == 2) {nlgx = 2;}if (Blinker.hour() == nlgx) {if (Blinker.minute() == 0) {nongli();Blinker.delay(3000);nlgxkg = 1;nlgxcs = nlgxcs + 1;Blinker.run();}}}
}void xinzhitq() {//心知天气https://www.seniverse.com/// Connect to APISerial.print("连接心知天气服务器::::");Serial.println(host);// Use WiFiClient class to create TCP connectionsWiFiClient client;const int httpPort = 80;if (!client.connect(host, httpPort)) {Serial.println("连接失败");return;}// We now create a URI for the requestString url = "/v3/weather/daily.json?key=改成你的心知天气密钥_e&location=ip&language=zh-Hans&unit=c&start=0&days=1";Serial.print("Requesting URL: ");Serial.println(url);// This will send the request to the serverclient.print(String("GET ") + url + " HTTP/1.1\r\n" +"Host: " + host + "\r\n" +"Connection: close\r\n\r\n");delay(100);// Read all the lines of the reply from server and print them to SerialString weather_data;while (client.available()) {String line = client.readStringUntil('\r');weather_data += line;}client.stop();Serial.println();Serial.println("关闭连接");// Process weather_jsonSerial.println();//Serial.println("weather_data: ");// Serial.println(weather_data);// Convert to JSONString json_weather_data;int jsonIndex;for (int i = 0; i < weather_data.length(); i++) {if (weather_data[i] == '{') {jsonIndex = i;break;}}// Get JSON datajson_weather_data = weather_data.substring(jsonIndex);Serial.println();//Serial.println("json_weather_data: ");Serial.println(json_weather_data);// BLINKER_LOG("天气: ", json_weather_data);// String input;StaticJsonDocument<1024> doc;DeserializationError error = deserializeJson(doc, json_weather_data);if (error) {Serial.print(F("deserializeJson() failed: "));Serial.println(error.f_str());return;}JsonObject results_0 = doc["results"][0];JsonObject results_0_location = results_0["location"];strcpy(x_map, results_0_location["name"]); //地理位置JsonObject results_0_daily_0 = results_0["daily"][0];strcpy(x_weizhi, results_0_daily_0["text_night"]); //夜间天气strcpy(x_weather, results_0_daily_0["text_day"]); //白天天气strcpy(x_uptemp, results_0_daily_0["high"]); //室外高温度strcpy(x_dntemp, results_0_daily_0["low"]); //室外低温度strcpy(x_humi, results_0_daily_0["humidity"]); //室外湿度strcpy(x_wind, results_0_daily_0["wind_direction"]); //风向 东南西北风strcpy(x_power, results_0_daily_0["wind_scale"]); //风力等级strcpy(x_speed, results_0_daily_0["wind_speed"]); //风速//strcpy(x_update, results_0["last_update"]); //更新时间
}void dingshi_xz() {//定时更新心知天气及点灯的空气质量if (xzgxkg == 0) {if (Blinker.hour() == 2) {g1 = 2;}if (Blinker.hour() == 3) {g1 = 3;}if (Blinker.hour() == 4) {g1 = 4;}if (Blinker.hour() == 5) {g1 = 5;}if (Blinker.hour() == 6) {g1 = 6;}if (Blinker.hour() == 7) {g1 = 7;}if (Blinker.hour() == 8) {g1 = 8;}if (Blinker.hour() == 9) {g1 = 9;}if (Blinker.hour() == 10) {g1 = 10;}if (Blinker.hour() == 11) {g1 = 11;}if (Blinker.hour() == 12) {g1 = 12;}if (Blinker.hour() == 13) {g1 = 13;}if (Blinker.hour() == 14) {g1 = 14;}if (Blinker.hour() == 15) {g1 = 15;}if (Blinker.hour() == 16) {g1 = 16;}if (Blinker.hour() == 17) {g1 = 17;}if (Blinker.hour() == 18) {g1 = 18;}if (Blinker.hour() == 19) {g1 = 19;}if (Blinker.hour() == 20) {g1 = 20;}if (Blinker.hour() == 21) {g1 = 21;}if (Blinker.hour() == g1) {if (Blinker.minute() == 5) {xinzhitq();Blinker.delay(3000);xzgxcs = xzgxcs + 1;xzgxkg = 1;Blinker.run();}}}
}
//更新天气、农历、空气 记数开关。0更新状态,1为停止更新。时间为30分自动进入更新状态
void gengxin_KG() {if (Blinker.minute() == 30) {nlgxkg = 0;airgxkg = 0;xzgxkg = 0;}
}void setup(){Serial.begin(9600);u8g2.enableUTF8Print();Blinker.begin(auth,ssid,pswd);BLINKER_DEBUG.stream(Serial);#if defined(BLINKER_PRINT)BLINKER_DEBUG.stream(BLINKER_PRINT);#endifu8g2.begin();u8g2.enableUTF8Print();u8g2.clearBuffer();u8g2.clearDisplay();u8g2.setPowerSave(0);u8g2.setContrast(200);while (!(!(WiFi.status() != WL_CONNECTED))) {//未配网时显示u8g2.firstPage();do{u8g2.setFont(u8g2_font_ncenB08_tf);u8g2.setFontPosTop();u8g2.drawHLine(0,10,128);u8g2.setCursor(0,0);u8g2.print("----");u8g2.setFont(u8g2_font_wqy13_t_gb2312a);u8g2.setFontPosTop();u8g2.setCursor(0,18);u8g2.print("      无网络连接");u8g2.setCursor(0,40);u8g2.print("    请进行配置网络");}while(u8g2.nextPage());delay(500);//WiFi配网模式为STA,可用安可信微信端配网。很好用配网速度快快WiFi.mode(WIFI_STA);//自动配网开始int cnt = 0;while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");if (cnt++ >= 10) {WiFi.beginSmartConfig();while (1) {delay(1000);if (WiFi.smartConfigDone()) {Serial.println();Serial.println("SmartConfig: Success");break;}}}}//配网结束}Blinker.setTimezone(8.0);   //点灯时间Blinker.attachAir(airData); //注册回调函数,获取空气质量信息ws2812(0, 0, 0, random(1, 8));ws28122 = 0;shengri = 0;g1 = 0;g2 =0;airgxcs = 0;xzgxcs = 0;nlgxcs = 0;nlgx = 0;kjgxtq = 0;//上电更新天气a1 = 0;dht5.begin();dhtemp = dht5.readTemperature();dhhumi = dht5.readHumidity();host = "api.seniverse.com";hosts = "api.xlongwei.com";Blinker.attachHeartbeat(heartbeat);Button.attach(Button_callback);slider1.attach(slider1_callback);su_1 = 0;xzgxkg = 0;nlgxkg = 0;airgxkg = 0;rgb_display_4.begin();pinMode(0, OUTPUT);
}void loop(){ye_mei(); gengxin_KG(); //更新开关shengri_1();  //记事1公历时间shengri_2();  //记事2 农历日期nongligengxin(); //农历更新dingshi_air();  //定时更新空气质量dingshi_xz();   //d定时更新心知天气guanbipingmu(); //屏幕亮度控制if (Blinker.hour() != -1) {u8g2.firstPage();do{u8g2.setFont(u8g2_font_ncenB08_tf);u8g2.setFontPosTop();u8g2.drawHLine(0,10,128);u8g2.setCursor(0,0);u8g2.print("Wifi");u8g2.setCursor(40,0);u8g2.print(String(dhtemp) + String("C"));u8g2.setCursor(90,0);u8g2.print(String(dhhumi) + String("%"));u8g2.setFont(u8g2_font_ncenB12_tf);u8g2.setFontPosTop();u8g2.setCursor(0,18);u8g2.print(String(String(String(String(Blinker.year()) + String("-")) + String(Blinker.month())) + String("-")) + String(Blinker.mday()));u8g2.setFont(u8g2_font_ncenB24_tf);u8g2.setFontPosTop();u8g2.setCursor(-2,37);u8g2.print(String(String(String(String(Blinker.hour()) + String(":")) + String(Blinker.minute())) + String(":")) + String(Blinker.second()));xing_qi();}while(u8g2.nextPage());}dingsi_2812(); //报时亮起xunhuan2(); //按秒进行界面切换}

有需要程序图请留言。

程序图下载

esp8266点灯LCD12864心知天气+农历+空气质量ArduinoJson6相关推荐

  1. stm32+esp8266 GET请求心知天气的简单方法

    文章目录 前言 一.ESP8266调试 二.代码部分 1.esp8266部分 2.单片机代码部分 总结 前言 因为之前学习stm32+esp8266请求心知天气时看的不是很懂,然后在成功调试出来之后发 ...

  2. ESP8266+oled连接心知天气显示时间和实时天气

    因为时间比较仓促,目前存在许多问题没有解决. 首先进行aduino环境配置,具体方法可参考以下链接,若选错开发板型号编译会报错配置esp8266开发板的Arduino开发环境_交通运输怪味张的博客-C ...

  3. ESP8266使用AT指令获取时间和心知天气

    一.硬件:ESP8266,USB TO TTL模块,软件:串口调试助手 二.在心知官网注册账号:心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案 三.连接esp8266和us ...

  4. STM32使用ESP8266模块AT指令连接心知天气API获取天气信息

    由于之前使用STM32单片机来开发一些物联网的小项目,接触到了WIFI模块ESP8266,所以写下来记录一下.本文主要介绍的是STM32通过发送AT指令集来控制ESP8266 WIFI模块连接WiFi ...

  5. esp8266获取天气信息:心知天气get及url讲解说明

    本人最近在使用esp8266获取天气预报,在网上搜寻了一番,使用了心知天气的api(不是打广告),本人对网络方面不是很懂,经过几天的查找资料与学习,然后在博客记录下,方便以后的学习可广大学友. url ...

  6. XCOM(串口监视器,无单片机)+ESP8266显示心知天气天气信息

    XCOM(串口监视器,无单片机)+ESP8266显示心知天气天气信息 ESP8266 AT指令显示 这是第一次写博客,写的内容尽量通俗易懂贴近生活. PS:写的不好务必不要打我. ESP8266 一款 ...

  7. Esp8266 --深入分析官方json解析源码及如何使用json接口解析心知天气

    什么是json? 懵逼回答:[参考菜鸟教程]   a.JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)   b.JSON 是轻量级的文本数据交 ...

  8. 使用 Fiddler 调试 心知天气,stm32 esp8266获取天气api

    心知天气 - 免费用户的功能: 国内 370 个主要城市 天气实况,包括天气现象文字.代码和气温 3 项数据 未来 3 天天气预报,包括白天天气现象文字及代码.晚间天气现象文字及代码.当天最高温度和最 ...

  9. 利用Arduino Esp8266 心知天气API 获取天气预报信息(修改后可以DIY一个小型的桌面气象台)

    前期准备: 注册心知天气,获取API密钥  https://www.seniverse.com 生成API请求地址,北京今天和未来4天的预报请求地址如下: https://api.seniverse. ...

最新文章

  1. list集合分类显示
  2. 大量词云出现的时候IO的负担很大
  3. 中秋水文 | 安利一发国漫
  4. python数组展示_python如何显示数组
  5. np.random.randint产生一个范围内的数据
  6. 818. Race Car
  7. 服务器复制文件进程,服务器复制文件进程
  8. java 蓝桥杯 数字游戏
  9. 读书笔记-大型网站技术架构
  10. 基于CRNN的文本字符交易验证码识别--Paddle实战
  11. NIUDAY 七牛美图 AI 共享日 | 大咖云集 邀您共同探索各场景下的 AI 应用与落地...
  12. Selenium爬虫 -- 用户动态数据爬取
  13. 如何学习微信小程序? 学习微信小程序所需基础
  14. Android Studio ADB 命令大全
  15. 南华大学计算机全国排名多少位,华南理工大学全国排名第几位
  16. MXNet网络模型(四)GAN神经网络
  17. 程序员面试指南 - 自我介绍
  18. android中JNI知识(很全)
  19. LTspice快速上手--搭建简单RC电路
  20. 防骗指南-披着交友恋爱的外衣,诱骗受害者赌博转钱

热门文章

  1. 一个屌丝程序猿的人生(七十六)
  2. android 苹果电脑底部图标滚动效果,JS实现仿苹果底部任务栏菜单效果代码
  3. 2022年京东双11和天猫双11预售时间介绍
  4. 【UE】Slate编辑器动态添加Button
  5. 湖北武汉劳务员证书劳务人员实名制管理的现状建筑七大员培训
  6. 微信小程序在智能家居物联网中的应用
  7. 玩安卓从 0 到 1 之总体概览
  8. chrome浏览器在https网站中打开http图片,打不开的解决方案
  9. RealView MDK使用
  10. pyspark系列--统计基础