esp8266点灯LCD12864心知天气+农历+空气质量ArduinoJson6

接上篇 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不支持调亮度,那你就高低电平控制
原理图附上:
在这里插入图片描述

心知天气显示
心知天气显示
农历显示
农历显示
室内温湿度
室内温湿度,DH22
时间/日期
时间/日期
点灯空气质量
点灯空气质量
esp8266的IP地址
esp8266的IP地址
上电显示
上电显示
未配网络显示,配网完成不显示
未配网络显示,配网完成不显示
图太大没截全
图太大没截全
点灯模块库
在这里插入图片描述
编译所用的库,及版本
在这里插入图片描述
调试时钟时用的液晶,这液晶2元某宝淘的。很Good。哈哈
测试用的液晶,这液晶2元某宝淘的
分享完整代码。

#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(); //按秒进行界面切换

}

有需要程序图请留言。

程序图下载

  • 7
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琢磨侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值