基于Blinker ESP8266 远程开关、温湿度计、ADC接口测温、温控风扇、网络时钟、天气预报、温控散热风扇。SSD1306可轮番显示时钟和温度信息。APP图表、小爱控制

发布于:2022-12-28 ⋅ 阅读:(867) ⋅ 点赞:(0)

 ESP8266系列文章目录

目录

ESP8266系列文章目录 

经过不断的努力,第二次作品终于调试完成。用的Arduino

主页下载的文件有疑问可私信

最近自己又画了个MOS的开关板子,用于PWM控制散热风扇。IO高低电平也是代码中增加识别,判断开关状态。增加了散热风扇手动开关。输出可定时、可温控。(网络时钟用的B站UP主会飞的阿卡林的代码) 可以小爱控制开关。

 091893064913417a8358c8a80ec18fb5.png18d78ae7e0ee431796558466456b8803.jpeg

 用在风扇PWM控制的Nmos板子,嘉立创免费打样。

8e1b4180718d408b8b98eca0ef00c547.png

 控制可控硅的板子,嘉立创免费打样。

 

 

ed248996575e44fe831650424c837b96.jpega06422c8aefb40d08c50e26af1ee0b14.jpeg

 

4fd8000eff614d1984de98790dded1a0.jpegc95f6a4c747c4dab9cfa5465ab546790.jpeg2fa1728c9be34798a890f2a648739f74.jpegdd3babcfaaa54138bcd9b93c9c8929b8.jpega9179ddedc9f4e6eb3eda2ac8c7ac986.jpegb9cbc574b9d94e8da486714ae8ba9ad6.jpeg9c4d80946b834ab38f38936ad3b3c1ee.jpegffb7497d3064452886cca7f4c6713875.jpeg8c9ecb12c8c4438e8444c3cca206b95f.jpeg0af6ca6a29a7430f97ced1b878c65047.jpeg6427011fb5924f3e850477bdaf94d5ba.jpeg

 

1、功能讲解

(感兴趣的和我一样初学的朋友可以进主页可直接下载原文件,太长了网页不好放,用了太多的IF语句用来判断不同状态向APP发送不同的文字颜色、图标)进入主页可直接下载源文件。

