Panduan · 13 mnt baca

Tutorial Bot Telegram ESP32: Notifikasi, Kendali LED dan Relay

Buat bot Telegram ESP32: token BotFather, chat ID, instalasi UniversalTelegramBot, notifikasi gerakan dan gas, kendali relay lewat perintah, dan bot yang hanya membalas kamu.

Bot Telegram ESP32 membuat board ESP32 di rumahmu bisa mengirim pesan ke ponselmu dan menjalankan perintah yang kamu kirim balik. Begitu ada gerakan di pintu atau gas di dapur, notifikasi langsung masuk ke sakumu; ketik “/ac” dan relay menyalakan lampu, ketik “/kapat” dan lampu mati. Kamu tidak perlu membuat aplikasi ponsel sendiri, membuka port di router, atau membayar layanan cloud: Bot API Telegram yang gratis dan Wi-Fi bawaan ESP32 sudah cukup.

Di panduan ini kamu akan membangun sistem yang berfungsi dari nol: membuat bot dengan BotFather dan mendapatkan token-nya, menemukan chat ID-mu sendiri, menginstal library UniversalTelegramBot dan ArduinoJson, lalu mengirim pesan pertamamu dari ESP32. Setelah itu kamu menambahkan notifikasi gerakan dan gas dengan sensor PIR dan sensor gas MQ-2, serta kendali LED dan relay lewat perintah Telegram. Kita juga membahas cara membuat bot hanya menjawab ID-mu, pengaturan sertifikat, perbedaan di ESP8266 dan Raspberry Pi Pico W, dan error yang paling sering muncul satu per satu.

Board pengembangan ESP32 yang bekerja sebagai bot Telegram
Berkat Wi-Fi bawaannya, ESP32 terhubung langsung ke server Telegram; tidak perlu modul tambahan atau gateway.

Apa itu bot Telegram ESP32 dan bagaimana cara kerjanya?

Di Telegram, bot adalah akun khusus yang dijalankan oleh program, bukan oleh manusia; di proyek kita, program itu dijalankan oleh ESP32. ESP32 dan ponselmu tidak pernah terhubung langsung satu sama lain; keduanya berbicara dengan server Telegram. Ketika kamu mengetik “/ac” ke bot di ponselmu, pesan itu menunggu di server. Setiap detik ESP32 mengirim permintaan HTTPS terenkripsi (getUpdates) ke api.telegram.org untuk bertanya “ada pesan baru untukku?”, mengambil pesannya, lalu menjalankannya. Untuk mengirim notifikasi, ESP32 membuat permintaan sendMessage ke arah sebaliknya. Karena koneksi selalu dibuka oleh ESP32, kamu tidak butuh port forwarding atau IP statis di router; board-nya bekerja di jaringan Wi-Fi 2,4 GHz mana pun yang punya akses internet.

IstilahFungsinyaContoh
BotFatherBot resmi Telegram untuk membuat dan mengelola bot/newbot, /setcommands, /revoke (perintah BotFather)
Token botKata sandi bot; kodemu terhubung ke Telegram dengan token ini1234567890:AAE... (angka, titik dua, deretan karakter panjang)
Chat IDNomor orang atau grup yang menjadi tujuan pesanOrang: 123456789, grup: -1001234567890
getUpdatesMengambil pesan baru yang dikirim ke bot dari serverbot.getUpdates(...)
sendMessageMengirim pesan ke chat ID yang ditentukanbot.sendMessage(CHAT_ID, "Halo")
PerintahPesan pendek yang diawali / dan dipahami bot/ac, /kapat, /durum

Kenapa Telegram? Perbandingan dengan cara notifikasi lain

MetodeKelebihanKekuranganPaling cocok untuk
Bot TelegramGratis, notifikasi instan, perintah dua arah, tidak perlu membuka portTidak ada grafik atau dashboard siap pakaiAlarm dan kendali jarak jauh sederhana
Blynk IoTDashboard siap pakai dengan tombol, gauge, dan grafikBatas pesan dan perangkat di paket gratisDashboard pemantauan sensor
Email (SMTP)Bisa di semua ponsel, bisa membawa laporan panjangAda jeda, sulit menerima perintahLaporan harian
SMS (SIM800L)Tidak butuh Wi-Fi atau internetBiaya kartu SIM dan SMS, modul tambahanPondok atau gudang tanpa internet
Web server ESP32Sepenuhnya lokal dan gratisBiasanya hanya bisa diakses dari jaringan yang sama, tanpa notifikasiPanel kendali di dalam rumah

Singkatnya, Telegram adalah pilihan paling mudah dan paling murah untuk proyek bertipe “kabari aku kalau ada sesuatu, dan lakukan ini kalau aku kirim perintah”. Kalau kamu ingin memantau data sensor lewat grafik, tutorial Blynk ESP32 mungkin lebih cocok; kalau kamu butuh notifikasi dari tempat tanpa Wi-Fi, lihat panduan modul GSM SIM800L.

Langkah 1: Buat bot dengan BotFather dan dapatkan token

  1. Buka Telegram di ponsel atau komputermu, ketik BotFather di kotak pencarian, dan pilih akun resmi dengan tanda centang biru di samping namanya. Hati-hati dengan akun palsu yang namanya mirip.
  2. Ketuk Start (Mulai) dan kirim perintah /newbot.
  3. BotFather pertama-tama menanyakan nama tampilan bot; ketik nama apa saja yang kamu suka, misalnya “Alarm Rumah”.
  4. Berikutnya BotFather meminta username. Username harus unik, hanya memakai huruf Latin, angka, dan garis bawah, serta diakhiri bot, misalnya alarm_rumahku_bot. Kalau sudah dipakai orang lain, tambahkan angka di belakangnya dan coba lagi.
  5. BotFather membalas dengan “Done! Congratulations on your new bot.” beserta link ke bot-mu dan token-nya. Token berbentuk seperti 1234567890:AAE...: angka, titik dua, lalu deretan karakter yang panjang. Salin semuanya dan simpan di tempat yang aman.
  6. Ketuk link yang dikirim BotFather untuk membuka bot-mu, lalu tekan Start. Langkah ini wajib: di Telegram, bot tidak bisa mengirim pesan pertama ke pengguna, jadi kamulah yang selalu harus memulai percakapan.
Token adalah kunci bot-mu: siapa pun yang mendapatkannya bisa membaca pesan yang dikirim ke bot-mu, mengirim pesan atas nama bot, dan mengambil perintah untuk ESP32-mu lebih dulu sebelum ESP32 sempat membacanya. Jangan pernah membagikan kode yang berisi token di forum, di screenshot, atau di repositori GitHub publik. Kalau kamu curiga token-nya bocor, pakai perintah /revoke di BotFather untuk membatalkan token lama, ambil token baru, lalu upload kodemu lagi.

Langkah 2: Cara menemukan chat ID Telegram-mu

