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.

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.
| Istilah | Fungsinya | Contoh |
|---|---|---|
| BotFather | Bot resmi Telegram untuk membuat dan mengelola bot | /newbot, /setcommands, /revoke (perintah BotFather) |
| Token bot | Kata sandi bot; kodemu terhubung ke Telegram dengan token ini | 1234567890:AAE... (angka, titik dua, deretan karakter panjang) |
| Chat ID | Nomor orang atau grup yang menjadi tujuan pesan | Orang: 123456789, grup: -1001234567890 |
| getUpdates | Mengambil pesan baru yang dikirim ke bot dari server | bot.getUpdates(...) |
| sendMessage | Mengirim pesan ke chat ID yang ditentukan | bot.sendMessage(CHAT_ID, "Halo") |
| Perintah | Pesan pendek yang diawali / dan dipahami bot | /ac, /kapat, /durum |
Kenapa Telegram? Perbandingan dengan cara notifikasi lain
| Metode | Kelebihan | Kekurangan | Paling cocok untuk |
|---|---|---|---|
| Bot Telegram | Gratis, notifikasi instan, perintah dua arah, tidak perlu membuka port | Tidak ada grafik atau dashboard siap pakai | Alarm dan kendali jarak jauh sederhana |
| Blynk IoT | Dashboard siap pakai dengan tombol, gauge, dan grafik | Batas pesan dan perangkat di paket gratis | Dashboard pemantauan sensor |
| Email (SMTP) | Bisa di semua ponsel, bisa membawa laporan panjang | Ada jeda, sulit menerima perintah | Laporan harian |
| SMS (SIM800L) | Tidak butuh Wi-Fi atau internet | Biaya kartu SIM dan SMS, modul tambahan | Pondok atau gudang tanpa internet |
| Web server ESP32 | Sepenuhnya lokal dan gratis | Biasanya hanya bisa diakses dari jaringan yang sama, tanpa notifikasi | Panel 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
- 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.
- Ketuk Start (Mulai) dan kirim perintah /newbot.
- BotFather pertama-tama menanyakan nama tampilan bot; ketik nama apa saja yang kamu suka, misalnya “Alarm Rumah”.
- 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.
- 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.
- 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.
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:
- 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.
- 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.
- 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.
Langkah 3: Instal UniversalTelegramBot dan ArduinoJson
- Kalau paket board ESP32 belum terinstal di Arduino IDE, instal dulu; langkah-langkahnya ada di Apa Itu ESP32?.
- 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.
- Kalau installer menanyakan dependensi, pilih Install all; kalau tidak, cari ArduinoJson di jendela yang sama dan instal library milik Benoit Blanchon secara terpisah.
- 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.