带有一个SSD1306 OLED屏,可以显示时间、天气预报、温度,BLINKERapp上可显示实时状态、环境温度、环境湿度、控制器温度、控制器温控散热风扇(可在APP查看状态)。还有图表功能。App端文字颜色可根据参数自动变更、图标也是根据参数变更(用了很多的if语句。 按刷新健对APP数据进行刷新。 

2、硬件

ESP8266开发板一块、SSD1306屏幕(0.96寸IIC接口)、dht11温湿度传感器、10K电阻+10K热敏电阻(用来A0  ADC接口测温度),可控硅、散热片、PCB板,及相关的零件。照片没有将所有硬件拍全。

70ba314ff4bd42b5b050fe3c79845fc6.png

 原理图只画了一半就直接画的PCB ,所以就不上原理图了。有兴趣的朋友可以直接进主页下载PCB文件,嘉立创打样。

3、硬件连接

使用D1控制可控硅(BTA2-600B),加散热风扇后使用我的2000W吹风机满功率运行10分钟,可控硅温度保持在57摄氏度左右,温度可控!程序里面写了可控硅温度超过85℃,自动关停,需要手动恢复。D2连接散热风扇控制板,控制板连接散热风扇。其余连接线按照PCB丝印连接。注意:按钮板上的D2接开发板D8(调试过程中改了,PCB已经打样了,无法修改)

34a07ba0c9db4e42bc86bbb60ae7a7b6.png

4、程序编写

使用的需要额外下载的库文件:U8g2.h、DHT11.h后两者可以直接在Arduion开发软件内部下载。

不一一例举了,下载源文件编译提示缺什么库就直接在Arduion开发软件内部下载即可。

1、整体框架就是BLINKER WiFi的结构,这里就不写出来了。

void setup(){
    
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);
    Blinker.begin(auth, ssid, pswd);
    Blinker.attachHeartbeat(heartbeat);
    Blinker.attachDataStorage(dataStorage);
    BlinkerMIOT.attachPowerState(miotPowerState); //小爱电源控制
    //pinMode(D8, OUTPUT);
    pinMode(D7,OUTPUT);
    pinMode(D1,OUTPUT);
    digitalWrite(D1, LOW);
    attachInterrupt(digitalPinToInterrupt(touchPin), touchDownInterrupt, RISING);
    attachInterrupt(digitalPinToInterrupt(touchPin1), touchDownInterrupt1, RISING);
    attachInterrupt(digitalPinToInterrupt(touchPin2), touchDownInterrupt2, RISING);
    
    //Button1.attach(button1_callback);//绑定按键回调
    Button4.attach(button4_callback);//绑定按键回调
    Button3.attach(button3_callback);//绑定按键回调
    Button5.attach(button5_callback);//绑定按键回调
    //Button6.attach(button6_callback);//绑定按键回调
    Button7.attach(button7_callback);//绑定按键回调
    Button8.attach(button8_callback);//绑定按键回调
    Blinker.attachData(dataRead);
    dht.begin();//DTHXX传感器初始化
    initdisplay();


  
  
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_unifont_t_chinese2);
  u8g2.setCursor(0, 14);
  u8g2.print("Waiting for WiFi");
  u8g2.setCursor(0, 30);
  u8g2.print("connection...");
  u8g2.sendBuffer();
  connectWiFi();  // 连接WiFi  显示状态
  Udp.begin(localPort);
  setSyncProvider(getNtpTime);
  setSyncInterval(300); //每300秒同步一次时间

  
}

time_t prevDisplay = 0; //当时钟已经显示
 
void loop(){
  Blinker.run();
  Ntctest();//控制器温度测量

  powerMode();
  powerMode1();
  powerMode2();

    if(mode4==0)
    {
      
    if (sta>=0 && sta<=250){
      clock_display(prevDisplay);
      
    }else if(sta == 251){
      TandW();
      
    }else if(sta == 252){
      threeday();
      
    }else{
      showMode11();
      delay(2000);
      }

    ++sta;

    if(sta==254){
      sta = 0;
    }
     if(mode==1)
     {
      if(mode2==0)
     {
      highTEMP1();
      }else if(mode2==1)         
    {
      lowTEMP1();
      }
      }
    }
    else if(mode4==1&&mode==1)
    {
      if(mode1==0)
     {
      showMode4(); 
      }else if(mode1==1)
      {
        showMode5();
        }
      }
      
     if (mode == 0)
  {
    // 模式0
    showMode0();
  }else if(mode4==0&&mode3==1)
    {
     if(mode2==0)
      {
        showMode4(); 
        delay(1000);
        mode3=0;
        }
        else if(mode2==1)
        {
           showMode5();
           delay(1000);
           mode3=0;
          }}
   
   
  /******************************************/

 if(Modes==0)
  { 
  if (tem11>=40) {
    // 打开风扇
     // forward();  //执行前进(正转)函数
     //analogWriteRange(1023);
   //byte speed=(tem11-39)*6.22;
   //analogWrite(IA,speed);  
 if(tem11>=40&&tem11<=42)
{  
   analogWrite(IA,63.75); 
   
}
if(tem11>42&&tem11<=43)
{  
   analogWrite(IA,127.5); 
   
}
if(tem11>43&&tem11<=45)
{  
   analogWrite(IA,191.25);
    
}
if(tem11>45)
{  
   analogWrite(IA,255);
   
}
  } 
  else
 {
   //关闭风扇
   //byte speed=0;
   //analogWrite(IA,speed);  
   analogWrite(IA,0);  
  
    //digitalWrite(IA, LOW);
    //TEXT3.print("风扇关闭");
  }
    }

/******************************************/

    time2 = millis(); 
 
    if ((time2 - time1) >= 10)
    {
      time1 = time2;
    h = dht.readHumidity();
    t = dht.readTemperature();

    if (isnan(h) || isnan(t))
    { 
        BLINKER_LOG("Failed to read from DHT sensor!");
    }
    else
    {
        BLINKER_LOG("Humidity: ", h, " %");
        BLINKER_LOG("Temperature: ", t, " *C");
        humi_read = h;
        temp_read = t;
    }
    //DHT11读温湿度

     
      if(temp_read>0)
   {
     if (temp_read>=temp_readMAX)
     {
       temp_readMAX = temp_read;
      }
      }else
      {
        if (temp_read<=temp_readMAX)
     {
       temp_readMAX = temp_read;
      }
        }
        
     time6 = millis();  
   if((time6-time5)>2000)
   {
    time5=time6;
    if(temp_read<0)
   {
   Blinker.notify(String("环境温度过低!")+String(String(temp_read)+String("℃")));
 
   }
   if(temp_read>36)
   {
   Blinker.notify(String("环境温度过高!")+String(String(temp_read)+String("℃")));
   Blinker.vibrate();
   }
   if(tem11>85)
   { 
     Blinker.notify(String("控制器温度过高关闭!")+String(String(tem11)+String("℃")));
     Blinker.vibrate();
    }
    }
    }
    
   if(tem11>85)
   { mode=0;
     isshow=0;
    }
}