Token bot menjawab pertanyaan “bot yang mana?”, sedangkan chat ID menjawab “pesannya untuk siapa?”. Setiap pengguna, grup, dan channel Telegram punya ID angka yang tetap, dan ID ini tidak sama dengan username-mu yang diawali @. Ada tiga cara mudah untuk menemukan chat ID-mu sendiri:

  1. Dengan bot ID: Cari bot ID di Telegram seperti @userinfobot dan tekan Start; bot itu mengirimkan nomormu di baris Id. Bot-bot ini bukan milikmu, mereka hanya menampilkan ID-mu.
  2. Dengan browser: Pertama, kirim pesan apa saja ke bot-mu sendiri. Lalu buka api.telegram.org/botTOKEN/getUpdates di browser komputermu (tempel token-mu sendiri di posisi TOKEN dan biarkan kata “bot” di depannya). Di teks yang muncul, angka pada "chat":{"id":123456789 adalah chat ID-mu. Kalau halaman menampilkan daftar result yang kosong, kirim pesan lagi ke bot lalu muat ulang halamannya.
  3. Dengan ESP32: Setelah kamu meng-upload kode perintah di bawah, ID siapa pun yang tidak berwenang dicetak ke Serial Monitor di baris “unauthorized ID”. Kalau ingin menambahkan anggota keluarga, minta dia mengirim pesan ke bot lalu baca nomornya di sana.
Kalau bot akan kamu pakai di grup keluarga, tambahkan bot ke grup, kirim satu pesan di sana, lalu cek halaman getUpdates lagi: ID grup diawali tanda minus, dan ID supergroup diawali -100. Lupa tanda minus adalah penyebab paling umum error “chat not found”. Dalam mode privasi bawaan, bot tidak membaca obrolan grup; bot hanya melihat perintah berawalan / yang ditujukan kepadanya, dan itu sudah cukup untuk bot yang bekerja dengan perintah.

Langkah 3: Instal UniversalTelegramBot dan ArduinoJson

  1. Kalau paket board ESP32 belum terinstal di Arduino IDE, instal dulu; langkah-langkahnya ada di Apa Itu ESP32?.
  2. Buka Tools > Manage Libraries, ketik UniversalTelegramBot di kotak pencarian, lalu instal library buatan Brian Lough. Kode di panduan ini dikompilasi dengan UniversalTelegramBot 1.3.0, ArduinoJson 7, dan paket board ESP32 versi 2.0.11.
  3. Kalau installer menanyakan dependensi, pilih Install all; kalau tidak, cari ArduinoJson di jendela yang sama dan instal library milik Benoit Blanchon secara terpisah.
  4. Di File > Examples > UniversalTelegramBot > ESP32 kamu akan menemukan contoh siap pakai seperti FlashLED; kode di panduan ini adalah versi sederhananya dengan tambahan keamanan.

UniversalTelegramBot ditulis dengan gaya ArduinoJson versi 6, tetapi tetap terkompilasi dengan baik di ArduinoJson 7. Kalau kamu menyalakan warning compiler di Arduino IDE, kamu akan melihat baris seperti “'DynamicJsonDocument' is deprecated: use JsonDocument instead”; ini warning, bukan error, dan program berjalan normal. Kalau mengalami masalah ketika menginstal library, cek panduan Cara Instal Library Arduino.

Komponen dan pengkabelan

Untuk proyek lengkapnya kamu butuh board pengembangan ESP32, sensor gerak PIR HC-SR501, modul sensor gas MQ-2, modul relay 5 V, satu resistor 10 kΩ dan satu resistor 20 kΩ, breadboard, serta kabel jumper. Untuk LED, kita memakai LED biru bawaan ESP32 di GPIO 2. Untuk mencoba dua langkah pertama, kamu cukup butuh ESP32 dan kabel USB; sensornya bisa ditambahkan belakangan.

Board ESP32
Board ESP32
Sensor PIR HC-SR501
Sensor PIR HC-SR501
Sensor gas MQ-2
Sensor gas MQ-2
Modul relay
Modul relay
KoneksiESP32ESP8266 (NodeMCU)Raspberry Pi Pico W
PIR VCCVIN (5V)VIN (5V)VBUS (5V)
PIR OUTGPIO 27D5 (GPIO 14)GP16
MQ-2 VCCVIN (5V)VIN (5V)VBUS (5V)
MQ-2 AO (lewat pembagi 10 kΩ / 20 kΩ)GPIO 34A0GP26 (ADC0)
Relay VCCVIN (5V)VIN (5V)VBUS (5V)
Relay INGPIO 26D1 (GPIO 5)GP15
LEDGPIO 2 (bawaan)D4 (bawaan, menyala dengan LOW)"LED" (bawaan)
Semua GNDGNDGNDGND
Pin ESP32, ESP8266, dan Pico bekerja pada 3,3 V. Kalau modul MQ-2 diberi daya 5 V, output AO-nya bisa naik sampai 5 V, jadi rakit sebuah pembagi tegangan: hubungkan AO ke pin analog lewat 10 kΩ, dan pin analog ke GND lewat 20 kΩ. Dengan begitu 5 V turun menjadi sekitar 3,3 V. Kalau relay akan kamu pakai untuk menyalakan beban listrik PLN 230 V (220 V di Indonesia), selalu pasang kabelnya dengan steker dicabut dan minta bantuan orang dewasa; detailnya ada di Apa Itu Modul Relay di Arduino?.

Perhatikan juga catu dayanya: pemanas MQ-2 saja menarik sekitar 150 mA dan kumparan relay sekitar 70 mA, sementara ESP32 bisa melonjak sebentar sampai 250 mA ketika mengirim data lewat Wi-Fi. Port USB komputer tidak selalu sanggup memberi total arus sebesar itu, dan board bisa reboot tepat ketika mengirim pesan. Pakai adaptor 5 V minimal 1 A dan kabel yang bagus; kalau masalahnya tetap ada, baca brownout dan Guru Meditation ESP32. Kamu bisa melihat semua pin board-mu di alat pinout.

Tes pertama: kirim pesan dari ESP32 ke Telegram

Sebelum lanjut ke sensor, kita pastikan dulu token dan chat ID-nya benar dengan sketch yang paling sederhana. Di kode di bawah, ganti baris nama Wi-Fi, kata sandi, BOT_TOKEN, dan CHAT_ID dengan datamu sendiri, lalu upload ke board. Setelah itu buka Serial Monitor dengan 115200 baud:

C++ (Arduino IDE)
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5
6const char* WIFI_SSID = "AgAdi";          // Wi-Fi adın (yalnız 2,4 GHz) / your Wi-Fi name (2.4 GHz only)
7const char* WIFI_PASS = "Sifre123";       // Wi-Fi şifren / your Wi-Fi password
8#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"   // BotFather'ın verdiği token / token from BotFather
9#define CHAT_ID   "123456789"             // kendi Telegram ID'n / your own Telegram ID
10
11WiFiClientSecure client;                  // şifreli (HTTPS) bağlantı / encrypted (HTTPS) connection
12UniversalTelegramBot bot(BOT_TOKEN, client);
13
14void setup() {
15  Serial.begin(115200);
16  WiFi.mode(WIFI_STA);
17  WiFi.begin(WIFI_SSID, WIFI_PASS);
18  Serial.print("Wi-Fi'ye baglaniyor / connecting to Wi-Fi");
19  while (WiFi.status() != WL_CONNECTED) {
20    delay(500);
21    Serial.print(".");
22  }
23  Serial.println();
24  Serial.println(WiFi.localIP());
25
26  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);   // api.telegram.org kök sertifikası / root certificate of api.telegram.org
27
28  if (bot.sendMessage(CHAT_ID, "Merhaba! ESP32 çevrimiçi / Hello! ESP32 is online")) {
29    Serial.println("Mesaj gonderildi / message sent");
30  } else {
31    Serial.println("Mesaj gonderilemedi / message failed");
32  }
33}
34
35void loop() {
36}

