实时到站
通过 LTA DataMall Bus Arrival v3 读取未来三班车。
一台 CoreS3 巴士到站显示器,追踪指定的新加坡巴士并在适当时间发出提醒。

MOD.01 / 记录 03
只关注此刻真正要搭乘的那一班车,而不是把全城路线都塞进屏幕。
CoreS3 连接 Wi-Fi 后,读取指定车站与路线的三班到站时间;当下一班车进入设定提醒范围时,只响一次。公开程序只保留占位符,网站不会储存 Wi-Fi 密码或 LTA 密钥。
[ 01 / 系统结构 ]
03 项功能
通过 LTA DataMall Bus Arrival v3 读取未来三班车。
进入提醒范围后响一次,下一班车出现时才重新启用。
显示巴士路线、车站、到站时间与拥挤程度。
[ 02 / ARDUINO ]
节录展示核心请求;完整下载版还包括新加坡时间转换、CoreS3 显示、断线重连与扬声器提示音。
const char* WIFI_NAME = "YOUR_WIFI_NAME";
const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD";
const char* LTA_ACCOUNT_KEY = "YOUR_LTA_ACCOUNT_KEY";
const char* BUS_STOP_CODE = "83139";
const char* BUS_SERVICE = "15";
const int ALERT_MINUTES = 3;
const unsigned long UPDATE_INTERVAL_MS = 20000;
void updateBusArrival() {
String url =
"https://datamall2.mytransport.sg/"
"ltaodataservice/v3/BusArrival"
"?BusStopCode=" + String(BUS_STOP_CODE) +
"&ServiceNo=" + String(BUS_SERVICE);
WiFiClientSecure secureClient;
secureClient.setInsecure(); // Prototype only; install a CA for production.
HTTPClient http;
if (!http.begin(secureClient, url)) return;
http.addHeader("AccountKey", LTA_ACCOUNT_KEY);
http.addHeader("accept", "application/json");
if (http.GET() != HTTP_CODE_OK) {
http.end();
return;
}
DynamicJsonDocument document(8192);
if (deserializeJson(document, http.getStream())) {
http.end();
return;
}
JsonArray services = document["Services"].as<JsonArray>();
if (!services.isNull() && services.size() > 0) {
const char* arrival = services[0]["NextBus"]["EstimatedArrival"] | "";
const int minutes = minutesUntil(arrival);
drawArrival(minutes);
if (minutes >= 0 && minutes <= ALERT_MINUTES && !alarmGiven) {
soundReminder();
alarmGiven = true;
}
}
http.end();
}未发现真实凭证 · 尚未在本站进行硬件编译验证