/**
 * 按键按下去的中断*1
 * 
 */
ICACHE_RAM_ATTR void touchDownInterrupt()
{
  // 如果已经按下过一次,且第二次按下的时间不超过150ms则表示双击
  if (isOne && millis() - firstTouchTime <= 150)
  {
    isOne = 0;
    isDouble = 1;
    touchStatus = 2;
  }
  // 记录按下的时间
  touchDownTime = millis();
  attachInterrupt(digitalPinToInterrupt(touchPin), touchUpInterrupt, FALLING);
  
}

/**
 * 按键弹起来的中断
 * 
 */
ICACHE_RAM_ATTR void touchUpInterrupt()
{
  // 记录按键按起时间
  touchUpTime = millis();
  // 按键按下到按起时间超过700毫秒则表示处于长按状态
  if ((touchUpTime - touchDownTime) > 700)
  {
    touchStatus = 3;
  }
  else if (isDouble)
  {
    isDouble = 0;
  }
  else
  {
    isOne = 1;
    firstTouchTime = millis();
  }
  attachInterrupt(digitalPinToInterrupt(touchPin), touchDownInterrupt, RISING);
}

/**
 * 按键按下去的中断*2
 * 
 */
ICACHE_RAM_ATTR void touchDownInterrupt1()
{
  // 如果已经按下过一次,且第二次按下的时间不超过150ms则表示双击
  if (isOne1 && millis() - firstTouchTime1 <= 150)
  {
    isOne1 = 0;
    isDouble1 = 1;
    touchStatus1 = 2;
  }
  // 记录按下的时间
  touchDownTime1 = millis();
  attachInterrupt(digitalPinToInterrupt(touchPin1), touchUpInterrupt1, FALLING);
  
}

/**
 * 按键弹起来的中断
 * 
 */
ICACHE_RAM_ATTR void touchUpInterrupt1()
{
  // 记录按键按起时间
  touchUpTime1 = millis();
  // 按键按下到按起时间超过700毫秒则表示处于长按状态
  if ((touchUpTime1 - touchDownTime1) > 700)
  {
    touchStatus1 = 3;
  }
  else if (isDouble1)
  {
    isDouble1 = 0;
  }
  else
  {
    isOne1 = 1;
    firstTouchTime1 = millis();
  }
  attachInterrupt(digitalPinToInterrupt(touchPin1), touchDownInterrupt1, RISING);
}