Dalam beberapa detik bot-mu seharusnya mengirim “Hello! ESP32 is online” kepadamu di Telegram, dan Serial Monitor menampilkan “Mesaj gonderildi / message sent”. sendMessage() mengembalikan true ketika pesan terkirim; kalau kamu melihat “message failed”, masalahnya ada di koneksi Wi-Fi, token, chat ID, atau pengaturan sertifikat. Sebelum menyalahkan kode, buka api.telegram.org/botTOKEN/getMe di browser: dengan token yang valid kamu akan melihat "ok":true dan nama bot-mu, dengan token yang salah kamu akan melihat “Unauthorized”.

Pengaturan sertifikat: setCACert atau setInsecure?

Telegram hanya menerima HTTPS, karena itu kodenya memakai WiFiClientSecure, bukan WiFiClient biasa. Lewat koneksi terenkripsi, ESP32 harus memastikan server lawan bicaranya benar-benar api.telegram.org; caranya dengan memverifikasi sertifikat server terhadap sertifikat root di puncak rantai. UniversalTelegramBot sudah menyertakan sertifikat root ini, siap pakai, dengan nama TELEGRAM_CERTIFICATE_ROOT. Rantai sertifikat Telegram berujung pada Go Daddy Root Certificate Authority - G2, yang berlaku sampai akhir 2037; kalau suatu hari Telegram berganti penyedia sertifikat, library-nya juga perlu diperbarui.

PengaturanFungsinyaKeamananKapan dipakai
client.setCACert(TELEGRAM_CERTIFICATE_ROOT)Mengenkripsi koneksi dan memverifikasi identitas serverTinggiPengaturan yang disarankan, selalu
client.setInsecure()Mengenkripsi koneksi tetapi tidak mengecek identitas serverSedang: tidak akan sadar ada server palsu di tengahTes cepat untuk menyingkirkan kemungkinan masalah sertifikat
Tanpa keduanyaDi core ESP32 versi terbaru, koneksi tidak pernah terbentukTidak berfungsiJangan pernah: tidak ada pesan terkirim dan tidak ada error di Serial Monitor
ESP8266: setTrustAnchors(&cert)Padanannya di ESP8266; sertifikat diberikan sebagai X509ListTinggiNodeMCU dan Wemos D1 Mini; butuh waktu yang benar

Kendalikan LED dan relay dengan perintah Telegram (/ac, /kapat)

Sekarang kita buat bot-nya dua arah. Kode di bawah menanyakan pesan baru ke Telegram sekali setiap detik; kalau teksnya /ac (bahasa Turki untuk “nyala”), relay dan LED dinyalakan, /kapat (“mati”) mematikannya, /durum (“status”) melaporkan keadaan sekarang, dan /start mengirim daftar perintah. Kamu bisa mengganti nama perintahnya menjadi /on dan /off, tetapi ingat bahwa perintah Telegram hanya boleh berisi huruf Latin kecil, angka, dan garis bawah, dengan panjang maksimal 32 karakter. Perintah dengan huruf beraksen seperti “/aç” tidak dikenali sebagai perintah yang bisa diketuk.

C++ (Arduino IDE)
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5
6const char* WIFI_SSID = "AgAdi";
7const char* WIFI_PASS = "Sifre123";
8#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
9#define CHAT_ID   "123456789"                 // yalnız bu ID'ye yanıt verilir / only this ID gets answers
10
11const int LED_PIN  = 2;                       // çoğu DevKit'te dahili LED / onboard LED on most DevKits
12const int ROLE_PIN = 26;                      // röle modülünün IN pini / relay module IN pin
13const bool ROLE_AKTIF_LOW = true;             // çoğu modül LOW'da çeker / most modules switch on with LOW
14
15const unsigned long KONTROL_ARALIGI = 1000;   // Telegram'a saniyede bir sor / ask Telegram once per second
16unsigned long sonKontrol = 0;
17bool roleAcik = false;
18
19WiFiClientSecure client;
20UniversalTelegramBot bot(BOT_TOKEN, client);
21
22void roleYaz(bool acik) {
23  roleAcik = acik;
24  if (ROLE_AKTIF_LOW) digitalWrite(ROLE_PIN, acik ? LOW : HIGH);
25  else                digitalWrite(ROLE_PIN, acik ? HIGH : LOW);
26  digitalWrite(LED_PIN, acik ? HIGH : LOW);   // LED röle durumunu gösterir / LED mirrors the relay
27}
28
29void mesajlariIsle(int adet) {
30  for (int i = 0; i < adet; i++) {
31    String chatId = bot.messages[i].chat_id;
32    String metin  = bot.messages[i].text;
33
34    // Güvenlik: tanımadığın kişiye cevap verme / security: never answer strangers
35    if (chatId != CHAT_ID) {
36      Serial.println("Yetkisiz ID / unauthorized ID: " + chatId);
37      continue;
38    }
39
40    int at = metin.indexOf('@');              // gruptaki "/ac@bot_adi" -> "/ac" / "/ac@bot_name" in groups -> "/ac"
41    if (at > 0) metin = metin.substring(0, at);
42
43    if (metin == "/start") {
44      String yardim = "Merhaba " + bot.messages[i].from_name + "!\n";
45      yardim += "/ac - röleyi aç / relay ON\n";
46      yardim += "/kapat - röleyi kapat / relay OFF\n";
47      yardim += "/durum - son durum / status";
48      bot.sendMessage(chatId, yardim);
49    } else if (metin == "/ac") {
50      roleYaz(true);
51      bot.sendMessage(chatId, "Röle AÇIK / relay ON");
52    } else if (metin == "/kapat") {
53      roleYaz(false);
54      bot.sendMessage(chatId, "Röle KAPALI / relay OFF");
55    } else if (metin == "/durum") {
56      bot.sendMessage(chatId, roleAcik ? "Röle AÇIK / relay ON" : "Röle KAPALI / relay OFF");
57    } else {
58      bot.sendMessage(chatId, "Bilinmeyen komut, /start yaz / unknown command, send /start");
59    }
60  }
61}
62
63void setup() {
64  Serial.begin(115200);
65  pinMode(LED_PIN, OUTPUT);
66  pinMode(ROLE_PIN, OUTPUT);
67  roleYaz(false);                             // açılışta röle kapalı / relay off at boot
68
69  WiFi.mode(WIFI_STA);
70  WiFi.begin(WIFI_SSID, WIFI_PASS);
71  while (WiFi.status() != WL_CONNECTED) delay(500);
72  Serial.println(WiFi.localIP());
73
74  client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
75  bot.sendMessage(CHAT_ID, "Bot hazır, /start yaz / bot ready, send /start");
76}
77
78void loop() {
79  if (millis() - sonKontrol > KONTROL_ARALIGI) {
80    int adet = bot.getUpdates(bot.last_message_received + 1);   // yeni mesaj var mı? / any new messages?
81    while (adet) {
82      mesajlariIsle(adet);
83      adet = bot.getUpdates(bot.last_message_received + 1);
84    }
85    sonKontrol = millis();
86  }
87}
BarisFungsinya
bot.getUpdates(bot.last_message_received + 1)Meminta pesan setelah pesan terakhir yang sudah diproses dan mengembalikan jumlah pesan yang masuk; +1 mencegah pesan yang sama datang lagi
bot.messages[i].chat_idID chat asal pesan; balasan dikirim ke sana dan pengecekan keamanan memakai ID ini
bot.messages[i].text (teks pesan)Teks yang masuk; perintah kita bandingkan dengan teks ini
metin.indexOf('@')Memotong bagian @nama_bot yang ditambahkan Telegram ke perintah di grup
ROLE_AKTIF_LOWKebanyakan modul relay menyala dengan sinyal LOW; ubah menjadi false kalau modulmu menyala dengan HIGH
KONTROL_ARALIGISeberapa sering bertanya ke server; 1000 ms bereaksi cepat, 3000–5000 ms lebih ringan bagi jaringan

