本實作使用ESP32的無線WiWi模組連上網路,利用HTTP的GET方法進行資料請求,自氣象網站取回天氣資料,故須先取得氣象網站的程式開發API Key,請參考這裡。
當設計程式進行Web應用或者是手機應用,若需要秀出天氣數據或者天氣預報數據時,不妨使用 OpenWeatherMap 天氣API服務。
OpenWeatherMap是OpenWeather Ltd擁有的在線服務,它通過API提供全球天氣數據,包括任何地理位置的當前天氣數據,天氣預報,天氣預報和歷史天氣數據。該公司提供了對任何位置的逐分鐘超局部降雨預報。
OpenWeatherMap 提供當前天氣的地圖,一周預報,降水,風,雲,來自氣象站的其他數據。免費用戶就可以使用絕大部分功能。提供 JSON 、 XML ,、以及 HTML 等多種格式數據。
取得開發API Key後串接取得天氣資料的網址格式如下,詳細網址參數說明請參考這裡:
http://api.openweathermap.org/data/2.5/weather?q=天氣地區&appid=開發金鑰完整程式內容如下:
#include <HTTPClient.h.h> const char ssid[] = "Wi-Fi站點名稱"; const char password[] = "Wi-Fi連入密碼"; String API_KEY = "你的開發 API Key"; String area = "Taipei,TW"; //欲取得天氣資料的地區名稱 HTTPClient http; void setup() { Serial.begin(115200); WiFi.begin(ssid, psw); while (WiFi.status() != WL_CONNECTED) { //WiFi.status()回傳值意義詳見文後 delay(500); Serial.print("無線基地台連線中... \n"); } Serial.print("無線模組當前的IP:"); Serial.println(WiFi.localIP() ); openWeather(); } void openWeather() { String weatherUrl = "http://api.openweathermap.org/data/2.5/weather?q=" + area + "&appid=" + API_KEY; //串接取得天氣資料的網址 if ((WiFi.status() == WL_CONNECTED)) { http.begin(weatherUrl); // 指定連結網址 int httpCode = http.GET(); // 以GET方式主動發出請求 if (httpCode > 0) { // 伺服器狀態碼(返回數值型別:int類型) String weatherData = http.getString(); Serial.println("取得jason格式的天氣資料如下:"); Serial.println(weatherData.c_str()); } else { Serial.println("網頁資料請求失敗!!"); } http.end(); } } void loop() { }WiFi.status()回傳值意義說明:
0: WL_IDLE_STATUS – 返回值為0, 正在嘗試連接
1: WL_NO_SSID_AVAIL – 返回值為1, 沒有找到設定的SSID的網路
2: WL_SCAN_COMPLETED – 返回值為2, 網路掃描完畢
3: WL_CONNECTED – 返回值為3, 連接成功
4: WL_CONNECT_FAILED – 返回值為4, 連接失敗
5: WL_CONNECTION_LOST – 返回值為5, 連接中斷
6: WL_DISCONNECTED – 返回值為6, 未連接