/**
 * 按键按下去的中断*3
 * 
 */
ICACHE_RAM_ATTR void touchDownInterrupt2()
{
  // 如果已经按下过一次,且第二次按下的时间不超过150ms则表示双击
  if (isOne2 && millis() - firstTouchTime2 <= 150)
  {
    isOne2 = 0;
    isDouble2 = 1;
    touchStatus2 = 2;
  }
  // 记录按下的时间
  touchDownTime2 = millis();
  attachInterrupt(digitalPinToInterrupt(touchPin2), touchUpInterrupt2, FALLING);
  
}

/**
 * 按键弹起来的中断
 * 
 */
ICACHE_RAM_ATTR void touchUpInterrupt2()
{
  // 记录按键按起时间
  touchUpTime2 = millis();
  // 按键按下到按起时间超过700毫秒则表示处于长按状态
  if ((touchUpTime2 - touchDownTime2) > 700)
  {
    touchStatus2 = 3;
  }
  else if (isDouble2)
  {
    isDouble2 = 0;
  }
  else
  {
    isOne2 = 1;
    firstTouchTime2 = millis();
  }
  attachInterrupt(digitalPinToInterrupt(touchPin2), touchDownInterrupt2, RISING);
}


 
// 向心知天气服务器服务器请求信息并对信息进行解析
void httpRequest(String reqRes,int stat){
  WiFiClient client;

  // 建立http请求信息
  String httpRequest = String("GET ") + reqRes + " HTTP/1.1\r\n" + 
                              "Host: " + host + "\r\n" + 
                              "Connection: close\r\n\r\n";
  Serial.println(""); 
  Serial.print("Connecting to "); Serial.print(host);

  // 尝试连接服务器
  if (client.connect(host, 80)){
    Serial.println(" Success!");
 
    // 向服务器发送http请求信息
    client.print(httpRequest);
    Serial.println("Sending request: ");
    Serial.println(httpRequest);  
 
    // 获取并显示服务器响应状态行 
    String status_response = client.readStringUntil('\n');
    Serial.print("status_response: ");
    Serial.println(status_response);
 
    // 使用find跳过HTTP响应头
    if (client.find("\r\n\r\n")) {
      Serial.println("Found Header End. Start Parsing.");
    }
    if (stat == 0){
      
      // 利用ArduinoJson库解析心知天气响应信息(实时数据)
      parseInfo_now(client,1); 
    }else if(stat == 1){
      parseInfo_fut(client,1);
    }
  }
  else {
    Serial.println(" connection failed!");
    if (stat == 0){
      
      // 利用ArduinoJson库解析心知天气响应信息(实时数据)
      parseInfo_now(clientNULL,0); 
    }else if(stat == 1){
      parseInfo_fut(clientNULL,0);
    }
  }
    
  //断开客户端与服务器连接工作
  client.stop(); 
}

// 连接WiFi
void connectWiFi(){
  //WiFi.begin(ssid, password);                  // 启动网络连接
  //Serial.print("Connecting to ");              // 串口监视器输出网络连接信息
  //Serial.print(ssid); Serial.println(" ...");  // 告知用户NodeMCU正在尝试WiFi连接
  
     int i = 0;                                // 这一段程序语句用于检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED) {      // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
    delay(1000);                               // 如果WiFi连接成功则返回值为WL_CONNECTED                       
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_wqy16_t_gb2312);
  u8g2.setCursor(18, 16);
  u8g2.print("WIFI连接时间");
  u8g2.setFont(u8g2_font_logisoso24_tr);     //u8g2_font_ncenB14_tf
  u8g2.setCursor(56, 55);
  u8g2.print(i++);                               // 这个读秒是通过变量i每隔一秒自加1来实现的。
  u8g2.sendBuffer();                           // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
  }                                            // 同时NodeMCU将通过串口监视器输出连接时长读秒。
  u8g2.clearBuffer();                           // WiFi连接成功后
  u8g2.setFont(u8g2_font_wqy16_t_gb2312);        // NodeMCU将通过串口监视器输出"连接成功"信息。
  u8g2.setCursor(32, 20);                        // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
  u8g2.print("连接成功");                        // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
  u8g2.setFont(u8g2_font_unifont_t_chinese2);
  u8g2.setCursor(0, 50);
  u8g2.print("IP:");
  u8g2.setCursor(22, 50);
  u8g2.print(WiFi.localIP());
  u8g2.sendBuffer();
  delay(1000);           
}

