作品MOD.01 / 03

Singapore Bus Companion

一台 CoreS3 巴士到站显示器,追踪指定的新加坡巴士并在适当时间发出提醒。

硬件2026已发布

MOD.01 / 记录 03

只关注此刻真正要搭乘的那一班车,而不是把全城路线都塞进屏幕。

CoreS3 连接 Wi-Fi 后,读取指定车站与路线的三班到站时间;当下一班车进入设定提醒范围时,只响一次。公开程序只保留占位符,网站不会储存 Wi-Fi 密码或 LTA 密钥。

设备
M5Stack CoreS3
平台
Arduino + LTA DataMall v3
代码
安全公开版程序

[ 01 / 系统结构 ]

03 项功能

01

实时到站

通过 LTA DataMall Bus Arrival v3 读取未来三班车。

02

一次清楚提醒

进入提醒范围后响一次,下一班车出现时才重新启用。

03

一眼看懂

显示巴士路线、车站、到站时间与拥挤程度。

[ 02 / ARDUINO ]

到站请求与提醒循环

节录展示核心请求;完整下载版还包括新加坡时间转换、CoreS3 显示、断线重连与扬声器提示音。

  1. 01选择 M5CoreS3,并安装 M5Unified 与 ArduinoJson。
  2. 02只在自己的电脑上填写三个凭证占位符。
  3. 03设定五位数车站编号、巴士路线与提醒分钟数。
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();
}

未发现真实凭证 · 尚未在本站进行硬件编译验证