#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// WiFi 設定
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define WIFI_CHANNEL 6
// API 設定 - 限制資料量以節省記憶體
const char* url = "https://data.moenv.gov.tw/api/v2/aqx_p_488?api_key=bb061ed6-3e42-484c-be3d-b5e1b7899070&limit=3&sort=datacreationdate%20desc&format=JSON&filters=SiteName,EQ,臺南";
void getAirQuality();
void setup() {
Serial.begin(115200);
// 連接 WiFi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD,WIFI_CHANNEL );
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
getAirQuality();
}
void getAirQuality() {
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
// 方法1:直接使用較小的文件並手動提取所需欄位
DynamicJsonDocument doc(8192); // 根據需要調整大小
DeserializationError error = deserializeJson(doc, http.getStream());
if (!error) {
JsonArray records = doc["records"];
for (JsonObject record : records) {
// 只提取需要的欄位
const char* sitename = record["sitename"];
const char* county = record["county"];
const char* pm25 = record["pm2.5"];
const char* status = record["status"];
const char* date = record["datacreationdate"];
Serial.printf("站點: %s\n", sitename ? sitename : "N/A");
Serial.printf("縣市: %s\n", county ? county : "N/A");
Serial.printf("PM2.5: %s\n", pm25 ? pm25 : "N/A");
Serial.printf("狀態: %s\n", status ? status : "N/A");
Serial.printf("時間: %s\n", date ? date : "N/A");
Serial.println("------------");
}
} else {
Serial.print("JSON 解析失敗: ");
Serial.println(error.c_str());
}
} else {
Serial.printf("HTTP 錯誤: %d\n", httpCode);
}
http.end();
}
void loop() {
// 每 10 分鐘更新一次
delay(600000);
getAirQuality();
}