Keamanan: buat bot hanya menjawab ID-mu

Username bot di Telegram bersifat publik dan bisa dicari. Kalau seseorang menebak alarm_rumahku_bot atau melihatnya di screenshot lalu mengirim /ac, ESP32 tanpa pengecekan akan menuruti perintah itu juga. Karena itulah baris terpenting di kode adalah pengecekan chatId != CHAT_ID. Chat ID-mu tidak harus rahasia; perlindungannya datang dari Telegram sendiri yang memverifikasi siapa pengirim setiap pesan, dan tidak ada yang bisa memalsukan ID orang lain. Sama sekali tidak menjawab orang asing juga pilihan yang disengaja: selama bot diam, tidak ada yang bisa tahu bahwa bot itu sedang berjalan.

  • Pakai allowlist: simpan ID yang berwenang di sebuah array, abaikan semua pesan lain, dan tambahkan anggota keluarga satu per satu.
  • Cek orangnya di grup: di grup, chat ID adalah ID grup; kalau hanya orang tertentu yang boleh memberi perintah, bandingkan from_id, bukan chat_id.
  • Simpan token di file terpisah: taruh token dan kata sandi Wi-Fi di file seperti secrets.h, lalu jangan sertakan file itu ketika membagikan kodemu.
  • Lewati perintah lama: /ac yang dikirim ketika listrik padam tidak boleh jalan di momen tak terduga ketika board menyala lagi; pembersihan di awal program pada kode lengkap menangani hal ini.
  • Keadaan awal yang aman: mulai dengan relay mati setiap kali board menyala; ini sangat penting untuk beban seperti pemanas atau pompa.
  • Jangan serahkan tugas penting hanya pada bot: untuk hal seperti kunci pintu atau pemanas air, pikirkan akibat dari perintah yang salah dan tambahkan pesan konfirmasi atau batas waktu.

Alarm gerakan dan gas: proyek lengkap yang mengirim notifikasi Telegram

Sekarang kita gabungkan semuanya. Kode di bawah mengirim notifikasi Telegram berisi keterangan waktu ketika sensor PIR mendeteksi gerakan dan ketika pembacaan gas MQ-2 melewati ambang. Pada waktu yang sama, kode ini mendengarkan perintah /ac, /kapat, /alarm_ac, /alarm_kapat, dan /durum, menampilkan menu tombol yang tinggal diketuk di bagian bawah layar ketika kamu mengetik /start, dan menambahkan perintah-perintah itu ke tombol Menu Telegram. Untuk detail tiap sensor, lihat panduan sensor gerak PIR dan sensor gas MQ-2.

