接上篇 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) {
//ws2812
rgb_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() {
//计算星期显示在LCD
u8g2.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日定时重启esp8266
if (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 API
Serial.print("连接nongli服务器::::");
Serial.println(hosts);
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(hosts, httpPort)) {
Serial.println("连接失败");
return;
}
// We now create a URI for the request
String url = "/service/datetime/convert.json";
Serial.print("Requesting URL: ");
Serial.println(url);
// This will send the request to the server
client.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 Serial
String nong_data;
while (client.available()) {
String line = client.readStringUntil('\r');
nong_data += line;
}
client.stop();
Serial.println();
Serial.println("关闭连接");
Serial.println();
// Convert to JSON
String json_nong_data;
int jsonIndex;
for (int i = 0; i < nong_data.length(); i++) {
if (nong_data[i] == '{') {
jsonIndex = i;
break;
}
}
// Get JSON data
json_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 API
Serial.print("连接心知天气服务器::::");
Serial.println(host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("连接失败");
return;
}
// We now create a URI for the request
String 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 server
client.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 Serial
String weather_data;
while (client.available()) {
String line = client.readStringUntil('\r');
weather_data += line;
}
client.stop();
Serial.println();
Serial.println("关闭连接");
// Process weather_json
Serial.println();
//Serial.println("weather_data: ");
// Serial.println(weather_data);
// Convert to JSON
String json_weather_data;
int jsonIndex;
for (int i = 0; i < weather_data.length(); i++) {
if (weather_data[i] == '{') {
jsonIndex = i;
break;
}
}
// Get JSON data
json_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);
#endif
u8g2.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(); //按秒进行界面切换
}
有需要程序图请留言。