// 利用ArduinoJson库解析心知天气响应信息(实时)
void parseInfo_now(WiFiClient client,int i){

  if(i==1){
  const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 230;
  DynamicJsonDocument doc(capacity);
  
  deserializeJson(doc, client);
  
  JsonObject results_0 = doc["results"][0];
  
  JsonObject results_0_now = results_0["now"];
  const char* results_0_now_text = results_0_now["text"]; // "Sunny"
  const char* results_0_now_code = results_0_now["code"]; // "0"
  const char* results_0_now_temperature = results_0_now["temperature"]; // "32"
  
  const char* results_0_last_update = results_0["last_update"]; // "2020-06-02T14:40:00+08:00" 
 
  // 通过串口监视器显示以上信息
  String results_0_now_text_str = results_0_now["text"].as<String>(); 
  int results_0_now_code_int = results_0_now["code"].as<int>(); 
  int results_0_now_temperature_int = results_0_now["temperature"].as<int>(); 
  String results_0_last_update_str = results_0["last_update"].as<String>();   
 
  Serial.println(F("======Weahter Now======="));
  Serial.print(F("Weather Now: "));
  Serial.print(results_0_now_text_str);
  Serial.print(F(" "));
  Serial.println(results_0_now_code_int);
  Serial.print(F("Temperature: "));
  Serial.println(results_0_now_temperature_int);
  Serial.print(F("Last Update: "));
  Serial.println(results_0_last_update_str);
  Serial.println(F("========================"));
  display_0(results_0_now_temperature_int,results_0_now_text_str);
  results_0_now_text_str_old = results_0_now_text_str;
  results_0_now_temperature_int_old = results_0_now_temperature_int;
  }
  else{
    display_0(results_0_now_temperature_int_old,results_0_now_text_str_old);
  }
 
}
//----------输出实时天气----------
void display_0(int results_0_now_temperature_int,String results_0_now_text_str){
  //显示输出
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_wqy16_t_gb2312);
  u8g2.setCursor(15, 14);
  u8g2.print("重庆实时天气");
  u8g2.setFont(u8g2_font_logisoso24_tr);
  u8g2.setCursor(35, 44);
  u8g2.print(results_0_now_temperature_int);

  u8g2.drawCircle(70,20,2,U8G2_DRAW_ALL);
  //这里我打不出来℃所以画一个圆上去
  u8g2.setCursor(75,44);
  u8g2.print("C");

  
  u8g2.setCursor(35, 61);
  u8g2.setFont(u8g2_font_unifont_t_chinese2);
  u8g2.print(results_0_now_text_str);
  u8g2.sendBuffer();
}


