- 附上代碼二,在上面的基礎(chǔ)上。添加 心知天氣 (api申請(qǐng))的顯示,增加一點(diǎn)實(shí)用性
- 主要代碼來自于 太極創(chuàng)客,
- /**********************************************************************
- 項(xiàng)目名稱/Project : 零基礎(chǔ)入門學(xué)用物聯(lián)網(wǎng)
- 程序名稱/Program name : weather_now
- 團(tuán)隊(duì)/Team : 太極創(chuàng)客團(tuán)隊(duì) / Taichi-Maker
- 作者/Author : CYNO朔
- 日期/Date(YYYYMMDD) : 20200602
- 程序目的/Purpose :
- 通過心知天氣免費(fèi)服務(wù)獲取實(shí)時(shí)天氣信息。
- -----------------------------------------------------------------------
- 其它說明 / Other Description
- 心知天氣API文檔說明:
- 本程序?yàn)樘珮O創(chuàng)客團(tuán)隊(duì)制作的免費(fèi)視頻教程《零基礎(chǔ)入門學(xué)用物聯(lián)網(wǎng) 》中一部分。該教程系統(tǒng)的
- 向您講述ESP8266的物聯(lián)網(wǎng)應(yīng)用相關(guān)的軟件和硬件知識(shí)。
- ***********************************************************************/
- #include <ArduinoJson.h>
- #include <ESP8266WiFi.h>
- #include <LiquidCrystal.h>
- const char* ssid = "bonfire"; // 連接WiFi名(此處使用taichi-maker為示例)
- // 請(qǐng)將您需要連接的WiFi名填入引號(hào)中
- const char* password = "1234567800"; // 連接WiFi密碼(此處使用12345678為示例)
- // 請(qǐng)將您需要連接的WiFi密碼填入引號(hào)中
- const char* host = "api.知心天氣的服務(wù)器"; // 將要連接的服務(wù)器地址
- const int httpPort = 80; // 將要連接的服務(wù)器端口
- // 心知天氣HTTP請(qǐng)求所需信息
- String reqUserKey = "xxxxxxxxxxxxxx"; // 私鑰
- String reqLocation = "22.98486:114.7199"; // 城市
- String reqUnit = "c"; // 攝氏/華氏
- LiquidCrystal lcd(5, 4, 0, 2, 14, 12); // 實(shí)例化lcd驅(qū)動(dòng)
- void setup() {
- lcd.begin(16, 2); //設(shè)置行列
- lcd.print("Hello Joie ^v^");//打印信息
- Serial.begin(9600);
- Serial.println("");
- // 連接WiFi
- connectWiFi();
- }
- void loop() {
- // 建立心知天氣API當(dāng)前天氣請(qǐng)求資源地址
- String reqRes = "/v3/weather/now.json?key=" + reqUserKey +
- + "&location=" + reqLocation +
- "&language=en&unit=" + reqUnit;
- // 向心知天氣服務(wù)器服務(wù)器請(qǐng)求信息并對(duì)信息進(jìn)行解析
- httpRequest(reqRes);
- delay(3000);
- // lcd.clear();
- // lcd.setCursor(0, 1); //設(shè)置光標(biāo)位置
- // lcd.print("time:");
- // lcd.print(millis() / 1000); //計(jì)算運(yùn)行時(shí)間
- }
- // 向心知天氣服務(wù)器服務(wù)器請(qǐng)求信息并對(duì)信息進(jìn)行解析
- void httpRequest(String reqRes) {
- WiFiClient client;
- // 建立http請(qǐng)求信息
- 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請(qǐng)求信息
- 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.");
- }
- // 利用ArduinoJson庫(kù)解析心知天氣響應(yīng)信息
- parseInfo(client);
- } else {
- Serial.println(" connection failed!");
- }
- //斷開客戶端與服務(wù)器連接工作
- client.stop();
- }
- // 連接WiFi
- void connectWiFi() {
- WiFi.begin(ssid, password); // 啟動(dòng)網(wǎng)絡(luò)連接
- Serial.print("Connecting to "); // 串口監(jiān)視器輸出網(wǎng)絡(luò)連接信息
- Serial.print(ssid); Serial.println(" ..."); // 告知用戶NodeMCU正在嘗試WiFi連接
- int i = 0; // 這一段程序語(yǔ)句用于檢查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ù)返回值
- lcd.setCursor(0,1);
- lcd.print(i++);
- } // 同時(shí)NodeMCU將通過串口監(jiān)視器輸出連接時(shí)長(zhǎng)讀秒。
- // 這個(gè)讀秒是通過變量i每隔一秒自加1來實(shí)現(xiàn)的。
- Serial.println(""); // WiFi連接成功后
- Serial.println("Connection established!"); // NodeMCU將通過串口監(jiān)視器輸出"連接成功"信息。
- Serial.print("IP address: "); // 同時(shí)還將輸出NodeMCU的IP地址。這一功能是通過調(diào)用
- Serial.println(WiFi.localIP()); // WiFi.localIP()函數(shù)來實(shí)現(xiàn)的。該函數(shù)的返回值即NodeMCU的IP地址。
- }
- // 利用ArduinoJson庫(kù)解析心知天氣響應(yīng)信息
- 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"
- // 通過串口監(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>();
- 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("========================"));
- // 設(shè)置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);
- }
復(fù)制代碼
|