|
注意修改 WiFi 名稱和密碼 需要申請【心知天氣】API私鑰
心知天氣:wwwseniversecom - /*
- 參考:
- https://blog.csdn.net/weixin_44668788/article/details/120643078
- OLED connect with ESP8266 NodeMCU
- SCL -- D1
- SDA -- D2
- */
- //引入必要的頭文件
- #include <ArduinoJson.h>
- #include <ESP8266WiFi.h>
- #include <SPI.h>
- #include <U8g2lib.h>
- #include <WiFiUdp.h>
- #include <TimeLib.h>
- #include <DNSServer.h>
- #include <ESP8266WebServer.h>
- WiFiUDP Udp;
- unsigned int localPort = 8888; // 用于偵聽UDP數(shù)據(jù)包的本地端口
-
- //網(wǎng)絡(luò)校時的相關(guān)配置
- static const char ntpServerName[] = "ntp1.aliyun.com"; //NTP服務(wù)器,使用阿里云
- int timeZone = 8; //時區(qū)設(shè)置,采用東8區(qū)
-
- //保存斷網(wǎng)前的最新數(shù)據(jù)
- int results_0_now_temperature_int_old;
- String results_0_now_text_str_old;
- int results_0_daily_1_high_int_old;
- int results_0_daily_1_low_int_old;
- String results_0_daily_1_text_day_str_old;
-
- //函數(shù)聲明
- time_t getNtpTime();
- void sendNTPpacket(IPAddress &address);
- void oledClockDisplay();
- void sendCommand(int command, int value);
- void initdisplay();
- void connectWiFi();
- void parseInfo_now(WiFiClient client,int i);
- void parseInfo_fut(WiFiClient client,int i);
- //
- boolean isNTPConnected = false;
-
- const unsigned char xing[] U8X8_PROGMEM = {
- 0x00, 0x00, 0xF8, 0x0F, 0x08, 0x08, 0xF8, 0x0F, 0x08, 0x08, 0xF8, 0x0F, 0x80, 0x00, 0x88, 0x00,
- 0xF8, 0x1F, 0x84, 0x00, 0x82, 0x00, 0xF8, 0x0F, 0x80, 0x00, 0x80, 0x00, 0xFE, 0x3F, 0x00, 0x00}; /*星*/
- const unsigned char liu[] U8X8_PROGMEM = {
- 0x40, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00,
- 0x20, 0x02, 0x20, 0x04, 0x10, 0x08, 0x10, 0x10, 0x08, 0x10, 0x04, 0x20, 0x02, 0x20, 0x00, 0x00}; /*六*/
-
- typedef struct
- { //存儲配置結(jié)構(gòu)體
- int tz; //時間戳
- } config_type;
- config_type config;
-
- WiFiClient clientNULL;
- DNSServer dnsServer;
- ESP8266WebServer server(80);
-
-
- //----------WIFI連接配置----------
- const char* ssid = "xxxxxxx"; // 連接WiFi名,需要修改
- const char* password = "xxxxxxxx"; // 連接WiFi密碼,需要修改
- // 請將您需要連接的WiFi密碼填入引號中
- //----------天氣API配置----------
- const char* host = "api.seniversecom"; // 將要連接的服務(wù)器地址
- const int httpPort = 80; // 將要連接的服務(wù)器端口
-
- // 心知天氣HTTP請求所需信息
- String reqUserKey = "xxxxxx"; // 私鑰,需要修改
- String reqLocation = "Shanghai"; // 城市
- String reqUnit = "c"; // 攝氏/華氏
-
- //----------設(shè)置屏幕----------
- U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
- int sta = 0;
- //----------初始化OLED----------
- void initdisplay()
- {
- u8g2.begin();
- u8g2.enableUTF8Print();
- }
- //----------用于獲取實時天氣的函數(shù)(0)----------
- void TandW(){
- String reqRes = "/v3/weather/now.json?key=" + reqUserKey +
- + "&location=" + reqLocation +
- "&language=en&unit=" +reqUnit;
- // 向心知天氣服務(wù)器服務(wù)器請求信息并對信息進行解析
- httpRequest(reqRes,0);
- //延遲,需要低于20次/分鐘
- delay(5000);
- }
- void display_1(int results_0_now_temperature_int,String results_0_now_text_str);//聲明函數(shù),用于顯示溫度、天氣
-
-
- //----------獲取3天預(yù)報(1)----------
- void threeday(){
- // 建立心知天氣API當(dāng)前天氣請求資源地址
- String reqRes = "/v3/weather/daily.json?key=" + reqUserKey +
- + "&location=" + reqLocation + "&language=en&unit=" +
- reqUnit + "&start=0&days=3";
-
- // 向心知天氣服務(wù)器服務(wù)器請求信息并對信息進行解析
- httpRequest(reqRes,1);
- delay(5000);
- }
-
- void clock_display(time_t prevDisplay){
- server.handleClient();
- dnsServer.processNextRequest();
- if (timeStatus() != timeNotSet)
- {
- if (now() != prevDisplay)
- { //時間改變時更新顯示
- prevDisplay = now();
- oledClockDisplay();
- }
- }
- }
-
-
- void setup(){
- Serial.begin(9600);
- Serial.println("");
- initdisplay();
- // 連接WiFi
-
-
-
- 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();
- Udp.begin(localPort);
- setSyncProvider(getNtpTime);
- setSyncInterval(300); //每300秒同步一次時間
-
-
- }
-
- time_t prevDisplay = 0; //當(dāng)時鐘已經(jīng)顯示
-
- void loop(){
- if (sta>=0 && sta<=250){
- clock_display(prevDisplay);
-
- }else if(sta == 251){
- TandW();
-
- }else{
- threeday();
-
- }
-
- ++sta;
-
- if(sta==253){
- sta = 0;
- }
- }
-
- // 向心知天氣服務(wù)器服務(wù)器請求信息并對信息進行解析
- 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);
-
- // 嘗試連接服務(wù)器
- if (client.connect(host, 80)){
- Serial.println(" Success!");
-
- // 向服務(wù)器發(fā)送http請求信息
- client.print(httpRequest);
- Serial.println("Sending request: ");
- Serial.println(httpRequest);
-
- // 獲取并顯示服務(wù)器響應(yīng)狀態(tài)行
- String status_response = client.readStringUntil('\n');
- Serial.print("status_response: ");
- Serial.println(status_response);
-
- // 使用find跳過HTTP響應(yīng)頭
- if (client.find("\r\n\r\n")) {
- Serial.println("Found Header End. Start Parsing.");
- }
- if (stat == 0){
-
- // 利用ArduinoJson庫解析心知天氣響應(yīng)信息(實時數(shù)據(jù))
- parseInfo_now(client,1);
- }else if(stat == 1){
- parseInfo_fut(client,1);
- }
- }
- else {
- Serial.println(" connection failed!");
- if (stat == 0){
-
- // 利用ArduinoJson庫解析心知天氣響應(yīng)信息(實時數(shù)據(jù))
- parseInfo_now(clientNULL,0);
- }else if(stat == 1){
- parseInfo_fut(clientNULL,0);
- }
- }
-
- //斷開客戶端與服務(wù)器連接工作
- client.stop();
- }
-
- // 連接WiFi
- void connectWiFi(){
- WiFi.begin(ssid, password); // 啟動網(wǎng)絡(luò)連接
- Serial.print("Connecting to "); // 串口監(jiān)視器輸出網(wǎng)絡(luò)連接信息
- Serial.print(ssid); Serial.println(" ..."); // 告知用戶NodeMCU正在嘗試WiFi連接
-
- int i = 0; // 這一段程序語句用于檢查WiFi是否連接成功
- while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函數(shù)的返回值是由NodeMCU的WiFi連接狀態(tài)所決定的。
- delay(1000); // 如果WiFi連接成功則返回值為WL_CONNECTED
- Serial.print(i++); Serial.print(' '); // 此處通過While循環(huán)讓NodeMCU每隔一秒鐘檢查一次WiFi.status()函數(shù)返回值
- } // 同時NodeMCU將通過串口監(jiān)視器輸出連接時長讀秒。
- // 這個讀秒是通過變量i每隔一秒自加1來實現(xiàn)的。
- Serial.println(""); // WiFi連接成功后
- Serial.println("Connection established!"); // NodeMCU將通過串口監(jiān)視器輸出"連接成功"信息。
- Serial.print("IP address: "); // 同時還將輸出NodeMCU的IP地址。這一功能是通過調(diào)用
- Serial.println(WiFi.localIP()); // WiFi.localIP()函數(shù)來實現(xiàn)的。該函數(shù)的返回值即NodeMCU的IP地址。
- }
-
- // 利用ArduinoJson庫解析心知天氣響應(yīng)信息(實時)
- 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"
-
- // 通過串口監(jiān)視器顯示以上信息
- 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(45, 44);
- u8g2.print(results_0_now_temperature_int);
- u8g2.setCursor(15, 61);
- u8g2.setFont(u8g2_font_unifont_t_chinese2);
- u8g2.print(results_0_now_text_str);
- u8g2.sendBuffer();
- }
-
-
- // 利用ArduinoJson庫解析心知天氣響應(yīng)信息(預(yù)測)
- 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"];
-
- // 從以上信息中摘選幾個通過串口監(jiān)視器顯示
- 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);
- }
-
-
-
- }
- //----------預(yù)測明天天氣----------
- 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(30, 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個字節(jié)里
- byte packetBuffer[NTP_PACKET_SIZE]; // 輸入輸出包的緩沖區(qū)
-
- time_t getNtpTime()
- {
- IPAddress ntpServerIP; // NTP服務(wù)器的地址
-
- while (Udp.parsePacket() > 0)
- ; // 丟棄以前接收的任何數(shù)據(jù)包
- Serial.println("Transmit NTP Request");
- // 從池中獲取隨機服務(wù)器
- 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); // 將數(shù)據(jù)包讀取到緩沖區(qū)
- unsigned long secsSince1900;
- // 將從位置40開始的四個字節(jié)轉(zhuǎn)換為長整型,只取前32位整數(shù)部分
- 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響應(yīng)
- isNTPConnected = false;
- return 0; //如果未得到時間則返回0
- }
-
- // 向給定地址的時間服務(wù)器發(fā)送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();
- 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("當(dāng)前時間(UTC+");
- u8g2.print(timeZone);
- u8g2.print(")");
- }
- else
- {
- u8g2.print("當(dāng)前時間(UTC");
- u8g2.print(timeZone);
- u8g2.print(")");
- }
- }
- else
- u8g2.print("無網(wǎng)絡(luò)!"); //如果上次對時失敗,則會顯示無網(wǎng)絡(luò)
- 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();
- }
復(fù)制代碼
實現(xiàn)效果如下 |
評分
-
查看全部評分
|