// 利用ArduinoJson库解析心知天气响应信息(预测)
void parseInfo_fut(WiFiClient client,int i){
  if(i==1){
    
  
  const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(3) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 3*JSON_OBJECT_SIZE(14) + 860;
  
  DynamicJsonDocument doc(capacity);
  
  deserializeJson(doc, client);
  
  JsonObject results_0 = doc["results"][0];
  
  JsonArray results_0_daily = results_0["daily"];
  
  JsonObject results_0_daily_0 = results_0_daily[0];
  const char* results_0_daily_0_date = results_0_daily_0["date"]; 
  const char* results_0_daily_0_text_day = results_0_daily_0["text_day"]; 
  const char* results_0_daily_0_code_day = results_0_daily_0["code_day"];
  const char* results_0_daily_0_text_night = results_0_daily_0["text_night"]; 
  const char* results_0_daily_0_code_night = results_0_daily_0["code_night"]; 
  const char* results_0_daily_0_high = results_0_daily_0["high"];
  const char* results_0_daily_0_low = results_0_daily_0["low"]; 
  const char* results_0_daily_0_rainfall = results_0_daily_0["rainfall"];
  const char* results_0_daily_0_precip = results_0_daily_0["precip"]; 
  const char* results_0_daily_0_wind_direction = results_0_daily_0["wind_direction"]; 
  const char* results_0_daily_0_wind_direction_degree = results_0_daily_0["wind_direction_degree"];
  const char* results_0_daily_0_wind_speed = results_0_daily_0["wind_speed"];
  const char* results_0_daily_0_wind_scale = results_0_daily_0["wind_scale"];
  const char* results_0_daily_0_humidity = results_0_daily_0["humidity"];
  
  JsonObject results_0_daily_1 = results_0_daily[1];
  const char* results_0_daily_1_date = results_0_daily_1["date"];
  const char* results_0_daily_1_text_day = results_0_daily_1["text_day"];
  const char* results_0_daily_1_code_day = results_0_daily_1["code_day"];
  const char* results_0_daily_1_text_night = results_0_daily_1["text_night"]; 
  const char* results_0_daily_1_code_night = results_0_daily_1["code_night"]; 
  const char* results_0_daily_1_high = results_0_daily_1["high"];
  const char* results_0_daily_1_low = results_0_daily_1["low"]; 
  const char* results_0_daily_1_rainfall = results_0_daily_1["rainfall"]; 
  const char* results_0_daily_1_precip = results_0_daily_1["precip"]; 
  const char* results_0_daily_1_wind_direction = results_0_daily_1["wind_direction"];
  const char* results_0_daily_1_wind_direction_degree = results_0_daily_1["wind_direction_degree"]; 
  const char* results_0_daily_1_wind_speed = results_0_daily_1["wind_speed"];
  const char* results_0_daily_1_wind_scale = results_0_daily_1["wind_scale"];
  const char* results_0_daily_1_humidity = results_0_daily_1["humidity"]; 
  
  JsonObject results_0_daily_2 = results_0_daily[2];
  const char* results_0_daily_2_date = results_0_daily_2["date"];
  const char* results_0_daily_2_text_day = results_0_daily_2["text_day"];
  const char* results_0_daily_2_code_day = results_0_daily_2["code_day"];
  const char* results_0_daily_2_text_night = results_0_daily_2["text_night"];
  const char* results_0_daily_2_code_night = results_0_daily_2["code_night"];
  const char* results_0_daily_2_high = results_0_daily_2["high"]; 
  const char* results_0_daily_2_low = results_0_daily_2["low"]; 
  const char* results_0_daily_2_rainfall = results_0_daily_2["rainfall"];
  const char* results_0_daily_2_precip = results_0_daily_2["precip"]; 
  const char* results_0_daily_2_wind_direction = results_0_daily_2["wind_direction"]; 
  const char* results_0_daily_2_wind_direction_degree = results_0_daily_2["wind_direction_degree"]; 
  const char* results_0_daily_2_wind_speed = results_0_daily_2["wind_speed"];
  const char* results_0_daily_2_wind_scale = results_0_daily_2["wind_scale"]; 
  const char* results_0_daily_2_humidity = results_0_daily_2["humidity"]; 
  
  const char* results_0_last_update = results_0["last_update"]; 
  
  // 从以上信息中摘选几个通过串口监视器显示
  String results_0_daily_0_date_str = results_0_daily_0["date"].as<String>();
  String  results_0_daily_0_text_day_str = results_0_daily_0["text_day"].as<String>(); 
  int results_0_daily_0_code_day_int = results_0_daily_0["code_day"].as<int>(); 
  String results_0_daily_0_text_night_str = results_0_daily_0["text_night"].as<String>(); 
  int results_0_daily_0_code_night_int = results_0_daily_0["code_night"].as<int>(); 
  int results_0_daily_0_high_int = results_0_daily_0["high"].as<int>();
  int results_0_daily_0_low_int = results_0_daily_0["low"].as<int>();
  String results_0_last_update_str = results_0["last_update"].as<String>();

  int results_0_daily_1_high_int = results_0_daily_1["high"].as<int>();
  int results_0_daily_1_low_int = results_0_daily_1["low"].as<int>();
  String results_0_daily_1_text_day_str = results_0_daily_1["text_day"].as<String>();
 
  Serial.println(F("======Today Weahter ======="));
  Serial.print(F("DATE: "));
  Serial.println(results_0_daily_0_date_str);
  Serial.print(F("Day Weather: "));
  Serial.print(results_0_daily_0_text_day_str);
  Serial.print(F(" "));
  Serial.println(results_0_daily_0_code_day_int);
  Serial.print(F("Night Weather: "));
  Serial.print(results_0_daily_0_text_night_str);
  Serial.print(F(" "));
  Serial.println(results_0_daily_0_code_night_int);
  Serial.print(F("High: "));
  Serial.println(results_0_daily_0_high_int);
  Serial.print(F("LOW: "));
  Serial.println(results_0_daily_0_low_int);
  Serial.print(F("Last Update: "));
  Serial.println(results_0_last_update_str);
  Serial.println(F("=============================="));
  display_1(results_0_daily_1_high_int,results_0_daily_1_low_int,results_0_daily_1_text_day_str);
  results_0_daily_1_high_int_old=results_0_daily_1_high_int;
  results_0_daily_1_low_int_old=results_0_daily_1_low_int;
  results_0_daily_1_text_day_str_old=results_0_daily_1_text_day_str;
}else{
  display_1(results_0_daily_1_high_int_old,results_0_daily_1_low_int_old,results_0_daily_1_text_day_str_old);
}


  
}
//----------预测明天天气----------
void display_1(int results_0_daily_1_high_int,int results_0_daily_1_low_int,String results_0_daily_1_text_day_str){
  //显示输出
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_wqy16_t_gb2312);
  u8g2.setCursor(15, 14);
  u8g2.print("重庆明天天气");
  
  u8g2.setFont(u8g2_font_logisoso24_tr);
  u8g2.setCursor(20, 46);
  u8g2.print(results_0_daily_1_low_int);
  u8g2.setCursor(56, 46);
  u8g2.print("~");
  u8g2.setCursor(75, 46);
  u8g2.print(results_0_daily_1_high_int);
  
  u8g2.setCursor(35, 62);
  u8g2.setFont(u8g2_font_unifont_t_chinese2);
  u8g2.print(results_0_daily_1_text_day_str);
  u8g2.sendBuffer();
}


