#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <RTClib.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
RTC_DS3231 rtc;
const char *ssid = "Wokwi-GUEST";
const char *password = "";
#define TFT_CS 5
#define TFT_DC 14
#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 320
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// 中文到英文的映射表
const char *translateSite(const String &chineseSite)
{
if (chineseSite == "鳳山溪出海口外海測站") return "Fengshan River Estuary Offshore Station";
else if (chineseSite == "新豐掩埋場外海測站") return "Xinfeng Landfill Offshore Station";
else if (chineseSite == "新豐溪出海口外海測站") return "Xinfeng River Estuary Offshore Station";
else if (chineseSite == "坡頭漁港港區內") return "Potou Fishing Port Inner Harbor Area";
// 中文站點與英文站點的對應
else return "Unknown Site";
}
void setup()
{
Serial.begin(115200);
// 連接Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi 連接成功");
// 初始化ILI9341顯示器
tft.begin();
// 初始化RTC
if (!rtc.begin())
{
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
}
void loop()
{
DateTime now = rtc.now();
// 在串行端口上顯示日期和時間
Serial.print("日期/時間 (RTC):");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.println(now.second(), DEC);
// 等待Wi-Fi連接
if (WiFi.status() == WL_CONNECTED)
{
HTTPClient http;
// 進行HTTP請求
http.begin("https://ws.hsinchu.gov.tw/001/Upload/1/opendata/8774/2261/d928323e-b9cc-4bed-8a0b-e1132e44a239.json");
int httpCode = http.GET();
if (httpCode > 0)
{
if (httpCode == HTTP_CODE_OK)
{
String payload = http.getString();
// 解析JSON
DynamicJsonDocument doc(16384);
DeserializationError error = deserializeJson(doc, payload);
if (!error)
{
for (int i = 0; i < doc.size(); i++)
{
JsonObject record = doc[i].as<JsonObject>();
String chineseSite = record["監測站"];
String site = translateSite(chineseSite);
float suspendedSolids = record["懸浮固體"].as<float>();
float dissolvedOxygen = record["溶氧量"].as<float>();
float salinity = record["鹽度"].as<float>();
float pH = record["pH"].as<float>();
// 在ILI9341顯示器上顯示信息
displayInfo(site, suspendedSolids, dissolvedOxygen, salinity, pH, now);
delay(10000); // 顯示5秒後進行下一次更新
}
}
else
{
Serial.print("解析JSON失敗: ");
Serial.println(error.c_str());
}
}
}
else
{
Serial.printf("HTTP請求失敗,錯誤: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
delay(10000);
}
void displayInfo(String site, float suspendedSolids, float dissolvedOxygen, float salinity, float pH, DateTime now)
{
// 在ILI9341顯示器上顯示信息
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(0, 20);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.print("Site: ");
tft.println(site);
tft.print("Suspended Solids: ");
tft.println(suspendedSolids);
tft.print("Dissolved Oxygen: ");
tft.println(dissolvedOxygen);
tft.print("Salinity: ");
tft.println(salinity);
tft.print("pH: ");
tft.println(pH);
// 顯示日期和時間
tft.setCursor(0, 180); // 設定日期和時間顯示位置
tft.setTextSize(2);
tft.print(now.year(), DEC);
tft.print("/");
tft.print(now.month(), DEC);
tft.print("/");
tft.print(now.day(), DEC);
tft.print(" ");
tft.print(now.hour(), DEC);
tft.print(":");
tft.print(now.minute(), DEC);
tft.print(":");
tft.print(now.second(), DEC);
}