四行代码制作你的esp8266天气时钟——基于NodeMCU、OLED模块

2023-10-26

OLED:开学了,好闲呀!

炸鸡:给你找个无休的工作,怎么样。。。。。。

ESP8266:

物料

0.96OLED屏幕,esp8266(NodeMCU)开发板,杜邦线

可以自制PCB美化硬件组合

配置方法:(四行代码)

1.填上wifi或者热点的名称和密码

2.输入知心天气的密钥和城市名称

 硬件配置:0.96OLED spiOLED屏幕,按照程序用杜邦线连接OLED和esp8266。其他屏幕还需要改图示一行驱动构造代码。不懂的可以查看U8g2的实例代码,尝试选择合适自己的驱动构造。

深入学习Arduino u8g2 OLED库,一篇就够_单片机菜鸟哥的博客-CSDN博客_u8g2

连线:

 clock=*/ 14, /* data=*/ 13, /* cs=*/ 16, /* dc=*/ 5, /* reset=*/ 4

 功能描述:

开机等待wifi连接,扫描并连接,获取成功后进入显示界面

当wifi断开连接时,不显示图标,会利用esp8266定时器进行计时,但是天气信息不会更新

再次连接时,显示图标,更新天气、时间信息

在屏幕的显示位置会随时间左右移动,延长OLED屏幕的寿命

改进方向:

主要是基于手机热点测试的,对一直连接的wifi适配需要改进优化;

U8G2是个强大的屏幕驱动库,可以加上炫酷吊炸天的动画,但是有点麻烦

下面是总的代码,能不能点个赞(求求你这个帅哥)



/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : weather_forecast
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 20200601
程序目的/Purpose          : 
通过心知天气(www.seniverse.com)免费服务获取天气预报信息(三日)。
-----------------------------------------------------------------------
其它说明 / Other Description
心知天气API文档说明: https://www.seniverse.com/docs
 
本程序为太极创客团队制作的免费视频教程《零基础入门学用物联网 》中一部分。该教程系统的
向您讲述ESP8266的物联网应用相关的软件和硬件知识。以下是该教程目录页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/                                  
***********************************************************************/
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include <ESP8266HTTPClient.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
/
#define TIMER_INTERRUPT_DEBUG         0
#define _TIMERINTERRUPT_LOGLEVEL_     0
#include "TimerInterrupt_Generic.h"
//#define BUILTIN_LED     16       // Pin D4 mapped to pin GPIO2/TXD1 of ESP8266, NodeMCU and WeMoS, control on-board LED
volatile bool statusLed = false;
volatile uint32_t lastMillis = 0;
#define TIMER_INTERVAL_MS       1000

U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 14, /* data=*/ 13, /* cs=*/ 16, /* dc=*/ 5, /* reset=*/ 4);

const char* ssid     = "xiaomi";       // 连接WiFi名(此处使用taichi-maker为示例)
                                            // 请将您需要连接的WiFi名填入引号中
const char* password = "wsyj8.45l";          // 连接WiFi密码(此处使用12345678为示例)
                                            // 请将您需要连接的WiFi密码填入引号中
 
const char* host = "api.seniverse.com";   // 将要连接的服务器地址  
const int httpPort = 80;              // 将要连接的服务器端口      
 
// 心知天气HTTP请求所需信息
String reqUserKey = "SPNgRfLgk05CtB5gr";   // 私钥
String reqLocation = "haerbin";            // 城市
String reqUnit = "c";                      // 摄氏/华氏
HTTPClient http;

String GetUrl;

String response;
int m=0;
int h=0;
int s=0;
int ss=0;
String day_we=" ";
String night_we=" ";
int high=0;
int low=0;
char test=' ';
int con_update=1;
int a1,a2,a3,a4;
int start_x=0;

u8g2_uint_t U8X8_PROGMEM screenWidth;
u8g2_uint_t U8X8_PROGMEM screenHeight;
int day_now=0;
struct DAY_INF{
  int day_weather;
  int night_weather;
  int high;
  int low;  
 }day_inf[3]={{0,0,0,0},{0,0,0,0},{0,0,0,0}};