| Koneksi | ESP32 | ESP8266 (NodeMCU) | Raspberry Pi Pico W |
|---|---|---|---|
| PIR VCC | VIN (5V) | VIN (5V) | VBUS (5V) |
| PIR OUT | GPIO 27 | D5 (GPIO 14) | GP16 |
| MQ-2 VCC | VIN (5V) | VIN (5V) | VBUS (5V) |
| MQ-2 AO (lewat pembagi 10 kΩ / 20 kΩ) | GPIO 34 | A0 | GP26 (ADC0) |
| Relay VCC | VIN (5V) | VIN (5V) | VBUS (5V) |
| Relay IN | GPIO 26 | D1 (GPIO 5) | GP15 |
| LED | GPIO 2 (bawaan) | D4 (bawaan, menyala dengan LOW) | "LED" (bawaan) |
| Semua GND | GND | GND | GND |
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:
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.
| Pengaturan | Fungsinya | Keamanan | Kapan dipakai |
|---|---|---|---|
| client.setCACert(TELEGRAM_CERTIFICATE_ROOT) | Mengenkripsi koneksi dan memverifikasi identitas server | Tinggi | Pengaturan yang disarankan, selalu |
| client.setInsecure() | Mengenkripsi koneksi tetapi tidak mengecek identitas server | Sedang: tidak akan sadar ada server palsu di tengah | Tes cepat untuk menyingkirkan kemungkinan masalah sertifikat |
| Tanpa keduanya | Di core ESP32 versi terbaru, koneksi tidak pernah terbentuk | Tidak berfungsi | Jangan pernah: tidak ada pesan terkirim dan tidak ada error di Serial Monitor |
| ESP8266: setTrustAnchors(&cert) | Padanannya di ESP8266; sertifikat diberikan sebagai X509List | Tinggi | NodeMCU 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.
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}| Baris | Fungsinya |
|---|---|
| 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_id | ID 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_LOW | Kebanyakan modul relay menyala dengan sinyal LOW; ubah menjadi false kalau modulmu menyala dengan HIGH |
| KONTROL_ARALIGI | Seberapa 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.
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}| Pengaturan | Nilai | Penjelasan |
|---|---|---|
| GAZ_ESIK | 1800 | Nilai ADC mentah dari 0 sampai 4095; tentukan dari hasil pembacaan di udara bersih |
| GAZ_FARK | 200 | Pembacaan harus turun sejauh ini di bawah ambang sebelum “kembali normal” dikirim; mencegah notifikasi bolak-balik di batas |
| HAREKET_BEKLEME | 60000 ms | Memberi jarak minimal 60 detik di antara dua notifikasi gerakan |
| GAZ_ISINMA | 120000 ms | MQ-2 memberi angka tinggi selama pemanasan; gas tidak dicek selama 2 menit pertama |
| KONTROL_ARALIGI | 1000 ms | Seberapa sering Telegram ditanya soal pesan baru |
| bot.maxMessageLength | 4000 | Respons 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”.
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.
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.
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 pesan | Penyebab | Solusi |
|---|---|---|
| sendMessage mengembalikan false, tidak ada error di Serial Monitor | Baris setCACert atau setInsecure tidak ada, token mengandung spasi, atau Wi-Fi belum terhubung | Tambahkan baris sertifikat, salin token lagi, cek koneksi Wi-Fi lebih dulu |
| “Forbidden: bot can't initiate conversation with a user” ketika tes di browser | Kamu belum pernah menekan Start di bot, atau kamu memblokirnya | Buka 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 grup | Baca ulang ID-nya dengan getUpdates dan tulis ID grup lengkap dengan tanda minus |
| “Unauthorized” (tidak berwenang) | Token salah atau sudah diganti dengan /revoke | Salin token terbaru dari BotFather dan upload kodenya lagi |
| Bisa mengirim pesan tetapi mengabaikan perintah | delay() yang lama di loop(), chat ID yang salah, atau @nama_bot yang ditambahkan ke perintah di grup | Pakai millis() untuk menunggu, potong bagian @, cek baris “unauthorized ID” di Serial Monitor |
| Bot benar-benar diam setelah menerima foto atau stiker | Library hanya membaca 1500 karakter pertama dari respons; respons yang panjang tidak bisa diurai dan pesan yang sama terus datang lagi | Tambahkan baris bot.maxMessageLength = 4000; di setup() |
| Board menjalankan perintah lama ketika menyala | Telegram menyimpan pesan yang belum dibaca hingga 24 jam | Baca 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 komputermu | Buat bot terpisah di BotFather untuk setiap perangkat |
| “Too Many Requests: retry after 30” (terlalu banyak permintaan) | Pesan dikirim dengan jarak terlalu rapat | Tambahkan cooldown; kirim maksimal satu pesan per detik ke chat yang sama |
| “ArduinoJson.h: No such file or directory” ketika kompilasi | Library ArduinoJson belum terinstal | Instal ArduinoJson dari Library Manager |
| Board reboot ketika mengirim pesan | Catu 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 |
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.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
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.

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.

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.

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.

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.

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.

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.
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