/*-------- NTP 代码 ----------*/

const int NTP_PACKET_SIZE = 48;     // NTP时间在消息的前48个字节里
byte packetBuffer[NTP_PACKET_SIZE]; // 输入输出包的缓冲区

time_t getNtpTime()
{
    IPAddress ntpServerIP; // NTP服务器的地址

    while (Udp.parsePacket() > 0)
        ; // 丢弃以前接收的任何数据包
    Serial.println("Transmit NTP Request");
    // 从池中获取随机服务器
    WiFi.hostByName(ntpServerName, ntpServerIP);
    Serial.print(ntpServerName);
    Serial.print(": ");
    Serial.println(ntpServerIP);
    sendNTPpacket(ntpServerIP);
    uint32_t beginWait = millis();
    while (millis() - beginWait < 1500)
    {
        int size = Udp.parsePacket();
        if (size >= NTP_PACKET_SIZE)
        {
            Serial.println("Receive NTP Response");
            isNTPConnected = true;
            Udp.read(packetBuffer, NTP_PACKET_SIZE); // 将数据包读取到缓冲区
            unsigned long secsSince1900;
            // 将从位置40开始的四个字节转换为长整型,只取前32位整数部分
            secsSince1900 = (unsigned long)packetBuffer[40] << 24;
            secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
            secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
            secsSince1900 |= (unsigned long)packetBuffer[43];
            Serial.println(secsSince1900);
            Serial.println(secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR);
            return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
        }
    }
    Serial.println("No NTP Response :-("); //无NTP响应
    isNTPConnected = false;
    return 0; //如果未得到时间则返回0
}