C++ (Arduino IDE)
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5#include <time.h>
6
7const char* WIFI_SSID = "AgAdi";
8const char* WIFI_PASS = "Sifre123";
9#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
10#define CHAT_ID   "123456789"                  // bildirimlerin gideceği ID / the ID that receives alerts
11
12// Komut verebilecek kişiler; aile üyesi eklemek için: { CHAT_ID, "222222222" }
13// People allowed to send commands; to add a family member: { CHAT_ID, "222222222" }
14const char* YETKILI[] = { CHAT_ID };
15const int YETKILI_SAYISI = sizeof(YETKILI) / sizeof(YETKILI[0]);
16
17const int LED_PIN  = 2;                        // dahili LED / onboard LED
18const int ROLE_PIN = 26;                       // röle modülü IN / relay module IN
19const int PIR_PIN  = 27;                       // PIR sensörü OUT / PIR sensor OUT
20const int GAZ_PIN  = 34;                       // MQ-2 AO, gerilim bölücü üzerinden / MQ-2 AO through a voltage divider
21const bool ROLE_AKTIF_LOW = true;              // çoğu modül LOW'da çeker / most modules switch on with LOW
22
23const int GAZ_ESIK = 1800;                     // temiz havadaki değere göre ayarla / tune it from your clean-air reading
24const int GAZ_FARK = 200;                      // histerezis payı / hysteresis margin
25const unsigned long HAREKET_BEKLEME = 60000;   // iki hareket bildirimi arası en az 60 sn / at least 60 s between motion alerts
26const unsigned long GAZ_ISINMA = 120000;       // MQ-2 ilk 2 dakika ısınır / MQ-2 warms up for the first 2 minutes
27const unsigned long KONTROL_ARALIGI = 1000;    // Telegram'a saniyede bir sor / poll Telegram once per second
28
29WiFiClientSecure client;
30UniversalTelegramBot bot(BOT_TOKEN, client);
31
32bool alarmKurulu = true;                       // hareket alarmı açık mı / is the motion alarm armed
33bool roleAcik = false;
34bool gazVar = false;
35unsigned long sonKontrol = 0;
36unsigned long sonHareket = 0;
37
38String saat() {                                // "14:05:31" biçiminde saat / time as "14:05:31"
39  struct tm t;
40  if (!getLocalTime(&t, 100)) return "--:--:--";
41  char buf[9];
42  strftime(buf, sizeof(buf), "%H:%M:%S", &t);
43  return String(buf);
44}
45
46bool yetkiliMi(const String& id) {
47  for (int i = 0; i < YETKILI_SAYISI; i++) {
48    if (id == YETKILI[i]) return true;
49  }
50  return false;
51}
52
53void roleYaz(bool acik) {
54  roleAcik = acik;
55  if (ROLE_AKTIF_LOW) digitalWrite(ROLE_PIN, acik ? LOW : HIGH);
56  else                digitalWrite(ROLE_PIN, acik ? HIGH : LOW);
57}
58
59String durumMetni() {
60  String s = "Röle / relay: ";
61  s += roleAcik ? "AÇIK / ON" : "KAPALI / OFF";
62  s += "\nAlarm: ";
63  s += alarmKurulu ? "KURULU / ARMED" : "KAPALI / DISARMED";
64  s += "\nGaz / gas: " + String(analogRead(GAZ_PIN));
65  s += "\nWi-Fi: " + String(WiFi.RSSI()) + " dBm";
66  return s;
67}
68
69void mesajlariIsle(int adet) {
70  for (int i = 0; i < adet; i++) {
71    String chatId = bot.messages[i].chat_id;
72    String metin  = bot.messages[i].text;
73
74    if (!yetkiliMi(chatId)) {                  // yabancıya sessiz kal / stay silent to strangers
75      Serial.println("Yetkisiz ID / unauthorized ID: " + chatId);
76      continue;
77    }
78    int at = metin.indexOf('@');               // "/ac@bot_adi" -> "/ac"
79    if (at > 0) metin = metin.substring(0, at);
80
81    if (metin == "/ac") {
82      roleYaz(true);
83      bot.sendMessage(chatId, "Röle AÇIK / relay ON");
84    } else if (metin == "/kapat") {
85      roleYaz(false);
86      bot.sendMessage(chatId, "Röle KAPALI / relay OFF");
87    } else if (metin == "/alarm_ac") {
88      alarmKurulu = true;
89      bot.sendMessage(chatId, "Hareket alarmı kuruldu / motion alarm armed");
90    } else if (metin == "/alarm_kapat") {
91      alarmKurulu = false;
92      bot.sendMessage(chatId, "Hareket alarmı kapatıldı / motion alarm disarmed");
93    } else if (metin == "/durum") {
94      bot.sendMessage(chatId, durumMetni());
95    } else {                                   // /start ve diğer her şey: tuş menüsü / /start and anything else: button menu
96      String klavye = "[[\"/ac\",\"/kapat\"],[\"/alarm_ac\",\"/alarm_kapat\"],[\"/durum\"]]";
97      bot.sendMessageWithReplyKeyboard(chatId, "Komut seç / choose a command", "", klavye, true);
98    }
99  }
100}
101
102void setup() {
103  Serial.begin(115200);
104  pinMode(LED_PIN, OUTPUT);
105  pinMode(ROLE_PIN, OUTPUT);
106  pinMode(PIR_PIN, INPUT);
107  roleYaz(false);                              // açılışta röle kapalı / relay off at boot
108
109  WiFi.mode(WIFI_STA);
110  WiFi.begin(WIFI_SSID, WIFI_PASS);
111  while (WiFi.status() != WL_CONNECTED) {
112    delay(500);
113    Serial.print(".");
114  }
115  Serial.println(WiFi.localIP());
116
117  client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // api.telegram.org kök sertifikası / root certificate of api.telegram.org
118  bot.maxMessageLength = 4000;                 // büyük mesajlarda takılmayı önler / prevents hanging on big messages
119  configTime(3 * 3600, 0, "pool.ntp.org");     // Türkiye UTC+3; kendi saat dilimini yaz / Turkey is UTC+3, set your own zone
120
121  // Telegram'daki Menü düğmesi; komutlar küçük harf, Türkçe karakter yok
122  // The Menu button in Telegram; commands are lowercase with no special letters
123  bot.setMyCommands("[{\"command\":\"ac\",\"description\":\"Röleyi aç\"},"
124                    "{\"command\":\"kapat\",\"description\":\"Röleyi kapat\"},"
125                    "{\"command\":\"alarm_ac\",\"description\":\"Hareket alarmını kur\"},"
126                    "{\"command\":\"alarm_kapat\",\"description\":\"Hareket alarmını kapat\"},"
127                    "{\"command\":\"durum\",\"description\":\"Durumu göster\"}]");
128
129  // Kart kapalıyken gelen eski komutları atla / skip old commands sent while the board was off
130  while (bot.getUpdates(bot.last_message_received + 1)) { }
131
132  bot.sendMessage(CHAT_ID, "Sistem açıldı / system started " + saat());
133}
134
135void loop() {
136  unsigned long simdi = millis();
137
138  // 1) Hareket alarmı / motion alarm
139  if (alarmKurulu && digitalRead(PIR_PIN) == HIGH && simdi - sonHareket > HAREKET_BEKLEME) {
140    sonHareket = simdi;
141    digitalWrite(LED_PIN, HIGH);
142    bot.sendMessage(CHAT_ID, "Hareket algılandı! / motion detected! " + saat());
143    digitalWrite(LED_PIN, LOW);
144  }
145
146  // 2) Gaz alarmı: ısınmadan sonra, susturulamaz / gas alarm: after warm-up, cannot be muted
147  if (simdi > GAZ_ISINMA) {
148    int gaz = analogRead(GAZ_PIN);             // 0-4095
149    if (!gazVar && gaz > GAZ_ESIK) {
150      gazVar = true;
151      bot.sendMessage(CHAT_ID, "GAZ ALARMI! / GAS ALARM! " + String(gaz) + " " + saat());
152    } else if (gazVar && gaz < GAZ_ESIK - GAZ_FARK) {
153      gazVar = false;
154      bot.sendMessage(CHAT_ID, "Gaz normale döndü / gas back to normal: " + String(gaz));
155    }
156  }
157
158  // 3) Telegram komutları / Telegram commands
159  if (simdi - sonKontrol > KONTROL_ARALIGI && WiFi.status() == WL_CONNECTED) {
160    int adet = bot.getUpdates(bot.last_message_received + 1);
161    while (adet) {
162      mesajlariIsle(adet);
163      adet = bot.getUpdates(bot.last_message_received + 1);
164    }
165    sonKontrol = millis();
166  }
167}
PengaturanNilaiPenjelasan
GAZ_ESIK1800Nilai ADC mentah dari 0 sampai 4095; tentukan dari hasil pembacaan di udara bersih
GAZ_FARK200Pembacaan harus turun sejauh ini di bawah ambang sebelum “kembali normal” dikirim; mencegah notifikasi bolak-balik di batas
HAREKET_BEKLEME60000 msMemberi jarak minimal 60 detik di antara dua notifikasi gerakan
GAZ_ISINMA120000 msMQ-2 memberi angka tinggi selama pemanasan; gas tidak dicek selama 2 menit pertama
KONTROL_ARALIGI1000 msSeberapa sering Telegram ditanya soal pesan baru
bot.maxMessageLength4000Respons terpanjang yang dibaca library; nilai bawaannya 1500

