久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1629|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于ESP8266網(wǎng)絡(luò)天氣時鐘的OLED顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1110079 發(fā)表于 2024-6-28 05:15 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
注意修改 WiFi 名稱和密碼
需要申請【心知天氣】API私鑰

心知天氣:wwwseniversecom
  1. /*
  2. 參考:
  3. https://blog.csdn.net/weixin_44668788/article/details/120643078
  4. OLED connect with ESP8266 NodeMCU
  5. SCL -- D1
  6. SDA -- D2
  7. */
  8. //引入必要的頭文件
  9. #include <ArduinoJson.h>
  10. #include <ESP8266WiFi.h>
  11. #include <SPI.h>
  12. #include <U8g2lib.h>
  13. #include <WiFiUdp.h>
  14. #include <TimeLib.h>
  15. #include <DNSServer.h>
  16. #include <ESP8266WebServer.h>
  17. WiFiUDP Udp;
  18. unsigned int localPort = 8888; // 用于偵聽UDP數(shù)據(jù)包的本地端口

  19. //網(wǎng)絡(luò)校時的相關(guān)配置
  20. static const char ntpServerName[] = "ntp1.aliyun.com"; //NTP服務(wù)器,使用阿里云
  21. int timeZone = 8; //時區(qū)設(shè)置,采用東8區(qū)

  22. //保存斷網(wǎng)前的最新數(shù)據(jù)
  23. int results_0_now_temperature_int_old;
  24. String results_0_now_text_str_old;
  25. int results_0_daily_1_high_int_old;
  26. int results_0_daily_1_low_int_old;
  27. String results_0_daily_1_text_day_str_old;

  28. //函數(shù)聲明
  29. time_t getNtpTime();
  30. void sendNTPpacket(IPAddress &address);
  31. void oledClockDisplay();
  32. void sendCommand(int command, int value);
  33. void initdisplay();
  34. void connectWiFi();
  35. void parseInfo_now(WiFiClient client,int i);
  36. void parseInfo_fut(WiFiClient client,int i);
  37. //
  38. boolean isNTPConnected = false;

  39. const unsigned char xing[] U8X8_PROGMEM = {
  40.     0x00, 0x00, 0xF8, 0x0F, 0x08, 0x08, 0xF8, 0x0F, 0x08, 0x08, 0xF8, 0x0F, 0x80, 0x00, 0x88, 0x00,
  41.     0xF8, 0x1F, 0x84, 0x00, 0x82, 0x00, 0xF8, 0x0F, 0x80, 0x00, 0x80, 0x00, 0xFE, 0x3F, 0x00, 0x00}; /*星*/
  42. const unsigned char liu[] U8X8_PROGMEM = {
  43.     0x40, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00,
  44.     0x20, 0x02, 0x20, 0x04, 0x10, 0x08, 0x10, 0x10, 0x08, 0x10, 0x04, 0x20, 0x02, 0x20, 0x00, 0x00}; /*六*/

  45. typedef struct
  46. {                  //存儲配置結(jié)構(gòu)體
  47.     int tz;        //時間戳
  48. } config_type;
  49. config_type config;

  50. WiFiClient clientNULL;
  51. DNSServer dnsServer;
  52. ESP8266WebServer server(80);


  53. //----------WIFI連接配置----------
  54. const char* ssid     = "xxxxxxx";       // 連接WiFi名,需要修改
  55. const char* password = "xxxxxxxx";          // 連接WiFi密碼,需要修改
  56.                                             // 請將您需要連接的WiFi密碼填入引號中
  57. //----------天氣API配置----------
  58. const char* host = "api.seniversecom";   // 將要連接的服務(wù)器地址  
  59. const int httpPort = 80;              // 將要連接的服務(wù)器端口      

  60. // 心知天氣HTTP請求所需信息
  61. String reqUserKey = "xxxxxx";   // 私鑰,需要修改
  62. String reqLocation = "Shanghai";            // 城市
  63. String reqUnit = "c";                      // 攝氏/華氏

  64. //----------設(shè)置屏幕----------
  65. U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
  66. int sta = 0;
  67. //----------初始化OLED----------
  68. void initdisplay()
  69. {
  70.     u8g2.begin();
  71.     u8g2.enableUTF8Print();
  72. }
  73. //----------用于獲取實時天氣的函數(shù)(0)----------
  74. void TandW(){
  75.   String reqRes = "/v3/weather/now.json?key=" + reqUserKey +
  76.                   + "&location=" + reqLocation +
  77.                   "&language=en&unit=" +reqUnit;
  78.   // 向心知天氣服務(wù)器服務(wù)器請求信息并對信息進行解析
  79.   httpRequest(reqRes,0);
  80.   //延遲,需要低于20次/分鐘
  81.   delay(5000);
  82. }
  83. void display_1(int results_0_now_temperature_int,String results_0_now_text_str);//聲明函數(shù),用于顯示溫度、天氣


  84. //----------獲取3天預(yù)報(1)----------
  85. void threeday(){
  86.   // 建立心知天氣API當(dāng)前天氣請求資源地址
  87.   String reqRes = "/v3/weather/daily.json?key=" + reqUserKey +
  88.                   + "&location=" + reqLocation + "&language=en&unit=" +
  89.                   reqUnit + "&start=0&days=3";

  90.   // 向心知天氣服務(wù)器服務(wù)器請求信息并對信息進行解析
  91.   httpRequest(reqRes,1);
  92.   delay(5000);
  93. }

  94. void clock_display(time_t prevDisplay){
  95.     server.handleClient();
  96.     dnsServer.processNextRequest();
  97.     if (timeStatus() != timeNotSet)
  98.     {
  99.         if (now() != prevDisplay)
  100.         { //時間改變時更新顯示
  101.             prevDisplay = now();
  102.             oledClockDisplay();
  103.         }
  104.     }
  105. }


  106. void setup(){
  107.   Serial.begin(9600);         
  108.   Serial.println("");
  109.   initdisplay();
  110.   // 連接WiFi

  111.   
  112.   
  113.   u8g2.clearBuffer();
  114.   u8g2.setFont(u8g2_font_unifont_t_chinese2);
  115.   u8g2.setCursor(0, 14);
  116.   u8g2.print("Waiting for WiFi");
  117.   u8g2.setCursor(0, 30);
  118.   u8g2.print("connection...");
  119.   u8g2.sendBuffer();
  120.   connectWiFi();
  121.   Udp.begin(localPort);
  122.   setSyncProvider(getNtpTime);
  123.   setSyncInterval(300); //每300秒同步一次時間

  124.   
  125. }

  126. time_t prevDisplay = 0; //當(dāng)時鐘已經(jīng)顯示

  127. void loop(){
  128.     if (sta>=0 && sta<=250){
  129.       clock_display(prevDisplay);
  130.       
  131.     }else if(sta == 251){
  132.       TandW();
  133.       
  134.     }else{
  135.       threeday();
  136.       
  137.     }

  138.     ++sta;

  139.     if(sta==253){
  140.       sta = 0;
  141.     }
  142. }

  143. // 向心知天氣服務(wù)器服務(wù)器請求信息并對信息進行解析
  144. void httpRequest(String reqRes,int stat){
  145.   WiFiClient client;

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

  152.   // 嘗試連接服務(wù)器
  153.   if (client.connect(host, 80)){
  154.     Serial.println(" Success!");

  155.     // 向服務(wù)器發(fā)送http請求信息
  156.     client.print(httpRequest);
  157.     Serial.println("Sending request: ");
  158.     Serial.println(httpRequest);  

  159.     // 獲取并顯示服務(wù)器響應(yīng)狀態(tài)行
  160.     String status_response = client.readStringUntil('\n');
  161.     Serial.print("status_response: ");
  162.     Serial.println(status_response);

  163.     // 使用find跳過HTTP響應(yīng)頭
  164.     if (client.find("\r\n\r\n")) {
  165.       Serial.println("Found Header End. Start Parsing.");
  166.     }
  167.     if (stat == 0){
  168.       
  169.       // 利用ArduinoJson庫解析心知天氣響應(yīng)信息(實時數(shù)據(jù))
  170.       parseInfo_now(client,1);
  171.     }else if(stat == 1){
  172.       parseInfo_fut(client,1);
  173.     }
  174.   }
  175.   else {
  176.     Serial.println(" connection failed!");
  177.     if (stat == 0){
  178.       
  179.       // 利用ArduinoJson庫解析心知天氣響應(yīng)信息(實時數(shù)據(jù))
  180.       parseInfo_now(clientNULL,0);
  181.     }else if(stat == 1){
  182.       parseInfo_fut(clientNULL,0);
  183.     }
  184.   }
  185.    
  186.   //斷開客戶端與服務(wù)器連接工作
  187.   client.stop();
  188. }

  189. // 連接WiFi
  190. void connectWiFi(){
  191.   WiFi.begin(ssid, password);                  // 啟動網(wǎng)絡(luò)連接
  192.   Serial.print("Connecting to ");              // 串口監(jiān)視器輸出網(wǎng)絡(luò)連接信息
  193.   Serial.print(ssid); Serial.println(" ...");  // 告知用戶NodeMCU正在嘗試WiFi連接
  194.   
  195.   int i = 0;                                   // 這一段程序語句用于檢查WiFi是否連接成功
  196.   while (WiFi.status() != WL_CONNECTED) {      // WiFi.status()函數(shù)的返回值是由NodeMCU的WiFi連接狀態(tài)所決定的。
  197.     delay(1000);                               // 如果WiFi連接成功則返回值為WL_CONNECTED                       
  198.     Serial.print(i++); Serial.print(' ');      // 此處通過While循環(huán)讓NodeMCU每隔一秒鐘檢查一次WiFi.status()函數(shù)返回值
  199.   }                                            // 同時NodeMCU將通過串口監(jiān)視器輸出連接時長讀秒。
  200.                                                // 這個讀秒是通過變量i每隔一秒自加1來實現(xiàn)的。                                             
  201.   Serial.println("");                          // WiFi連接成功后
  202.   Serial.println("Connection established!");   // NodeMCU將通過串口監(jiān)視器輸出"連接成功"信息。
  203.   Serial.print("IP address:    ");             // 同時還將輸出NodeMCU的IP地址。這一功能是通過調(diào)用
  204.   Serial.println(WiFi.localIP());              // WiFi.localIP()函數(shù)來實現(xiàn)的。該函數(shù)的返回值即NodeMCU的IP地址。  
  205. }

  206. // 利用ArduinoJson庫解析心知天氣響應(yīng)信息(實時)
  207. void parseInfo_now(WiFiClient client,int i){

  208.   if(i==1){
  209.   const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 230;
  210.   DynamicJsonDocument doc(capacity);
  211.   
  212.   deserializeJson(doc, client);
  213.   
  214.   JsonObject results_0 = doc["results"][0];
  215.   
  216.   JsonObject results_0_now = results_0["now"];
  217.   const char* results_0_now_text = results_0_now["text"]; // "Sunny"
  218.   const char* results_0_now_code = results_0_now["code"]; // "0"
  219.   const char* results_0_now_temperature = results_0_now["temperature"]; // "32"
  220.   
  221.   const char* results_0_last_update = results_0["last_update"]; // "2020-06-02T14:40:00+08:00"

  222.   // 通過串口監(jiān)視器顯示以上信息
  223.   String results_0_now_text_str = results_0_now["text"].as<String>();
  224.   int results_0_now_code_int = results_0_now["code"].as<int>();
  225.   int results_0_now_temperature_int = results_0_now["temperature"].as<int>();
  226.   String results_0_last_update_str = results_0["last_update"].as<String>();   

  227.   Serial.println(F("======Weahter Now======="));
  228.   Serial.print(F("Weather Now: "));
  229.   Serial.print(results_0_now_text_str);
  230.   Serial.print(F(" "));
  231.   Serial.println(results_0_now_code_int);
  232.   Serial.print(F("Temperature: "));
  233.   Serial.println(results_0_now_temperature_int);
  234.   Serial.print(F("Last Update: "));
  235.   Serial.println(results_0_last_update_str);
  236.   Serial.println(F("========================"));
  237.   display_0(results_0_now_temperature_int,results_0_now_text_str);
  238.   results_0_now_text_str_old = results_0_now_text_str;
  239.   results_0_now_temperature_int_old = results_0_now_temperature_int;
  240.   }
  241.   else{
  242.     display_0(results_0_now_temperature_int_old,results_0_now_text_str_old);
  243.   }

  244. }
  245. //----------輸出實時天氣----------
  246. void display_0(int results_0_now_temperature_int,String results_0_now_text_str){
  247.   //顯示輸出
  248.   u8g2.clearBuffer();
  249.   u8g2.setFont(u8g2_font_wqy16_t_gb2312);
  250.   u8g2.setCursor(15, 14);
  251.   u8g2.print("上海實時天氣");
  252.   u8g2.setFont(u8g2_font_logisoso24_tr);
  253.   u8g2.setCursor(45, 44);
  254.   u8g2.print(results_0_now_temperature_int);
  255.   u8g2.setCursor(15, 61);
  256.   u8g2.setFont(u8g2_font_unifont_t_chinese2);
  257.   u8g2.print(results_0_now_text_str);
  258.   u8g2.sendBuffer();
  259. }


  260. // 利用ArduinoJson庫解析心知天氣響應(yīng)信息(預(yù)測)
  261. void parseInfo_fut(WiFiClient client,int i){
  262.   if(i==1){
  263.    
  264.   
  265.   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;
  266.   
  267.   DynamicJsonDocument doc(capacity);
  268.   
  269.   deserializeJson(doc, client);
  270.   
  271.   JsonObject results_0 = doc["results"][0];
  272.   
  273.   JsonArray results_0_daily = results_0["daily"];
  274.   
  275.   JsonObject results_0_daily_0 = results_0_daily[0];
  276.   const char* results_0_daily_0_date = results_0_daily_0["date"];
  277.   const char* results_0_daily_0_text_day = results_0_daily_0["text_day"];
  278.   const char* results_0_daily_0_code_day = results_0_daily_0["code_day"];
  279.   const char* results_0_daily_0_text_night = results_0_daily_0["text_night"];
  280.   const char* results_0_daily_0_code_night = results_0_daily_0["code_night"];
  281.   const char* results_0_daily_0_high = results_0_daily_0["high"];
  282.   const char* results_0_daily_0_low = results_0_daily_0["low"];
  283.   const char* results_0_daily_0_rainfall = results_0_daily_0["rainfall"];
  284.   const char* results_0_daily_0_precip = results_0_daily_0["precip"];
  285.   const char* results_0_daily_0_wind_direction = results_0_daily_0["wind_direction"];
  286.   const char* results_0_daily_0_wind_direction_degree = results_0_daily_0["wind_direction_degree"];
  287.   const char* results_0_daily_0_wind_speed = results_0_daily_0["wind_speed"];
  288.   const char* results_0_daily_0_wind_scale = results_0_daily_0["wind_scale"];
  289.   const char* results_0_daily_0_humidity = results_0_daily_0["humidity"];
  290.   
  291.   JsonObject results_0_daily_1 = results_0_daily[1];
  292.   const char* results_0_daily_1_date = results_0_daily_1["date"];
  293.   const char* results_0_daily_1_text_day = results_0_daily_1["text_day"];
  294.   const char* results_0_daily_1_code_day = results_0_daily_1["code_day"];
  295.   const char* results_0_daily_1_text_night = results_0_daily_1["text_night"];
  296.   const char* results_0_daily_1_code_night = results_0_daily_1["code_night"];
  297.   const char* results_0_daily_1_high = results_0_daily_1["high"];
  298.   const char* results_0_daily_1_low = results_0_daily_1["low"];
  299.   const char* results_0_daily_1_rainfall = results_0_daily_1["rainfall"];
  300.   const char* results_0_daily_1_precip = results_0_daily_1["precip"];
  301.   const char* results_0_daily_1_wind_direction = results_0_daily_1["wind_direction"];
  302.   const char* results_0_daily_1_wind_direction_degree = results_0_daily_1["wind_direction_degree"];
  303.   const char* results_0_daily_1_wind_speed = results_0_daily_1["wind_speed"];
  304.   const char* results_0_daily_1_wind_scale = results_0_daily_1["wind_scale"];
  305.   const char* results_0_daily_1_humidity = results_0_daily_1["humidity"];
  306.   
  307.   JsonObject results_0_daily_2 = results_0_daily[2];
  308.   const char* results_0_daily_2_date = results_0_daily_2["date"];
  309.   const char* results_0_daily_2_text_day = results_0_daily_2["text_day"];
  310.   const char* results_0_daily_2_code_day = results_0_daily_2["code_day"];
  311.   const char* results_0_daily_2_text_night = results_0_daily_2["text_night"];
  312.   const char* results_0_daily_2_code_night = results_0_daily_2["code_night"];
  313.   const char* results_0_daily_2_high = results_0_daily_2["high"];
  314.   const char* results_0_daily_2_low = results_0_daily_2["low"];
  315.   const char* results_0_daily_2_rainfall = results_0_daily_2["rainfall"];
  316.   const char* results_0_daily_2_precip = results_0_daily_2["precip"];
  317.   const char* results_0_daily_2_wind_direction = results_0_daily_2["wind_direction"];
  318.   const char* results_0_daily_2_wind_direction_degree = results_0_daily_2["wind_direction_degree"];
  319.   const char* results_0_daily_2_wind_speed = results_0_daily_2["wind_speed"];
  320.   const char* results_0_daily_2_wind_scale = results_0_daily_2["wind_scale"];
  321.   const char* results_0_daily_2_humidity = results_0_daily_2["humidity"];
  322.   
  323.   const char* results_0_last_update = results_0["last_update"];
  324.   
  325.   // 從以上信息中摘選幾個通過串口監(jiān)視器顯示
  326.   String results_0_daily_0_date_str = results_0_daily_0["date"].as<String>();
  327.   String  results_0_daily_0_text_day_str = results_0_daily_0["text_day"].as<String>();
  328.   int results_0_daily_0_code_day_int = results_0_daily_0["code_day"].as<int>();
  329.   String results_0_daily_0_text_night_str = results_0_daily_0["text_night"].as<String>();
  330.   int results_0_daily_0_code_night_int = results_0_daily_0["code_night"].as<int>();
  331.   int results_0_daily_0_high_int = results_0_daily_0["high"].as<int>();
  332.   int results_0_daily_0_low_int = results_0_daily_0["low"].as<int>();
  333.   String results_0_last_update_str = results_0["last_update"].as<String>();

  334.   int results_0_daily_1_high_int = results_0_daily_1["high"].as<int>();
  335.   int results_0_daily_1_low_int = results_0_daily_1["low"].as<int>();
  336.   String results_0_daily_1_text_day_str = results_0_daily_1["text_day"].as<String>();

  337.   Serial.println(F("======Today Weahter ======="));
  338.   Serial.print(F("DATE: "));
  339.   Serial.println(results_0_daily_0_date_str);
  340.   Serial.print(F("Day Weather: "));
  341.   Serial.print(results_0_daily_0_text_day_str);
  342.   Serial.print(F(" "));
  343.   Serial.println(results_0_daily_0_code_day_int);
  344.   Serial.print(F("Night Weather: "));
  345.   Serial.print(results_0_daily_0_text_night_str);
  346.   Serial.print(F(" "));
  347.   Serial.println(results_0_daily_0_code_night_int);
  348.   Serial.print(F("High: "));
  349.   Serial.println(results_0_daily_0_high_int);
  350.   Serial.print(F("LOW: "));
  351.   Serial.println(results_0_daily_0_low_int);
  352.   Serial.print(F("Last Update: "));
  353.   Serial.println(results_0_last_update_str);
  354.   Serial.println(F("=============================="));
  355.   display_1(results_0_daily_1_high_int,results_0_daily_1_low_int,results_0_daily_1_text_day_str);
  356.   results_0_daily_1_high_int_old=results_0_daily_1_high_int;
  357.   results_0_daily_1_low_int_old=results_0_daily_1_low_int;
  358.   results_0_daily_1_text_day_str_old=results_0_daily_1_text_day_str;
  359. }else{
  360.   display_1(results_0_daily_1_high_int_old,results_0_daily_1_low_int_old,results_0_daily_1_text_day_str_old);
  361. }


  362.   
  363. }
  364. //----------預(yù)測明天天氣----------
  365. 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){
  366.   //顯示輸出
  367.   u8g2.clearBuffer();
  368.   u8g2.setFont(u8g2_font_wqy16_t_gb2312);
  369.   u8g2.setCursor(15, 14);
  370.   u8g2.print("上海明天天氣");
  371.   
  372.   u8g2.setFont(u8g2_font_logisoso24_tr);
  373.   u8g2.setCursor(20, 46);
  374.   u8g2.print(results_0_daily_1_low_int);
  375.   u8g2.setCursor(56, 46);
  376.   u8g2.print("~");
  377.   u8g2.setCursor(75, 46);
  378.   u8g2.print(results_0_daily_1_high_int);
  379.   
  380.   u8g2.setCursor(30, 62);
  381.   u8g2.setFont(u8g2_font_unifont_t_chinese2);
  382.   u8g2.print(results_0_daily_1_text_day_str);
  383.   u8g2.sendBuffer();
  384. }


  385. /*-------- NTP 代碼 ----------*/

  386. const int NTP_PACKET_SIZE = 48;     // NTP時間在消息的前48個字節(jié)里
  387. byte packetBuffer[NTP_PACKET_SIZE]; // 輸入輸出包的緩沖區(qū)

  388. time_t getNtpTime()
  389. {
  390.     IPAddress ntpServerIP; // NTP服務(wù)器的地址

  391.     while (Udp.parsePacket() > 0)
  392.         ; // 丟棄以前接收的任何數(shù)據(jù)包
  393.     Serial.println("Transmit NTP Request");
  394.     // 從池中獲取隨機服務(wù)器
  395.     WiFi.hostByName(ntpServerName, ntpServerIP);
  396.     Serial.print(ntpServerName);
  397.     Serial.print(": ");
  398.     Serial.println(ntpServerIP);
  399.     sendNTPpacket(ntpServerIP);
  400.     uint32_t beginWait = millis();
  401.     while (millis() - beginWait < 1500)
  402.     {
  403.         int size = Udp.parsePacket();
  404.         if (size >= NTP_PACKET_SIZE)
  405.         {
  406.             Serial.println("Receive NTP Response");
  407.             isNTPConnected = true;
  408.             Udp.read(packetBuffer, NTP_PACKET_SIZE); // 將數(shù)據(jù)包讀取到緩沖區(qū)
  409.             unsigned long secsSince1900;
  410.             // 將從位置40開始的四個字節(jié)轉(zhuǎn)換為長整型,只取前32位整數(shù)部分
  411.             secsSince1900 = (unsigned long)packetBuffer[40] << 24;
  412.             secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
  413.             secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
  414.             secsSince1900 |= (unsigned long)packetBuffer[43];
  415.             Serial.println(secsSince1900);
  416.             Serial.println(secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR);
  417.             return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
  418.         }
  419.     }
  420.     Serial.println("No NTP Response :-("); //無NTP響應(yīng)
  421.     isNTPConnected = false;
  422.     return 0; //如果未得到時間則返回0
  423. }

  424. // 向給定地址的時間服務(wù)器發(fā)送NTP請求
  425. void sendNTPpacket(IPAddress &address)
  426. {
  427.     memset(packetBuffer, 0, NTP_PACKET_SIZE);
  428.     packetBuffer[0] = 0b11100011; // LI, Version, Mode
  429.     packetBuffer[1] = 0;          // Stratum, or type of clock
  430.     packetBuffer[2] = 6;          // Polling Interval
  431.     packetBuffer[3] = 0xEC;       // Peer Clock Precision
  432.     // 8 bytes of zero for Root Delay & Root Dispersion
  433.     packetBuffer[12] = 49;
  434.     packetBuffer[13] = 0x4E;
  435.     packetBuffer[14] = 49;
  436.     packetBuffer[15] = 52;
  437.     Udp.beginPacket(address, 123); //NTP需要使用的UDP端口號為123
  438.     Udp.write(packetBuffer, NTP_PACKET_SIZE);
  439.     Udp.endPacket();
  440. }

  441. void oledClockDisplay()
  442. {
  443.     int years, months, days, hours, minutes, seconds, weekdays;
  444.     years = year();
  445.     months = month();
  446.     days = day();
  447.     hours = hour();
  448.     minutes = minute();
  449.     seconds = second();
  450.     weekdays = weekday();
  451.     Serial.printf("%d/%d/%d %d:%d:%d Weekday:%d\n", years, months, days, hours, minutes, seconds, weekdays);
  452.     u8g2.clearBuffer();
  453.     u8g2.setFont(u8g2_font_unifont_t_chinese2);
  454.     u8g2.setCursor(0, 14);
  455.     if (isNTPConnected)
  456.     {
  457.         if(timeZone>=0)
  458.         {
  459.             u8g2.print("當(dāng)前時間(UTC+");
  460.             u8g2.print(timeZone);
  461.             u8g2.print(")");
  462.         }
  463.         else
  464.         {
  465.             u8g2.print("當(dāng)前時間(UTC");
  466.             u8g2.print(timeZone);
  467.             u8g2.print(")");
  468.         }
  469.     }
  470.     else
  471.         u8g2.print("無網(wǎng)絡(luò)!"); //如果上次對時失敗,則會顯示無網(wǎng)絡(luò)
  472.     String currentTime = "";
  473.     if (hours < 10)
  474.         currentTime += 0;
  475.     currentTime += hours;
  476.     currentTime += ":";
  477.     if (minutes < 10)
  478.         currentTime += 0;
  479.     currentTime += minutes;
  480.     currentTime += ":";
  481.     if (seconds < 10)
  482.         currentTime += 0;
  483.     currentTime += seconds;
  484.     String currentDay = "";
  485.     currentDay += years;
  486.     currentDay += "/";
  487.     if (months < 10)
  488.         currentDay += 0;
  489.     currentDay += months;
  490.     currentDay += "/";
  491.     if (days < 10)
  492.         currentDay += 0;
  493.     currentDay += days;

  494.     u8g2.setFont(u8g2_font_logisoso24_tr);
  495.     u8g2.setCursor(0, 44);
  496.     u8g2.print(currentTime);
  497.     u8g2.setCursor(0, 61);
  498.     u8g2.setFont(u8g2_font_unifont_t_chinese2);
  499.     u8g2.print(currentDay);
  500.     u8g2.drawXBM(80, 48, 16, 16, xing);
  501.     u8g2.setCursor(95, 62);
  502.     u8g2.print("期");
  503.     if (weekdays == 1)
  504.         u8g2.print("日");
  505.     else if (weekdays == 2)
  506.         u8g2.print("一");
  507.     else if (weekdays == 3)
  508.         u8g2.print("二");
  509.     else if (weekdays == 4)
  510.         u8g2.print("三");
  511.     else if (weekdays == 5)
  512.         u8g2.print("四");
  513.     else if (weekdays == 6)
  514.         u8g2.print("五");
  515.     else if (weekdays == 7)
  516.         u8g2.drawXBM(111, 49, 16, 16, liu);
  517.     u8g2.sendBuffer();
  518. }
