利用太極創客提供的ESP8266 心知天氣庫獲取天氣情況并顯示
心知天氣庫地址:
ESP8266-心知天氣: 本庫主要功能為使用ESP8266物聯網開發板通過心知天氣 API 獲取天氣等信息。
clone到本地:?
git clone https://gitee.com/taijichuangke/ESP8266-Seniverse.git
安裝該庫,只需要將整個目錄 復制到C:\Users\用戶名\AppData\Local\Arduino15\libraries
/**********************************************************************
項目名稱/Project : 零基礎入門學用物聯網
程序名稱/Program name : weather_now(rev.002)
團隊/Team : 太極創客團隊 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO朔
日期/Date(YYYYMMDD) : 初版建立時間20200602(最新修訂時間20200607)
程序目的/Purpose :
使用ESP8266_Seniverse庫通過心知天氣服務器獲取實時天氣信息。
-----------------------------------------------------------------------
本程序所屬倉庫網址
GitHub: https://github.com/taichi-maker/ESP8266-Seniverse
Gitee: https://gitee.com/taijichuangke/ESP8266-Seniverse
-----------------------------------------------------------------------
其它說明 / Other Description
心知天氣API文檔說明: https://www.seniverse.com/docs本程序為太極創客團隊制作的免費視頻教程《零基礎入門學用物聯網 》中一部分。該教程系統的
向您講述ESP8266的物聯網應用相關的軟件和硬件知識。以下是該教程目錄頁:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/
***********************************************************************/
#include <Arduino.h>
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266_Seniverse.h>#include <U8g2lib.h>const char* ssid = "ssid"; // 連接WiFi名(此處使用taichi-maker為示例)// 請將您需要連接的WiFi名填入引號中
const char* password = "password"; // 連接WiFi密碼(此處使用12345678為示例) // 請將您需要連接的WiFi密碼填入引號中// 請將您需要連接的WiFi密碼填入引號中// 心知天氣HTTP請求所需信息
// 請對以下信息進行修改,填入您的心知天氣私鑰以及需要獲取天氣信息的城市和溫度單位
// 如需進一步了解心知天氣API所提供的城市列表等信息,請前往心知天氣官方產品文檔網址:
// https://www.seniverse.com/docs
String reqUserKey = "私鑰"; // 私鑰
String reqLocation = "beijing"; // 城市
String reqUnit = "c"; // 攝氏/華氏WeatherNow weatherNow; // 建立WeatherNow對象用于獲取心知天氣信息
IPAddress ip;
char ipStr[16]; // 假設 IPv4 地址最大長度為 15 字符加上一個結束符 '\0' U8G2_ST7565_ERC12864_ALT_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ D4, /* data=*/ D3, /* cs=*/ D0, /* dc=*/ D1, /* reset=*/ D2); void setup(){Serial.begin(9600); Serial.println("");u8g2.begin();u8g2.enableUTF8Print();connectWiFi(); // 連接wifi// 配置心知天氣請求信息weatherNow.config(reqUserKey, reqLocation, reqUnit);
}void loop(){char buffer[32];if(weatherNow.update()){ // 更新天氣信息Serial.println(F("======Weahter Info======"));Serial.print("Server Response: ");Serial.println(weatherNow.getServerCode()); // 獲取服務器響應碼Serial.print(F("Weather Now: "));Serial.print(weatherNow.getWeatherText()); // 獲取當前天氣(字符串格式)Serial.print(F(" "));Serial.println(weatherNow.getWeatherCode());// 獲取當前天氣(整數格式)Serial.print(F("Temperature: "));Serial.println(weatherNow.getDegree()); // 獲取當前溫度數值Serial.print(F("Last Update: "));Serial.println(weatherNow.getLastUpdate()); // 獲取服務器更新天氣信息時間Serial.println(F("========================")); u8g2.clearBuffer(); // clear the internal memoryu8g2.setFont(u8g2_font_ncenB12_tr); // choose a suitable fontu8g2.drawStr(0,16,"Weahter Info"); // write something to the internal memoryu8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font//u8g2.drawStr(0,40,"Temperature:"); u8g2.drawStr(0, 60, ipStr);u8g2.drawStr(0,40,weatherNow.getWeatherText().c_str());sprintf(buffer, "%d", weatherNow.getDegree());u8g2.setFont(u8g2_font_ncenB24_tr); // choose a suitable fontu8g2.drawStr(90,60,buffer); u8g2.sendBuffer();} else { // 更新失敗Serial.println("Update Fail..."); Serial.print("Server Response: "); // 輸出服務器響應狀態碼供用戶查找問題Serial.println(weatherNow.getServerCode()); // 心知天氣服務器錯誤代碼說明可通過以下網址獲取u8g2.clearBuffer(); // clear the internal memoryu8g2.setFont(u8g2_font_ncenB12_tr); // choose a suitable fontu8g2.drawStr(0,16,"Update Fail..."); // write something to the internal memoryu8g2.sendBuffer();} // https://docs.seniverse.com/api/start/error.htmldelay(30000);
}// 連接WiFi
void connectWiFi(){WiFi.begin(ssid, password); // 啟動網絡連接Serial.print("Connecting to "); // 串口監視器輸出網絡連接信息Serial.print(ssid); Serial.println(" ..."); // 告知用戶NodeMCU正在嘗試WiFi連接u8g2.clearBuffer(); // clear the internal memoryu8g2.setFont(u8g2_font_ncenB12_tr); // choose a suitable fontu8g2.drawStr(0,16,"Connecting to ..."); // write something to the internal memoryu8g2.sendBuffer();int i = 0; // 這一段程序語句用于檢查WiFi是否連接成功while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函數的返回值是由NodeMCU的WiFi連接狀態所決定的。 delay(1000); // 如果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地址。這一功能是通過調用ip=WiFi.localIP();snprintf(ipStr, sizeof(ipStr), "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);Serial.println(ip); // WiFi.localIP()函數來實現的。該函數的返回值即NodeMCU的IP地址。
}
/*-----------------------------------------------------------------------
修訂歷史/Revision History
日期/Date 作者/Author 參考號/Ref 修訂說明/Revision Description
20200603 CYNO朔 001 add http response code check
20200603 CYNO朔 002 change file name to ESP8266_Seniverse
-----------------------------------------------------------------------*/
?