ESP8266Timer ITimer;
void IRAM_ATTR TimerHandler()
{//中断服务函数
  // 向心知天气服务器服务器请求信息并对信息进行解析
  s++;
  if(s==60){
    s=0;
    m++;
    if(m==60){
      m=0;
      h++;
      if(h==24){
        h=0;
        day_now++;
      }
        
  }
}

  
 //Serial.println(millis());
#if (TIMER_INTERRUPT_DEBUG > 0)
  //Serial.println("Delta ms = " + String(millis() - lastMillis));
  lastMillis = millis();
#endif
}
void setup(){
  Serial.begin(115200);  
    u8g2.begin();  
   u8g2.enableUTF8Print();
   screenWidth = u8g2.getDisplayWidth();
    screenHeight = u8g2.getDisplayHeight();
   wait();        
 // Serial.println("");
  /
 // Serial.print(F("\\nStarting TimerInterruptTest on "));// Serial.println(ARDUINO_BOARD);
 // Serial.println(ESP8266_TIMER_INTERRUPT_VERSION);
 // Serial.println(TIMER_INTERRUPT_GENERIC_VERSION);
 // Serial.print(F("CPU Frequency = "));// Serial.print(F_CPU / 1000000);// Serial.println(F(" MHz"));
  // Interval in microsecs
  if (ITimer.attachInterruptInterval(TIMER_INTERVAL_MS * 1000, TimerHandler))
  {
    lastMillis = millis();
   // Serial.print(F("Starting ITimer OK, millis() = "));// Serial.println(lastMillis);
    // Serial.println(BUILTIN_LED);
  }
  else
   // Serial.println(F("Can't set ITimer correctly. Select another freq. or interval"));
/
  // 连接WiFi
  connectWiFi();

  GetUrl = "http://quan.suning.com/getSysTime.do";
  http.setTimeout(5000);
  http.begin(GetUrl);
  while(0==httpRequest()||0==get_time()){      
      
     } 
}
const unsigned char BMP_qing_24X24[] U8X8_PROGMEM= { 
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x30,0x00,0x0c,0x60,
0x00,0x0e,0x00,0x7e,0x04,0x00,0xff,0x01,0x80,0xff,0x01,0xc0,0xff,0x03,0xc0,0xff,
0x03,0xce,0xff,0x73,0xce,0xff,0x73,0xc0,0xff,0x03,0xc0,0xff,0x03,0x80,0xff,0x01,
0x80,0xff,0x01,0x00,0xfe,0x00,0x60,0x18,0x0e,0x30,0x00,0x0c,0x00,0x18,0x00,0x00,
0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,};
const unsigned char BMP_xue_24X24[] U8X8_PROGMEM= { 
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0xd9,0x00,0x00,0xfb,0x00,0x20,0x7e,0x04,0x60,
0x3c,0x06,0x6c,0x18,0x36,0x78,0x18,0x1e,0xf0,0x18,0x0e,0xfc,0x99,0x1f,0x0c,0xff,
0x30,0x00,0x3c,0x00,0x00,0x3c,0x00,0x0c,0xff,0x30,0xf8,0x99,0x3f,0xf0,0x18,0x0f,
0x78,0x18,0x1e,0x6c,0x18,0x36,0x60,0x3c,0x06,0x60,0x7e,0x04,0x00,0xff,0x00,0x00,
0xdb,0x00,0x00,0x18,0x00,0x00,0x00,0x00,};
const unsigned char BMP_duoyun_24X24[] U8X8_PROGMEM= { 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,
0x08,0x30,0x00,0x90,0x01,0x00,0xe0,0x07,0x00,0xc0,0x0f,0x80,0x87,0x0f,0xe0,0x8f,
0xcf,0xe0,0x1f,0x0f,0xf0,0x3f,0x00,0xf8,0x3f,0x00,0xfe,0xbf,0x01,0xfe,0xff,0x07,
0xff,0xff,0x07,0xff,0xff,0x0f,0xfe,0xff,0x0f,0xfe,0xff,0x07,0xf8,0xff,0x03,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
const unsigned char BMP_yin_24X24[] U8X8_PROGMEM= { 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x70,0x00,0x00,0xfc,0x01,0x00,0xfc,0x03,0x00,0xe3,0x03,0xe0,0xcf,0x07,0xf0,0xdf,
0x3f,0xf0,0xbf,0x7f,0xf8,0x3f,0xfe,0xfe,0x7f,0xf8,0xfe,0xff,0xf7,0xff,0xff,0xef,
0xff,0xff,0x6f,0xff,0xff,0x0f,0xff,0xff,0x0f,0xfe,0xff,0x0f,0xfe,0xff,0x07,0xf8,
0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,};
const unsigned char BMP_xiaoyu_24X24[] U8X8_PROGMEM= { 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x3f,0x00,0x80,0x7f,0x00,0x80,0x7f,0x00,0xc0,0xff,0x00,0xf0,0xff,0x07,0xf0,0xff,
0x0f,0xf0,0xff,0x0f,0xf0,0xff,0x1f,0xf0,0xff,0x0f,0xf0,0xff,0x0f,0xe0,0xff,0x07,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
const unsigned char BMP_dayu_24X24[] U8X8_PROGMEM= { 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x1f,0x00,0x80,0x7f,0x00,0xc0,0x7f,0x00,0xe0,0xff,0x00,0xf0,0xff,0x07,0xf8,0xff,
0x0f,0xf8,0xff,0x1f,0xf8,0xff,0x1f,0xf8,0xff,0x1f,0xf0,0xff,0x0f,0xe0,0xff,0x0f,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x02,0xc0,0x18,0x03,0x40,0x1c,0x01,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
const unsigned char BMP_wifi_24X18[] U8X8_PROGMEM= { 
0x00,0xff,0x00,0xe0,0xff,0x07,0xf8,0xff,0x1f,0xfc,0xc3,0x3f,0x7e,0x00,0x7e,0x1f,
0x00,0xf8,0x0e,0x00,0x60,0x00,0xff,0x00,0xc0,0xff,0x03,0xe0,0xff,0x07,0xe0,0x81,
0x07,0xc0,0x00,0x02,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x7e,0x00,0x00,0x7c,0x00,
0x00,0x3c,0x00,0x00,0x18,0x00,};

const unsigned char BMP_mai_24X24[] U8X8_PROGMEM= { 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xe0,0x81,0x07,0xf0,0xc7,0x1f,0x38,0xef,0x3d,0x1c,0x7c,
0x30,0x0c,0x38,0x30,0x0c,0x38,0x30,0x1c,0x7c,0x30,0x38,0xef,0x3c,0xf0,0xc7,0x1f,
0xe0,0x81,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
const unsigned char BMP_wu_20X20[] U8X8_PROGMEM= { 
0xc0,0x01,0x00,0xf0,0x07,0x00,0x1c,0x0c,0x00,0x0c,0x18,0x00,0x06,0x70,0x00,0x02,
0xf0,0x01,0x03,0x00,0x02,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
0x07,0xfe,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0f,0xfe,0xff,0x0f,
0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x07,0xfe,0xff,0x07,};
void duizhao(int a,int y,int x){
  if(a>=0&&a<=3)u8g2.drawXBM(y+start_x, x,  24, 24, BMP_qing_24X24);//晴
  if(a>=4&&a<=8)u8g2.drawXBM(y+start_x, x,  24, 24, BMP_duoyun_24X24);//多云
  if(a==9)u8g2.drawXBM(y+start_x, x,  24, 24, BMP_yin_24X24);//阴
  if(a==13)u8g2.drawXBM(y+start_x, x,  24, 24, BMP_xiaoyu_24X24);//小雨
  if((a>=10&&a<=12)||(a>=14&&a<=19))u8g2.drawXBM(y+start_x, x,  24, 24, BMP_dayu_24X24);//大雨
  if(a>=20&&a<=25)u8g2.drawXBM(y+start_x, x, 24, 24, BMP_xue_24X24);//雪
  if(a>=26&&a<=31&&a!=30)u8g2.drawXBM(y+start_x, x, 24, 24, BMP_mai_24X24);//霾
  if(a==30)u8g2.drawXBM(y+start_x+2, x+1, 20, 20, BMP_wu_20X20);//雾
}
void DisplayWeather(){
  for(int i=day_now;i<=day_now+1&&i<3;i++){
    duizhao(day_inf[i].day_weather,60*(i-day_now),20);
    duizhao(day_inf[i].night_weather,60*(i-day_now)+30,20);
  }
}

void wait(){
  u8g2.firstPage();
  do {
    u8g2.drawXBM(48, 1, 24, 18, BMP_wifi_24X18);
    u8g2.setFont(u8g2_font_ncenB14_tr);
    u8g2.setCursor(0,50);
    u8g2.print("wait for WiFi");
  } while ( u8g2.nextPage() );
}
void shaoping(){
  static int dir=1;
 // Serial.printf("防止烧屏\n");
  if(dir==1){
    start_x++;
    if(start_x>60){dir=0;}
  }
  else{
    start_x--;
    if(start_x<=0){dir=1;}
    }
  }

void loop(){
  static int WiFi_status=1;
  u8g2.firstPage();
  ss++;
  if(ss>=10*60){
    ss=0;
    }
  if(ss%10==0){
    if(WiFi.status()== WL_CONNECTED){
       // Serial.printf("有网络\n");
        WiFi_status=1;
       httpRequest();
       get_time();
    }
    else{
     // Serial.printf("无网络\n");
      WiFi_status=0;
    }
  }

  if(ss%100==0){
    shaoping();
  }
   //Serial.printf("ss:%d\n",ss);
  do {
    if(WiFi_status==1){
       start_x=0;
       u8g2.drawXBM(90, 0, 24, 18, BMP_wifi_24X18);
    }
      // 建立心知天气API当前天气请求资源地址
      
    DisplayWeather();
    u8g2.setFont(u8g2_font_ncenB18_tr);
    u8g2.setCursor(start_x,18);
    if(h<13)u8g2.print(h);
    else u8g2.print(h-12);
    u8g2.print(':');
    if(m<10)
      u8g2.print('0');
    u8g2.print(m);
    u8g2.setFont(u8g2_font_ncenB10_tr);
    u8g2.print(" :");
    
    if(s<10)
      u8g2.print('0');
    u8g2.print(s);
    
    
    u8g2.setCursor(start_x,60);
    u8g2.print(day_inf[day_now].high);
    u8g2.print(" / ");
    u8g2.print(day_inf[day_now].low);

    //u8g2.drawStr(0,11,results_0_daily_0_text_day_str);
  } while ( u8g2.nextPage() );
  delay(20);
  
}
 
// 向心知天气服务器服务器请求信息并对信息进行解析
int httpRequest(){
  WiFiClient client;
  String reqRes = "/v3/weather/daily.json?key=" + reqUserKey +
                  + "&location=" + reqLocation + "&language=en&unit=" +
                  reqUnit + "&start=0&days=3";  
  // 建立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.");
    }
   // Serial.println("Found Header End. Start Parsing.");
    // 利用ArduinoJson库解析心知天气响应信息
    //digitalWrite(BUILTIN_LED, 0);  //Toggle LED Pin
    //断开客户端与服务器连接工作
    parseInfo(client);
    client.stop(); 
    return 1;
  }
  else {
   // Serial.println(" httpRequest(): connection failed!");
    //断开客户端与服务器连接工作
    client.stop(); 
    return 0;
  }   
  
}
 
// 连接WiFi
void connectWiFi(){
  WiFi.begin(ssid, password);                  // 启动网络连接
 // Serial.print("Connecting to ");              // 串口监视器输出网络连接信息
 // Serial.print(ssid);// Serial.println(" ...");  // 告知用户NodeMCU正在尝试WiFi连接
  delay(2000);
  int i = 0;                                   // 这一段程序语句用于检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED) {      // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
    delay(500);                               // 如果WiFi连接成功则返回值为WL_CONNECTED                       
   // Serial.print(i++);// Serial.print(' ');      // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
  }                                            // 同时NodeMCU将通过串口监视器输出连接时长读秒。
                                               // 这个读秒是通过变量i每隔一秒自加1来实现的。                                              
 // Serial.println("");                          // WiFi连接成功后
 // Serial.println("Connection established!");   // NodeMCU将通过串口监视器输出"连接成功"信息。
 // Serial.print("IP address:    ");             // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
 // Serial.println(WiFi.localIP());              // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。  
}
 
// 利用ArduinoJson库解析心知天气响应信息
int parseInfo(WiFiClient client){ 
 // Serial.println(F("开始解析"));
  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>();

  String results_0_daily_1_date_str = results_0_daily_1["date"].as<String>();
  String  results_0_daily_1_text_day_str = results_0_daily_1["text_day"].as<String>(); 
  int results_0_daily_1_code_day_int = results_0_daily_1["code_day"].as<int>(); 
  String results_0_daily_1_text_night_str = results_0_daily_1["text_night"].as<String>(); 
  int results_0_daily_1_code_night_int = results_0_daily_1["code_night"].as<int>(); 
  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_2_date_str = results_0_daily_2["date"].as<String>();
  String  results_0_daily_2_text_day_str = results_0_daily_2["text_day"].as<String>(); 
  int results_0_daily_2_code_day_int = results_0_daily_2["code_day"].as<int>(); 
  String results_0_daily_2_text_night_str = results_0_daily_2["text_night"].as<String>(); 
  int results_0_daily_2_code_night_int = results_0_daily_2["code_night"].as<int>(); 
  int results_0_daily_2_high_int = results_0_daily_2["high"].as<int>();
  int results_0_daily_2_low_int = results_0_daily_2["low"].as<int>();
 // Serial.println(F("解析结束"));

  if(results_0_daily_0_date_str=="null")
  {
    return 0;
    }
 // 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);
 // Serial.print(F(" "));
 // Serial.print(results_0_daily_0_code_day_int);
 // Serial.print(F(" "));
 // Serial.print(results_0_daily_1_text_day);//
 // Serial.print(F(" "));
 // Serial.print(results_0_daily_1_code_day_int);//
 // Serial.print(F(" "));
 // Serial.print(results_0_daily_2_text_day);
 // Serial.print(F(" "));
 // Serial.println(results_0_daily_2_code_day_int);
  
 // Serial.print(F("Night Weather: "));
 // Serial.print(results_0_daily_0_text_night_str);
 // Serial.print(F(" "));
 // Serial.print(results_0_daily_0_code_night_int);
 // Serial.print(F(" "));
 // Serial.print(results_0_daily_1_text_night_str);
 // Serial.print(F(" "));
 // Serial.print(results_0_daily_1_code_night_int);
 // Serial.print(F(" "));
 // Serial.print(results_0_daily_2_text_night_str);
 // Serial.print(F(" "));
 // Serial.println(results_0_daily_2_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("=============================="));
  

  
  day_inf[0].day_weather=results_0_daily_0["code_day"].as<int>(); 
  day_inf[0].night_weather=results_0_daily_0["code_night"].as<int>(); 
  day_inf[0].high=results_0_daily_0_high_int;
  day_inf[0].low=results_0_daily_0_low_int;
  
  day_inf[1].day_weather=results_0_daily_1["code_day"].as<int>(); 
  day_inf[1].night_weather=results_0_daily_1["code_night"].as<int>();
  day_inf[1].high=results_0_daily_1_high_int;
  day_inf[1].low=results_0_daily_1_low_int;
  
  day_inf[2].day_weather=results_0_daily_2["code_day"].as<int>(); 
  day_inf[2].night_weather=results_0_daily_2["code_night"].as<int>();
  day_inf[2].high=results_0_daily_2_high_int;
  day_inf[2].low=results_0_daily_2_low_int;
  
  day_now=0;
  return 1;
}

int get_time(){
 // Serial.println(F("开始获取时间"));
   int httpCode = http.GET();
   //Serial.println(F("获取时间结束"));
   if(ss==0){
    con_update=1;
    }
    if(con_update==0){
     // Serial.printf("上次已经取得准确时间数据");
      }
    else{
        if (httpCode > 0) {
         // Serial.printf("[HTTP] GET... code: %d\n", httpCode);
          if (httpCode == HTTP_CODE_OK) {
              //读取响应内容
              response = http.getString();
             // Serial.println(response);
              h=int((char)response[24]-'0')*10+int((char)response[25]-'0');
              m=int((char)response[27]-'0')*10+int((char)response[28]-'0');
              s=int((char)response[30]-'0')*10+int((char)response[31]-'0');
              con_update=0;        
          }
          http.end(); 
          return 1;
        } 
        else {
           // Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
            http.end();          
        }
  }
  return 0;   
 }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

四行代码制作你的esp8266天气时钟——基于NodeMCU、OLED模块 的相关文章

  • python如何对微信应用进行监听

    要在 Python 中监听微信应用 需要使用微信提供的接口和相关的第三方库 具体实现方法如下 首先需要申请微信公众平台账号并获取相应的 AppID 和 AppSecret 使用第三方库 如 itchat 来进行接口调用 Itchat 是一个
  • Git提交error: RPC failed; result=22, HTTP code = 500的解决方法

    新建了一个项目使用sourcetree提交Git时 提示错误 RPC failed result 22 HTTP code 500 这是由于上传的包过大 HTTP的头错误导致的 解决办法 在终端执行命令显示隐藏文件夹 显示全部文件 defa

随机推荐

  • wget -o -O和-O-有什么区别?bash改色

    wget o O和 O 有什么区别 wget o 下载过程信息存入日志文件wget o youlogname log url 下载文件放另一边 wget O 以其他名称保存下载的文件内容 输出下载过程信息wget O home ym dem
  • linux之librdkafka库安装以及将#include <librdkafka/rdkafka.h>更改为#include <rdkafka.h>调用

    公众号 嵌入式不难 本文仅供参考学习 如有错误之处 欢迎留言指正 下载源代码 使用如下命令 git clone https github com edenhill librdkafka git 切换到发布的稳定分支 刚下载下来的源代码默认在
  • -O1 -O2 -O3 优化的原理是什么?

    一般来说 如果不指定优化标识的话 gcc就会产生可调试代码 每条指令之间将是独立的 可以在指令之间设置断点 使用gdb中的 p命令查看变量的值 改变变量的值等 并且把获取最快的编译速度作为它的目标 当优化标识被启用之后 gcc编译器将会试图
  • 鸿蒙应用开发学习

    系列文章目录 第一章 HarmonyOS是什么 第二章 基础环境和开发工具 文章目录 系列文章目录 前言 一 HarmonyOS工程介绍 二 工程目录结构 三 工程目录介绍 1 entry 2 Ability 3 库文件 4 资源文件 5
  • Linux指令中touch和mkdir的区别

    在Linux中 mkdir 用于创建空的文件夹 格式 mkdir 选项 目录 选项 功能 m 默认文件目录的权限 m755 p 连续创建多层 v 显示创建过程 touch touch 是用于创建新的文件 或者修改文件的时间
  • 福昕阅读器注册码

    以下文字复制到记事本存为frpkey txt 复制到福昕阅读器的安装目录即可 FoxitReaderPro SN FRPFZ12391Modules Users 1Licensee OlivierGuilloryLicenseDate 20
  • sql中and和or的混合使用

    1 and的优先级高于or 2 使用 调整优先级 下面sql没有添加过滤条件 下面sql查出的结果是错误的 下面sql查出的结果是正确的
  • 延时函数

    Dos sleep 1 停留1秒 delay 100 停留100毫秒 Windows Sleep 100 停留100毫秒 Linux sleep 1 停留1秒 usleep 1000 停留1毫秒 每一个平台不太一样 最好自己定义一套跨平台的
  • 继续探索Roop(单张图视频换脸)的各方面:比如喜闻乐见的“加速”

    文章目录 一 Roop项目的特点 二 Roop也能加速 三 Roop更新和依赖 3 1 飞速更新 3 2 依赖问题 3 3 需要CUDA么 前两天写了 简单介绍Roop 类似SimSwap 单张图视频换脸的项目 介绍了基本安装使用 之后这个
  • [1193]ClickHouse写入常见问题: Too many parts (300)

    文章目录 一 场景及错误信息 二 报错原因 三 解决办法 扩展 一 场景及错误信息 今天使用 Datax 往 ClickHouse 同步数据时 出现如下错误 ClickHouse exception code 1002 host 10 12
  • Ubuntu22.04安装mysql集群一主一从

    Ubuntu22 04安装mysql集群 以下是在Ubuntu 22 04上安装一主一从的MariaDB集群的步骤 首先 你需要有两个 Ubuntu 22 04 的服务器 分别命名为 Server1 和 Server2 这两个服务器都需要安
  • 可调用对象与lambda表达式

    可调用对象与lambda表达式 OVERVIEW 可调用对象与lambda表达式 1 using 1 函数指针别名 case1 定义基础类型 case2 定义函数指针别名 2 模板定义别名 2 可调用对象 1 包装器 case1 基本用法
  • uniapp幸运大转盘

  • JAVA实现微信授权登录(详解)

    第一步 前期设置 登录微信公众号接口测试平台设置信息 登录微信公众号接口测试平台 登录成功后可以看到测试用的appid和appsecret 稍后再后台我们要用到这两个ID 如下图 紧接着需要设置网页授权 体验接口权限表 网页服务 网页帐号
  • 残差连接 (及 梯度消失 网络退化)详解

    本文就说说用残差连接解决梯度消失和网络退化的问题 一 背景 1 梯度消失问题 我们发现很深的网络层 由于参数初始化一般更靠近0 这样在训练的过程中更新浅层网络的参数时 很容易随着网络的深入而导致梯度消失 浅层的参数无法更新 可以看到 假设现
  • R语言实战之描述性统计分析

    R语言实战之描述性统计分析 下面展示一些 描述性统计分析的R代码语言 vars lt c mpg hp wt head mtcars vars 创造一个统计的函数列表 通过sapply 计算描述性统计变量 包括偏度和峰度 mystats l
  • Sublime Text 2.0.1 (32位和64位)破解方法

    sublime 本身可以免费使用 不过看着那个 未注册 提示 总是不太爽 想支持正版嘛 可惜要50美元 不是RMB 只好找破解方法了 破解方法仅供交流使用 由此产生的一切问题与本人无关 喜欢的请支持正版 64位版本 1 复制Sublime安
  • Latex 中带左边大括号的方程组

    代码如下 documentclass article setlength textwidth 245 0pt usepackage CJK usepackage indentfirst usepackage amsmath begin CJ
  • 如何让ChatGPT你写一个短视频脚本

    很多网红博主以及各个领域的短视频博主都在使用的 AI编写视频脚本 效率直接提升20倍 很多自媒体平台对于ChatGPT的介绍很少 但是他们都在悄悄利用这个强大的AI来帮助处理工作 关于 如何利用ChatGPT编写视频脚本 这件事 我们今天就
  • 四行代码制作你的esp8266天气时钟——基于NodeMCU、OLED模块

    OLED 开学了 好闲呀 炸鸡 给你找个无休的工作 怎么样 ESP8266 物料 0 96OLED屏幕 esp8266 NodeMCU 开发板 杜邦线 可以自制PCB美化硬件组合 配置方法 四行代码 1 填上wifi或者热点的名称和密码 2