Dua alarm di kode ini sengaja bekerja dengan cara berbeda. Alarm gerakan dilindungi oleh cooldown (waktu jeda): sensor PIR terpicu berulang kali selama ada orang yang berjalan di ruangan, dan tanpa cooldown ponselmu akan dibanjiri puluhan pesan per menit. Karena penghitung cooldown mulai dari nol, notifikasi pertama paling cepat datang 60 detik setelah board menyala, dan ini juga cocok dengan waktu sekitar satu menit yang dibutuhkan sensor PIR untuk stabil setelah diberi daya. Alarm gas memakai histeresis: alarm memberi peringatan sekali ketika pembacaan melewati ambang, baru mengatakan “kembali normal” setelah turun 200 unit di bawahnya, dan demi keamanan tidak bisa dibisukan dengan /alarm_kapat. Telegram juga tidak mengizinkan pesan yang terlalu sering: kalau kamu mencoba mengirim lebih dari satu pesan per detik ke chat yang sama, atau lebih dari 20 pesan per menit ke grup, kamu akan mendapat error “Too Many Requests: retry after”.

Tentukan GAZ_ESIK dengan mengukur, bukan menebak: nyalakan board di udara bersih selama 5–10 menit, kirim /durum di Telegram, lalu catat nilai gas yang dikembalikan. Pasang ambangnya beberapa ratus unit di atas nilai itu. Variabel bot.longPoll juga perlu kamu ketahui: kalau diberi nilai seperti 20, getUpdates menunggu pesan baru hingga 20 detik, sehingga perintah dijawab seketika, tetapi selama waktu itu loop() tertahan dan sensor tidak dibaca. Di proyek alarm, biarkan longPoll bernilai 0.
MQ-2 adalah sensor untuk belajar dan hobi, bukan detektor gas bersertifikat, dan tidak ada notifikasi yang datang ketika Wi-Fi atau internet mati. Jangan pernah memakainya sebagai satu-satunya perlindungan dari kebocoran gas di rumah; pasang detektor komersial yang memenuhi standar, dan anggap proyek ini sebagai sistem peringatan tambahan di sampingnya.

Bot Telegram di ESP8266 (NodeMCU)

Library yang sama juga bekerja di board ESP8266 NodeMCU dan Wemos D1 Mini; logika perintah dan alarmnya persis sama, hanya bagian koneksinya yang berubah. Kamu memakai ESP8266WiFi.h sebagai ganti WiFi.h, memberikan sertifikat root sebagai X509List ke setTrustAnchors(), dan karena ESP8266 mengecek tanggal berlaku sertifikat, waktu harus diambil lewat NTP sebelum terhubung. Tanpa waktu yang benar, setiap koneksi gagal tanpa pesan apa pun. LED bawaan NodeMCU ada di pin D4 dan menyala dengan LOW, dan hanya ada satu input analog, A0.

C++ (Arduino IDE)
1#include <ESP8266WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5#include <time.h>
6
7const char* WIFI_SSID = "AgAdi";
8const char* WIFI_PASS = "Sifre123";
9#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
10#define CHAT_ID   "123456789"
11
12X509List cert(TELEGRAM_CERTIFICATE_ROOT);      // ESP8266'da kök sertifika böyle verilir / how ESP8266 takes the root certificate
13WiFiClientSecure client;
14UniversalTelegramBot bot(BOT_TOKEN, client);
15
16void setup() {
17  Serial.begin(115200);
18  configTime(0, 0, "pool.ntp.org");            // sertifika kontrolü için saat şart / the clock is needed to check the certificate
19  client.setTrustAnchors(&cert);
20
21  WiFi.mode(WIFI_STA);
22  WiFi.begin(WIFI_SSID, WIFI_PASS);
23  while (WiFi.status() != WL_CONNECTED) delay(500);
24
25  time_t simdi = time(nullptr);                // NTP saatini bekle / wait for the NTP time
26  while (simdi < 24 * 3600) {
27    delay(100);
28    simdi = time(nullptr);
29  }
30  bot.sendMessage(CHAT_ID, "ESP8266 çevrimiçi / ESP8266 is online");
31}
32
33void loop() {
34}

Bot Telegram dengan Raspberry Pi Pico W dan MicroPython

Raspberry Pi Pico W tidak butuh library terpisah; kamu bisa mengirim permintaan langsung ke Bot API Telegram dengan modul requests dari MicroPython. Kode di bawah mengirim notifikasi ketika gerakan terdeteksi, menyalakan dan mematikan relay di GP15 serta LED bawaan board dengan perintah /ac dan /kapat, dan hanya menjawab chat ID-mu. Flash MicroPython versi terbaru ke Pico W dengan Thonny, lalu simpan kodenya sebagai main.py. Modul requests di MicroPython mengenkripsi koneksi tetapi tidak memverifikasi sertifikat server, jadi tingkat keamanannya sama dengan setInsecure() di ESP32.

MicroPython
1import network, time
2import requests
3from machine import Pin
4
5WIFI_SSID = "AgAdi"                    # Wi-Fi adın / your Wi-Fi name
6WIFI_PASS = "Sifre123"                 # Wi-Fi şifren / your Wi-Fi password
7TOKEN = "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
8CHAT_ID = 123456789                    # sayı olarak yaz / write it as a number
9API = "https://api.telegram.org/bot" + TOKEN
10
11led = Pin("LED", Pin.OUT)              # Pico W dahili LED / Pico W onboard LED
12role = Pin(15, Pin.OUT, value=1)       # aktif LOW röle kapalı başlar / active-LOW relay starts off
13pir = Pin(16, Pin.IN)                  # PIR OUT
14
15wlan = network.WLAN(network.STA_IF)
16wlan.active(True)
17wlan.connect(WIFI_SSID, WIFI_PASS)
18while not wlan.isconnected():
19    time.sleep(0.5)
20print("IP:", wlan.ifconfig()[0])
21
22def gonder(metin):
23    try:
24        r = requests.post(API + "/sendMessage", json={"chat_id": CHAT_ID, "text": metin})
25        r.close()
26    except Exception as e:
27        print("Gonderilemedi / send failed:", e)
28
29def yeni_mesajlar(offset):
30    try:
31        r = requests.get(API + "/getUpdates?timeout=0&limit=5&offset=%d" % offset)
32        sonuc = r.json().get("result", [])
33        r.close()
34        return sonuc
35    except Exception as e:
36        print("Okunamadi / read failed:", e)
37        return []
38
39# Kart kapalıyken gelen eski komutları atla / skip old commands sent while the board was off
40offset = 0
41eski = yeni_mesajlar(offset)
42while eski:
43    offset = eski[-1]["update_id"] + 1
44    eski = yeni_mesajlar(offset)
45
46gonder("Pico W çevrimiçi / Pico W is online")
47son_hareket = time.ticks_ms()          # ilk 60 sn PIR dengelenir / the PIR settles in the first 60 s
48
49while True:
50    if pir.value() and time.ticks_diff(time.ticks_ms(), son_hareket) > 60000:
51        son_hareket = time.ticks_ms()
52        gonder("Hareket algılandı! / motion detected!")
53
54    for u in yeni_mesajlar(offset):
55        offset = u["update_id"] + 1
56        mesaj = u.get("message", {})
57        if mesaj.get("chat", {}).get("id") != CHAT_ID:     # yalnız sana yanıt ver / answer only you
58            continue
59        komut = mesaj.get("text", "").split("@")[0]
60        if komut == "/ac":
61            role.value(0)              # aktif LOW: 0 = açık / active LOW: 0 = on
62            led.on()
63            gonder("Röle AÇIK / relay ON")
64        elif komut == "/kapat":
65            role.value(1)
66            led.off()
67            gonder("Röle KAPALI / relay OFF")
68        elif komut == "/durum":
69            gonder("Röle / relay: " + ("AÇIK / ON" if role.value() == 0 else "KAPALI / OFF"))
70    time.sleep(1)