復(fù)制代碼

實現(xiàn)效果如下

實時天氣.JPG (228.87 KB, 下載次數(shù): 19)

實時天氣.JPG

當(dāng)前時間.JPG (236.46 KB, 下載次數(shù): 21)

當(dāng)前時間.JPG

明天天氣.JPG (230.48 KB, 下載次數(shù): 21)

明天天氣.JPG

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1130053 發(fā)表于 2024-8-15 13:25 | 只看該作者
謝謝分享,學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频网 | 欧美三级电影在线播放 | 久久久综合色 | 国产第一页在线播放 | 成人精品系列 | 国产一区三区在线 | 男女视频在线免费观看 | av网站推荐 | 欧美在线a| 伊人久久精品一区二区三区 | h视频免费在线观看 | 精品福利一区二区三区 | 欧美一级在线视频 | 亚洲电影免费 | 天天操天天干天天透 | 在线观看免费av片 | 久久精品小短片 | 午夜影晥 | 国产美女黄色片 | 涩爱av一区二区三区 | 亚洲精品一区二区在线观看 | 久久久亚洲成人 | 国产一区二区视频在线观看 | 日本不卡一区二区三区 | 国产精品久久久久久模特 | 亚洲高清av在线 | japanhdxxxx裸体| 亚洲国产一区二区三区在线观看 | 久久青青 | 午夜成人在线视频 | 2一3sex性hd | 国产精品久久久久一区二区三区 | 国产高清视频一区 | 久久免费精品 | 男女啪啪高潮无遮挡免费动态 | 精品视频在线一区 | av中文字幕在线 | 天天爽夜夜操 | av中文字幕在线 | 在线观看日韩精品视频 | 精品国产伦一区二区三区观看方式 |