- 附上代碼二,在上面的基礎上。添加 心知天氣 (api申請)的顯示,增加一點實用性
- 主要代碼來自于 太極創客,
- /**********************************************************************
- 項目名稱/Project : 零基礎入門學用物聯網
- 程序名稱/Program name : weather_now
- 團隊/Team : 太極創客團隊 / Taichi-Maker
- 作者/Author : CYNO朔
- 日期/Date(YYYYMMDD) : 20200602
- 程序目的/Purpose :
- 通過心知天氣免費服務獲取實時天氣信息。
- -----------------------------------------------------------------------
- 其它說明 / Other Description
- 心知天氣API文檔說明:
- 本程序為太極創客團隊制作的免費視頻教程《零基礎入門學用物聯網 》中一部分。該教程系統的
- 向您講述ESP8266的物聯網應用相關的軟件和硬件知識。
- ***********************************************************************/
- #include <ArduinoJson.h>
- #include <ESP8266WiFi.h>
- #include <LiquidCrystal.h>
- const char* ssid = "bonfire"; // 連接WiFi名(此處使用taichi-maker為示例)
- // 請將您需要連接的WiFi名填入引號中
- const char* password = "1234567800"; // 連接WiFi密碼(此處使用12345678為示例)
- // 請將您需要連接的WiFi密碼填入引號中
- const char* host = "api.知心天氣的服務器"; // 將要連接的服務器地址
- const int httpPort = 80; // 將要連接的服務器端口
- // 心知天氣HTTP請求所需信息
- String reqUserKey = "xxxxxxxxxxxxxx"; // 私鑰
- String reqLocation = "22.98486:114.7199"; // 城市
- String reqUnit = "c"; // 攝氏/華氏
- LiquidCrystal lcd(5, 4, 0, 2, 14, 12); // 實例化lcd驅動
- void setup() {
- lcd.begin(16, 2); //設置行列
- lcd.print("Hello Joie ^v^");//打印信息
- Serial.begin(9600);
- Serial.println("");
- // 連接WiFi
- connectWiFi();
- }
- void loop() {
- // 建立心知天氣API當前天氣請求資源地址
- String reqRes = "/v3/weather/now.json?key=" + reqUserKey +
- + "&location=" + reqLocation +
- "&language=en&unit=" + reqUnit;
- // 向心知天氣服務器服務器請求信息并對信息進行解析
- httpRequest(reqRes);
- delay(3000);
- // lcd.clear();
- // lcd.setCursor(0, 1); //設置光標位置
- // lcd.print("time:");
- // lcd.print(millis() / 1000); //計算運行時間
- }
- // 向心知天氣服務器服務器請求信息并對信息進行解析
- void httpRequest(String reqRes) {
- 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.");
- }
- // 利用ArduinoJson庫解析心知天氣響應信息
- parseInfo(client);
- } else {
- Serial.println(" connection failed!");
- }
- //斷開客戶端與服務器連接工作
- 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
- Serial.print(i++); Serial.print(' '); // 此處通過While循環讓NodeMCU每隔一秒鐘檢查一次WiFi.status()函數返回值
- lcd.setCursor(0,1);
- lcd.print(i++);
- } // 同時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庫解析心知天氣響應信息
- void parseInfo(WiFiClient client) {
- 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>();
- String results_0_now_temperature_str = results_0_now["temperature"].as<String>();
- 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.print(results_0_now_temperature_str);
- Serial.println(F(" C"));
- Serial.print(F("Last Update: "));
- Serial.println(results_0_last_update_str);
- Serial.println(F("========================"));
- // 設置lcd1602顯示信息
- lcd.clear();
- // delay(1000);
- lcd.setCursor(0, 0);
- lcd.print(results_0_now_text_str + " " + results_0_now_temperature_str + "c");
- lcd.setCursor(0, 1);
- lcd.print(results_0_last_update_str);
- }
復制代碼
|