2026年2月21日 星期六

ESP32 Telegram SendMessageFromEvent

 ESP32 Telegram SendMessageFromEvent

當 ESP32 開機或重啟完成並連上網路後,主動發送一則通知訊息給指定的 Telegram 使用者。


/*******************************************************************
    A telegram bot that sends you a message when ESP
    starts up
 *******************************************************************/
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

// Wifi network station credentials
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Telegram BOT Token (Get from Botfather)
#define BOT_TOKEN "7738940254:AAHbrWu9ovb1BKPQyWsbNSjNxfCGCrEWU-o"

// Use @myidbot (IDBot) to find out the chat ID of an individual or a group
// Also note that you need to click "start" on a bot before it can
// message you
#define CHAT_ID "7965218469"

WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);

void setup() {
  Serial.begin(115200);
  Serial.println();

 // attempt to connect to Wifi network:
  Serial.print("Connecting to Wifi SSID ");
  Serial.print(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nWiFi connected. IP address: ");
  Serial.println(WiFi.localIP());

  Serial.print("Retrieving time: ");
  configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP
  time_t now = time(nullptr);
  while (now < 24 * 3600)
  {
    Serial.print(".");
    delay(100);
    now = time(nullptr);
  }
  Serial.println(now);

  bot.sendMessage(CHAT_ID, "Bot started up", "");
}

void loop() {

}

這段程式碼的邏輯非常簡單且實用,它的主要目的是:當 ESP32 開機或重啟完成並連上網路後,主動發送一則通知訊息給指定的 Telegram 使用者。

這在遠端監控設備時非常有用,能讓你第一時間知道設備是否因為斷電後重啟。


1. 關鍵定義:指定對象

這段程式碼與前面幾則範例最大的不同點在於:

C++
#define CHAT_ID "7965218469"
  • CHAT_ID:這是你的個人 Telegram 帳號 ID(或是群組 ID)。

  • 之前的範例是「收到誰的訊息就回給誰」,但這個程式是主動發送,所以必須事先寫死(Hardcode)接收者的 ID。

  • 註記:你可以透過 Telegram 上的 @myidbot 機器人來查到自己的 CHAT_ID


2. 初始化設定:setup()

這個程式的核心全部都在 setup() 內,因為它只需要在開機時執行一次。

  • 網路與憑證設定

    • 連接 WiFi 並載入 Telegram 的 SSL 根憑證 (TELEGRAM_CERTIFICATE_ROOT),確保 HTTPS 連線安全。

  • 網路對時 (NTP)

    • configTime(0, 0, "pool.ntp.org")

    • 重要性:Telegram 伺服器會檢查訊息的時間戳記,如果 ESP32 的時間與網路時間相差太大,訊息會發送失敗。

  • 發送啟動訊息

    C++
    bot.sendMessage(CHAT_ID, "Bot started up", "");
    
    • 當上述連線與對時都完成後,機器人會立即向 7965218469 發送「Bot started up」這段文字。


3. 主迴圈:loop()

C++
void loop() {
  // 這裡是空的
}
  • 因為這個範例的目的只是「開機通知」,不需要持續檢查新訊息,所以 loop() 保持空白。這意味著機器人不會回應你傳給它的任何話。


4. 運作流程圖解

  1. 電源接通:ESP32 啟動。

  2. WiFi 連線:取得 Wokwi-GUEST 的 IP 位址。

  3. 時間同步:向 NTP 伺服器要求目前時間。

  4. 安全握手:使用 SSL 憑證與 Telegram 建立 HTTPS 連線。

  5. 主動出擊:呼叫 sendMessage 將啟動成功的訊息推送到你的手機。

  6. 進入休眠/閒置:完成任務,不再執行任何動作。


💡 實戰建議

這個程式雖然簡單,但它是**「警報系統」**的基礎。你可以稍微修改這段程式,例如:

  • 跌倒偵測:如果偵測到感測器數值異常,就執行 bot.sendMessage

  • 低電量警告:當電池電量低於 20% 時,主動傳訊通知你充電。

沒有留言:

張貼留言

ESP32 Telegram 指令選單(Bot Commands)

ESP32 Telegram 指令選單(Bot Commands)  /*******************************************************************  ***********************************...