Ide proyek bot Telegram ESP32

  • Alarm pintu dan jendela: pakai reed switch atau sensor PIR untuk mengirim pesan ke ponselmu ketika ada gerakan selagi rumah kosong.
  • Kamera keamanan dengan foto: ambil foto dengan ESP32-CAM ketika gerakan terdeteksi lalu kirim ke Telegram; langkah-langkahnya ada di panduan foto ESP32-CAM ke Telegram.
  • Pemantau ruangan dan rumah kaca: dapatkan peringatan ketika suhu yang diukur DHT11 melewati batas, dan minta pembacaan terkini dengan /durum.
  • Pengingat menyiram tanaman: dapatkan notifikasi ketika sensor kelembapan tanah menunjukkan tanah kering, lalu jalankan pompa beberapa detik dengan perintah seperti /sula (“siram”).
  • Peringatan kebakaran: gabungkan sensor api dengan MQ-2 untuk mengawasi dua bahaya sekaligus.
  • Sensor kotak surat bertenaga baterai: biarkan ESP32 dalam deep sleep, bangunkan ketika tutupnya terbuka, kirim satu pesan, lalu tidur lagi.
  • Stopkontak jarak jauh: nyalakan dan matikan lampu meja atau kipas angin dari mana saja di dunia dengan /ac dan /kapat lewat relay.

Error bot Telegram ESP32 yang umum dan cara mengatasinya

Gejala atau pesanPenyebabSolusi
sendMessage mengembalikan false, tidak ada error di Serial MonitorBaris setCACert atau setInsecure tidak ada, token mengandung spasi, atau Wi-Fi belum terhubungTambahkan baris sertifikat, salin token lagi, cek koneksi Wi-Fi lebih dulu
“Forbidden: bot can't initiate conversation with a user” ketika tes di browserKamu belum pernah menekan Start di bot, atau kamu memblokirnyaBuka bot di Telegram dan tekan Start; buka blokirnya kalau kamu pernah memblokir
“Bad Request: chat not found” (chat tidak ditemukan)Chat ID salah, tanda minus di ID grup hilang, atau bot sudah dikeluarkan dari grupBaca ulang ID-nya dengan getUpdates dan tulis ID grup lengkap dengan tanda minus
“Unauthorized” (tidak berwenang)Token salah atau sudah diganti dengan /revokeSalin token terbaru dari BotFather dan upload kodenya lagi
Bisa mengirim pesan tetapi mengabaikan perintahdelay() yang lama di loop(), chat ID yang salah, atau @nama_bot yang ditambahkan ke perintah di grupPakai millis() untuk menunggu, potong bagian @, cek baris “unauthorized ID” di Serial Monitor
Bot benar-benar diam setelah menerima foto atau stikerLibrary hanya membaca 1500 karakter pertama dari respons; respons yang panjang tidak bisa diurai dan pesan yang sama terus datang lagiTambahkan baris bot.maxMessageLength = 4000; di setup()
Board menjalankan perintah lama ketika menyalaTelegram menyimpan pesan yang belum dibaca hingga 24 jamBaca dan buang pesan yang tertunda di awal program
“Conflict: terminated by other getUpdates request”Token yang sama berjalan di dua perangkat sekaligus, atau di skrip di komputermuBuat bot terpisah di BotFather untuk setiap perangkat
“Too Many Requests: retry after 30” (terlalu banyak permintaan)Pesan dikirim dengan jarak terlalu rapatTambahkan cooldown; kirim maksimal satu pesan per detik ke chat yang sama
“ArduinoJson.h: No such file or directory” ketika kompilasiLibrary ArduinoJson belum terinstalInstal ArduinoJson dari Library Manager
Board reboot ketika mengirim pesanCatu daya tidak sanggup menahan lonjakan arus ketika transmisi Wi-Fi (brownout)Adaptor 1 A, kabel pendek yang berkualitas, dan kapasitor 100–470 µF di antara 3V3 dan GND
Ikuti urutan ketika mencari masalah: pertama, pastikan di Serial Monitor bahwa Wi-Fi sudah terhubung, lalu tes token dengan getMe dan chat ID dengan sendMessage di browser, dan periksa kode paling akhir. Untuk tes di browser, cukup buka api.telegram.org/botTOKEN/sendMessage?chat_id=123456789&text=tes; Telegram menuliskan alasan setiap error dalam teks biasa di baris description. Kalau kamu mentok di tahap Wi-Fi, cek panduan ESP32 tidak mau terhubung ke Wi-Fi.

Dengan satu token, satu chat ID, dan beberapa baris kode, ESP32-mu kini menjadi asisten kecil yang melaporkan keadaan rumah dan menerima perintahmu. Kamu bisa mengembangkan susunan yang sama dengan sensor suhu, ketinggian air, atau pintu, dan mengarahkan notifikasinya ke grup keluarga. Di aplikasi BlueGrays kamu akan menemukan Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram), Alarm Detektor Gas/Asap MQ-2 ESP32, dan proyek-proyek Wi-Fi ESP32 lainnya langkah demi langkah, lengkap dengan skema rangkaian dan kodenya.

Pertanyaan umum

Apakah bot Telegram ESP32 gratis?

Ya. Membuat bot di Telegram, memakai Bot API, dan mengirim pesan sepenuhnya gratis, dan tidak ada kuota pesan bulanan. Yang ada hanya batas kecepatan: sekitar satu pesan per detik ke chat yang sama dan 20 pesan per menit ke grup. Untuk proyek rumahan, batas ini lebih dari cukup.