// 向给定地址的时间服务器发送NTP请求
void sendNTPpacket(IPAddress &address)
{
    memset(packetBuffer, 0, NTP_PACKET_SIZE);
    packetBuffer[0] = 0b11100011; // LI, Version, Mode
    packetBuffer[1] = 0;          // Stratum, or type of clock
    packetBuffer[2] = 6;          // Polling Interval
    packetBuffer[3] = 0xEC;       // Peer Clock Precision
    // 8 bytes of zero for Root Delay & Root Dispersion
    packetBuffer[12] = 49;
    packetBuffer[13] = 0x4E;
    packetBuffer[14] = 49;
    packetBuffer[15] = 52;
    Udp.beginPacket(address, 123); //NTP需要使用的UDP端口号为123
    Udp.write(packetBuffer, NTP_PACKET_SIZE);
    Udp.endPacket();
}

void oledClockDisplay()
{
    int years, months, days, hours, minutes, seconds, weekdays;
    years = year();
    months = month();
    days = day();
    hours = hour();
    minutes = minute();
    seconds = second();
    weekdays = weekday();
    
   if(hours==0&&minutes==0)
   {
    temp_readMAX=temp_read;
    }
  
    Serial.printf("%d/%d/%d %d:%d:%d Weekday:%d\n", years, months, days, hours, minutes, seconds, weekdays);
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_unifont_t_chinese2);
    u8g2.setCursor(0, 14);
    if (isNTPConnected)
    {
        if(timeZone>=0)
        {
            u8g2.print("当前时间(UTC+");
            u8g2.print(timeZone);
            u8g2.print(")");
        }
        else
        {
            u8g2.print("当前时间(UTC");
            u8g2.print(timeZone);
            u8g2.print(")");
        }
    }
    else
        u8g2.print("无网络!"); //如果上次对时失败,则会显示无网络
    String currentTime = "";
    if (hours < 10)
        currentTime += 0;
    currentTime += hours;
    currentTime += ":";
    if (minutes < 10)
        currentTime += 0;
    currentTime += minutes;
    currentTime += ":";
    if (seconds < 10)
        currentTime += 0;
    currentTime += seconds;
    String currentDay = "";
    currentDay += years;
    currentDay += "/";
    if (months < 10)
        currentDay += 0;
    currentDay += months;
    currentDay += "/";
    if (days < 10)
        currentDay += 0;
    currentDay += days;

    u8g2.setFont(u8g2_font_logisoso24_tr);
    u8g2.setCursor(0, 44);
    u8g2.print(currentTime);
    u8g2.setCursor(0, 61);
    u8g2.setFont(u8g2_font_unifont_t_chinese2);
    u8g2.print(currentDay);
    u8g2.drawXBM(80, 48, 16, 16, xing);
    u8g2.setCursor(95, 62);
    u8g2.print("期");
    if (weekdays == 1)
        u8g2.print("日");
    else if (weekdays == 2)
        u8g2.print("一");
    else if (weekdays == 3)
        u8g2.print("二");
    else if (weekdays == 4)
        u8g2.print("三");
    else if (weekdays == 5)
        u8g2.print("四");
    else if (weekdays == 6)
        u8g2.print("五");
    else if (weekdays == 7)
        u8g2.drawXBM(111, 49, 16, 16, liu);
    u8g2.sendBuffer();
}