Bagaimana cara menemukan chat ID Telegram-ku?

Cara termudah adalah menekan Start di bot ID seperti @userinfobot di Telegram; bot itu mengirimkan nomor ID-mu. Cara lain, kirim pesan ke bot-mu sendiri, buka api.telegram.org/botTOKEN/getUpdates di browser, lalu baca nilai id di bagian “chat”. ID grup diawali tanda minus.

Kenapa ESP32-ku tidak mengirim pesan ke Telegram?

Penyebab paling umum adalah belum pernah menekan Start di bot, chat ID yang salah, spasi di dalam token, atau baris setCACert atau setInsecure yang tidak ada di kode. Kamu bisa mengetes token dan chat ID terpisah dari kodemu dengan membuka alamat getMe dan sendMessage di browser. Pastikan juga board-nya terhubung ke jaringan Wi-Fi 2,4 GHz.

Bisakah orang lain mengendalikan bot Telegram-ku?

Username bot bersifat publik, jadi kalau kamu tidak menambahkan pengecekan ID di kodemu, ya, siapa pun yang menemukan bot itu bisa mengirim perintah. Membandingkan setiap chat ID yang masuk dengan ID-mu sendiri dan mengabaikan sisanya mencegah hal ini, karena Telegram memverifikasi siapa pengirimnya. Jangan pernah membagikan token juga; kalau bocor, ganti dengan /revoke di BotFather.

Bisakah aku membuat bot Telegram dengan ESP8266?

Bisa. Library UniversalTelegramBot juga bekerja di board ESP8266 seperti NodeMCU dan Wemos D1 Mini. Sertifikat root diberikan sebagai X509List ke setTrustAnchors(), dan waktu harus diambil lewat NTP sebelum terhubung. Memori ESP8266 lebih kecil, jadi ESP32 lebih sanggup menangani pesan yang panjang.

Bisakah ESP32 mengirim foto ke Telegram?

Bisa. Dengan fungsi sendPhotoByBinary() dari library ini, kamu bisa mengirim frame yang ditangkap ESP32-CAM langsung ke Telegram. ESP32 tanpa kamera bisa mengirim gambar yang tersimpan di kartu SD dengan cara yang sama, atau alamat gambar online dengan sendPhoto(). Sistem yang mengirim foto ketika gerakan terdeteksi termasuk proyek keamanan yang paling populer.

Lihat semua proyek
LED Berkedip dengan ESP32
#103Pemula

LED Berkedip dengan ESP32

Mengajarkan penggunaan output GPIO dasar dengan ESP32. Kita membuat efek berkedip dengan menyalakan dan mematikan LED dari pin digital. Versi ESP32 dari proyek blink klasik di Arduino UNO; perintah blink dasar di lingkungan Arduino sama, tetapi susunan pin ESP32 dan level GPIO 3,3 V-nya berbeda dengan Arduino UNO.

4.7(37)
99
Kedipan LED Bawaan ESP32
#106Pemula

Kedipan LED Bawaan ESP32

Mengedipkan LED biru bawaan di ESP32 DevKit V1. Tidak perlu komponen eksternal! Proyek pertama yang sebaiknya kamu coba ketika membeli ESP32. GPIO 2 tersambung ke LED bawaan.

4.8(29)
53
Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)
#145Mahir
Premium

Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)

Sistem alarm keamanan pintar yang menyalakan buzzer dan LED ketika sensor PIR mendeteksi gerakan, sekaligus mengirim notifikasi instan ke pemilik lewat Telegram. Cooldown 30 detik membatasi seberapa sering alarm berulang; mekanisme ini tidak memvalidasi deteksi PIR atau menghilangkan pemicu palsu. Cocok untuk rumah, garasi, gudang, atau ruang kerja. Dengan ESP32-CAM bisa ditambahkan notifikasi berfoto; dengan ESP32 DevKit V1 klasik, notifikasinya berupa teks.

0.0(0)
9
Alarm Detektor Gas/Asap MQ-2 ESP32
#122Menengah

Alarm Detektor Gas/Asap MQ-2 ESP32

Di proyek ini, gas mudah terbakar (LPG, metana, propana) dan asap dideteksi memakai modul sensor gas MQ-2, dan alarm mirip sirene diputar lewat buzzer pasif ketika terdeteksi. Output ambang digital (DO) sensor disambung ke GPIO 4 ESP32; ketika gas atau asap melewati ambang, DO menjadi LOW dan alarm terpicu. Kepekaan diatur lewat potensiometer modul. Buzzer pasif digerakkan dengan tone() untuk menghasilkan efek sirene dua frekuensi.

4.7(28)
43
Lampu Pintar ESP32 (PIR + LDR + Relay + OLED)
#141Mahir
Premium

Lampu Pintar ESP32 (PIR + LDR + Relay + OLED)

Ubah lorong, kamar mandi, atau gudangmu menjadi lampu pintar dengan ESP32! Dengan sensor gerak PIR, sensor cahaya LDR, dan modul relay, kita membuat skenario klasik "lampu menyala ketika ada gerakan dalam gelap"; jika sudah terang, gerakan TIDAK menyalakan lampu, jadi energi hemat di siang hari. Lampu menyala 30 detik; jika gerakan berlanjut, timer diulang. OLED SSD1306 menampilkan status dengan font besar (NYALA / SIANG / MENUNGGU) dan hitung mundur.

4.3(6)
11
Lampu Otomatis dengan Sensor Gerak PIR ESP32
#121Menengah
Premium

Lampu Otomatis dengan Sensor Gerak PIR ESP32

Di proyek ini, sensor gerak PIR HC-SR501 mendeteksi ketika seseorang masuk ke ruangan dan otomatis menyalakan LED. Lama LED menyala dilacak dengan millis(); setiap bacaan HIGH memperbarui waktu gerakan terakhir, dan LED mati minimal 10 detik setelah bacaan HIGH terakhir. Kode yang sekarang juga menunggu 50 ms di setiap loop dengan delay(50), jadi loopnya belum sepenuhnya non-blocking. Proyek ini bisa dipakai untuk lampu tangga.

4.4(24)
38
Koneksi Wi-Fi STA ESP32 (dengan Layar LCD)
#127Mahir

Koneksi Wi-Fi STA ESP32 (dengan Layar LCD)

Di proyek ini, kita menyambungkan ESP32 ke jaringan Wi-Fi rumah dalam mode Station (STA) dengan cara yang aman dan tahan gangguan. Kita menyimpan SSID dan kata sandi di file secrets.h terpisah agar tidak bocor ke Git, menyiapkan mekanisme sambung ulang otomatis, dan menampilkan tingkat sinyal RSSI dan alamat IP di layar LCD I2C. LED bawaan bekerja sebagai indikator status. Ini adalah pengelola koneksi kelas produksi.

4.4(21)
34