Rehberler · 11 dk okuma

ESP32 Telegram Bot: Telefona Bildirim, LED ve Röle Kontrolü

ESP32 Telegram bot yapımı: BotFather ile token, chat ID öğrenme, UniversalTelegramBot kurulumu, hareket ve gaz bildirimi, /ac /kapat ile röle ve güvenlik.

ESP32 Telegram bot, evdeki ESP32 kartının telefonuna mesaj atması ve senden gelen komutları uygulaması demektir. Kapıda hareket olduğunda ya da mutfakta gaz algılandığında cebine anında bildirim düşer; "/ac" yazdığında röle lambayı yakar, "/kapat" yazdığında söndürür. Bunun için kendi telefon uygulamanı yazmana, modeminde port açmana ya da ücretli bir bulut servisine üye olmana gerek yoktur: Telegram'ın ücretsiz Bot API'si ve ESP32'nin dahili Wi-Fi'ı yeterlidir.

Bu rehberde sıfırdan çalışan bir sistem kuracaksın: BotFather ile bot açıp token alacak, kendi chat ID'ni öğrenecek, UniversalTelegramBot ve ArduinoJson kütüphanelerini kuracak, ESP32'den ilk mesajını gönderecek, ardından PIR hareket sensörü ve MQ-2 gaz sensörüyle alarm bildirimi, Telegram komutlarıyla da LED ve röle kontrolü ekleyeceksin. Botun yalnızca senin ID'ne yanıt vermesini, sertifika ayarını, ESP8266 ve Raspberry Pi Pico W farklarını ve en sık görülen hataları da tek tek ele alacağız.

Telegram botu olarak çalışan ESP32 geliştirme kartı
ESP32, dahili Wi-Fi'ı sayesinde Telegram sunucusuna doğrudan bağlanır; ek bir modül ya da ağ geçidi gerekmez.

ESP32 Telegram bot nedir, nasıl çalışır?

Telegram'da bot, bir insan yerine bir programın yönettiği özel bir hesaptır; bizim projemizde bu programı ESP32 çalıştırır. ESP32 ile telefonun birbirine doğrudan bağlanmaz, ikisi de Telegram sunucusuyla konuşur. Sen telefondan bota "/ac" yazdığında mesaj sunucuda bekler. ESP32 her saniye api.telegram.org adresine şifreli bir HTTPS isteği (getUpdates) gönderip "bana yeni mesaj var mı?" diye sorar, mesajı alır ve uygular. Bildirim gönderirken de ters yönde bir sendMessage isteği yapar. Bağlantıyı her zaman ESP32 başlattığı için modeminde port yönlendirmesi ya da sabit IP gerekmez; kart internete çıkabilen herhangi bir 2,4 GHz Wi-Fi ağında çalışır.

KavramNe işe yarar?Örnek
BotFatherTelegram'ın bot açma ve yönetme botu/newbot, /setcommands, /revoke
Bot tokenBotun şifresi; kod Telegram'a bununla bağlanır1234567890:AAE... (sayı, iki nokta, uzun dizi)
Chat IDMesajın gideceği kişinin ya da grubun numarasıKişi: 123456789, grup: -1001234567890
getUpdatesBota gelen yeni mesajları sunucudan çekerbot.getUpdates(...)
sendMessageBelirtilen chat ID'ye mesaj gönderirbot.sendMessage(CHAT_ID, "Merhaba")
Komut/ ile başlayan, botun anlayacağı kısa mesaj/ac, /kapat, /durum

Neden Telegram? Diğer bildirim yöntemleriyle karşılaştırma

YöntemArtısıEksisiEn uygun olduğu iş
Telegram botuÜcretsiz, anlık bildirim, çift yönlü komut, port açmak gerekmezGrafik ve hazır panel yokAlarm ve basit uzaktan kontrol
Blynk IoTHazır düğme, gösterge ve grafik paneliÜcretsiz planda mesaj ve cihaz sınırıSensör izleme panelleri
E-posta (SMTP)Her telefonda çalışır, uzun rapor gönderilebilirGecikmeli, komut almak zorGünlük rapor
SMS (SIM800L)Wi-Fi ve internet gerekmezHat ve SMS ücreti, ek modülİnternet olmayan bağ evi ya da depo
ESP32 web sunucusuTamamen yerel ve ücretsizGenelde yalnızca aynı ağdan erişilir, bildirim yokEv içi kontrol paneli

Kısacası Telegram, "bir şey olunca bana haber ver, ben bir komut yazınca da şunu yap" türündeki projeler için en kolay ve en ucuz yoldur. Sensör verisini grafikle izlemek istiyorsan Blynk ESP32 Rehberi, Wi-Fi olmayan bir yerden bildirim gerekiyorsa SIM800L GSM Modülü yazısı daha uygun olabilir.

Adım 1: BotFather ile bot oluşturmak ve token almak

  1. Telefonunda ya da bilgisayarında Telegram'ı aç, arama kutusuna BotFather yaz ve adının yanında mavi onay işareti olan resmi hesabı seç. Benzer adlı sahte hesaplara dikkat et.
  2. Başlat (Start) düğmesine bas ve /newbot komutunu gönder.
  3. BotFather önce botun görünen adını sorar; "Evim Alarm" gibi istediğin bir ad yaz.
  4. Ardından kullanıcı adını ister. Kullanıcı adı benzersiz olmalı, Latin harfleri, rakam ve alt çizgiden oluşmalı ve bot ile bitmelidir; örneğin evim_alarm_bot. Ad alınmışsa sonuna rakam ekleyerek yeniden dene.
  5. BotFather "Done! Congratulations on your new bot." mesajıyla botunun bağlantısını ve token'ını gönderir. Token, 1234567890:AAE... biçiminde bir sayı, iki nokta üst üste ve uzun bir harf dizisidir. Tamamını kopyalayıp güvenli bir yere kaydet.
  6. BotFather'ın gönderdiği bağlantıya dokunarak kendi botunu aç ve Başlat'a bas. Bu adım şarttır: Telegram'da botlar bir kullanıcıya ilk mesajı kendisi atamaz, konuşmayı her zaman sen başlatmalısın.
Token botun anahtarıdır: ele geçiren kişi botuna gelen mesajları okuyabilir, botun adına mesaj gönderebilir ve ESP32'ye giden komutları senden önce çekebilir. Token'ı içeren kodu forumlarda, ekran görüntülerinde ya da herkese açık bir GitHub deposunda paylaşma. Sızdığını düşünürsen BotFather'da /revoke komutuyla eskisini iptal edip yeni bir token al ve koduna yeniden yükle.

Adım 2: Telegram chat ID nasıl öğrenilir?

Bot token'ı "hangi bot" sorusunu, chat ID ise "mesaj kime gidecek" sorusunu cevaplar. Her Telegram kullanıcısının, grubunun ve kanalının değişmeyen bir sayı kimliği vardır; bu, @ ile başlayan kullanıcı adınla aynı şey değildir. Kendi chat ID'ni öğrenmenin üç kolay yolu var:

  1. Kimlik botuyla: Telegram'da @userinfobot gibi bir kimlik botunu bulup Başlat'a bas; sana Id satırında kendi numaranı gönderir. Bu botlar senin botun değildir, yalnızca ID'ni gösterir.
  2. Tarayıcıyla: Önce kendi botuna herhangi bir mesaj yaz. Sonra bilgisayarının tarayıcısında api.telegram.org/botTOKEN/getUpdates adresini aç (TOKEN yerine kendi token'ını yapıştır, başındaki "bot" kelimesi kalsın). Açılan metinde "chat":{"id":123456789 kısmındaki sayı senin chat ID'ndir. Sayfa boş bir result listesi gösteriyorsa bota yeniden mesaj atıp sayfayı yenile.
  3. ESP32 ile: Aşağıdaki komut kodunu yüklediğinde, yetkisi olmayan herkesin ID'si Seri Monitör'e "Yetkisiz ID" satırıyla yazılır. Bir aile üyesini eklemek istediğinde bota mesaj atmasını isteyip numarasını buradan okuyabilirsin.
Botu bir aile grubunda kullanacaksan botu gruba ekle, grupta bir mesaj yaz ve getUpdates sayfasına yeniden bak: grupların ID'si eksi işaretiyle başlar, süper gruplarda -100 ile. Eksi işaretini unutmak "chat not found" hatasının en sık sebebidir. Varsayılan gizlilik modunda bot gruptaki sohbetleri okumaz, yalnızca kendisine yazılan ve / ile başlayan komutları görür; komutla çalışan bir bot için bu yeterlidir.

Adım 3: UniversalTelegramBot ve ArduinoJson kurulumu

  1. Arduino IDE'de ESP32 kart paketi kurulu değilse önce onu kur; adımlar ESP32 Nedir? yazısında.
  2. Araçlar > Kütüphaneleri Yönet menüsünü aç, arama kutusuna UniversalTelegramBot yaz ve yazarı Brian Lough olan kütüphaneyi kur. Bu rehberdeki kodlar UniversalTelegramBot 1.3.0, ArduinoJson 7 ve ESP32 kart paketi 2.0.11 ile derlendi.
  3. Kurulum bağımlılıkları sorarsa Install all seç; sormazsa aynı pencerede ArduinoJson ara ve Benoit Blanchon'un kütüphanesini ayrıca kur.
  4. Dosya > Örnekler > UniversalTelegramBot > ESP32 altında FlashLED gibi hazır örnekler göreceksin; bu rehberdeki kodlar onların sadeleştirilmiş ve güvenlik eklenmiş hâlidir.

UniversalTelegramBot, ArduinoJson'un 6. sürüm yazımıyla hazırlanmıştır ama ArduinoJson 7 ile de sorunsuz derlenir. Arduino IDE'de derleyici uyarılarını açtıysan "'DynamicJsonDocument' is deprecated: use JsonDocument instead" gibi satırlar görürsün; bunlar hata değil uyarıdır ve program normal çalışır. Kütüphane kurarken sorun yaşarsan Arduino Kütüphane Ekleme rehberine göz at.

Gerekli malzemeler ve bağlantı şeması

Tam proje için bir ESP32 geliştirme kartı, HC-SR501 PIR hareket sensörü, MQ-2 gaz sensörü modülü, 5 V röle modülü, 10 kΩ ve 20 kΩ birer direnç, breadboard ve jumper kablolar yeterli. LED olarak ESP32'nin GPIO 2'ye bağlı dahili mavi LED'ini kullanacağız. İlk iki adımı denemek için yalnızca ESP32 ve USB kablosu yeter; sensörleri sonra ekleyebilirsin.

ESP32
ESP32
PIR HC-SR501
PIR HC-SR501
MQ-2
MQ-2
Röle modülü
Röle modülü
BağlantıESP32ESP8266 (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 (10 kΩ / 20 kΩ bölücüyle)GPIO 34A0GP26 (ADC0)
Röle VCCVIN (5V)VIN (5V)VBUS (5V)
Röle INGPIO 26D1 (GPIO 5)GP15
LEDGPIO 2 (dahili)D4 (dahili, LOW ile yanar)"LED" (dahili)
Tüm GND'lerGNDGNDGND
ESP32, ESP8266 ve Pico'nun pinleri 3,3 V ile çalışır. MQ-2 modülü 5 V ile beslendiğinde AO çıkışı 5 V'a kadar çıkabilir; AO'yu 10 kΩ üzerinden analog pine, analog pini de 20 kΩ ile GND'ye bağlayarak bir Gerilim bölücü kur. Böylece 5 V yaklaşık 3,3 V'a iner. Röleyle 220 V şebeke yükü anahtarlayacaksan bağlantıları fiş çekiliyken yap ve bir yetişkinden yardım al; ayrıntılar Röle Modülü Nedir? yazısında.

Güç beslemesine de dikkat et: MQ-2'nin ısıtıcısı tek başına yaklaşık 150 mA, röle bobini 70 mA civarında akım çeker; ESP32 ise Wi-Fi ile veri gönderdiği anlarda kısa süreliğine 250 mA'e kadar çıkabilir. Bilgisayarın USB portu bu toplamı her zaman karşılayamaz ve kart tam mesaj gönderirken yeniden başlayabilir. En az 1 A veren 5 V bir adaptör ve kaliteli bir kablo kullan; sorun sürerse ESP32 Brownout ve Guru Meditation yazısına bak. Kartının tüm pinlerini Pinout aracında görebilirsin.

İlk test: ESP32'den Telegram'a mesaj göndermek

Sensörlere geçmeden önce token ve chat ID'nin doğru olduğunu en basit kodla doğrulayalım. Aşağıdaki kodda Wi-Fi adını, şifreni, BOT_TOKEN ve CHAT_ID satırlarını kendi bilgilerinle değiştir ve kodu karta yükle. Ardından Seri Monitör'ü 115200 baud hızında aç:

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}

Birkaç saniye içinde Telegram'da botundan "Merhaba! ESP32 çevrimiçi" mesajı gelmeli ve Seri Monitör'de "Mesaj gonderildi" yazmalı. sendMessage() mesaj iletildiğinde true döndürür; "Mesaj gonderilemedi" görüyorsan sorun Wi-Fi bağlantısında, token'da, chat ID'de ya da sertifika ayarındadır. Kodu suçlamadan önce tarayıcıda api.telegram.org/botTOKEN/getMe adresini aç: token doğruysa "ok":true ve botunun adı görünür, yanlışsa "Unauthorized" yazar.

Sertifika ayarı: setCACert mi, setInsecure mi?

Telegram yalnızca HTTPS kabul eder, bu yüzden kodda düz WiFiClient yerine WiFiClientSecure kullanıyoruz. Şifreli bağlantıda ESP32'nin karşısındaki sunucunun gerçekten api.telegram.org olduğundan emin olması gerekir; bunu, sunucunun sertifikasını zincirin en üstündeki kök sertifikayla doğrulayarak yapar. UniversalTelegramBot bu kök sertifikayı TELEGRAM_CERTIFICATE_ROOT adıyla hazır getirir. Telegram'ın sertifika zinciri Go Daddy Root Certificate Authority - G2'ye dayanır ve bu kök 2037'nin sonuna kadar geçerlidir; Telegram ileride sertifika sağlayıcısını değiştirirse kütüphanenin de güncellenmesi gerekir.

AyarNe yapar?GüvenlikNe zaman kullanılır?
client.setCACert(TELEGRAM_CERTIFICATE_ROOT)Bağlantıyı şifreler ve sunucunun kimliğini doğrularYüksekHer zaman önerilen ayar
client.setInsecure()Bağlantıyı şifreler ama sunucunun kimliğini kontrol etmezOrta: araya giren sahte bir sunucuyu fark etmezSertifika sorununu ayırt etmek için kısa bir test
İkisi de yokGüncel ESP32 çekirdeklerinde bağlantı hiç kurulmazÇalışmazHiçbir zaman: mesaj gitmez, Seri Monitör'de hata da görünmez
ESP8266: setTrustAnchors(&cert)ESP8266'daki karşılığı; sertifika X509List ile verilirYüksekNodeMCU ve Wemos D1 Mini; doğru saat gerekir

Telegram komutuyla LED ve röle kontrolü (/ac, /kapat)

Şimdi botu çift yönlü yapalım. Aşağıdaki kod saniyede bir Telegram'a yeni mesaj olup olmadığını sorar; gelen metin /ac ise röleyi ve LED'i açar, /kapat ise kapatır, /durum son durumu bildirir, /start ise komut listesini gönderir. Komut adlarında neden "/aç" değil "/ac" kullandığımızı merak edebilirsin: Telegram komutları yalnızca küçük Latin harfleri, rakam ve alt çizgiden oluşabilir ve en fazla 32 karakter olabilir. "/aç" yazarsan Telegram onu tıklanabilir bir komut olarak tanımaz.

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}
SatırGörevi
bot.getUpdates(bot.last_message_received + 1)Son işlenen mesajdan sonraki yeni mesajları ister ve kaç tane geldiğini döndürür; +1 aynı mesajın tekrar gelmesini önler
bot.messages[i].chat_idMesajın geldiği sohbetin ID'si; yanıt aynı yere gider ve güvenlik kontrolü bununla yapılır
bot.messages[i].textGelen metin; komutu bununla karşılaştırırız
metin.indexOf('@')Grupta Telegram'ın komutun sonuna eklediği @bot_adi kısmını keser
ROLE_AKTIF_LOWÇoğu röle modülü LOW sinyalle çeker; modülün HIGH ile çekiyorsa false yap
KONTROL_ARALIGIMesaj sorma sıklığı; 1000 ms hızlı tepki verir, 3000–5000 ms ağı daha az yorar

Güvenlik: bot yalnız senin ID'ne yanıt versin

Telegram'da botların kullanıcı adları herkese açıktır ve aranabilir. Biri evim_alarm_bot adını tahmin edip ya da bir ekran görüntüsünde görüp bota /ac yazarsa, kontrol koymadığın bir ESP32 bu komutu da uygular. Bu yüzden koddaki en önemli satır chatId != CHAT_ID kontrolüdür. Chat ID'nin gizli olması gerekmez; korumayı sağlayan, mesajın kimden geldiğini Telegram'ın kendisinin doğrulamasıdır ve başka birinin ID'si taklit edilemez. Tanımadığın kişilere hiç cevap vermemek de bilinçli bir tercihtir: bot sessiz kaldıkça çalıştığı bile anlaşılmaz.

  • Beyaz liste kullan: Yetkili ID'leri bir dizide tut, geri kalan her mesajı yok say ve aile üyelerini tek tek ekle.
  • Grupta kişiyi kontrol et: Grupta chat ID grubun ID'sidir; yalnızca belirli kişilerin komut vermesini istiyorsan chat_id yerine from_id değerini karşılaştır.
  • Token'ı ayrı dosyada sakla: Token ve Wi-Fi şifresini secrets.h gibi ayrı bir dosyaya koy, kodu paylaşırken o dosyayı dışarıda bırak.
  • Eski komutları atla: Elektrik kesintisi sırasında gönderilmiş bir /ac, kart açıldığında beklenmedik bir anda çalışmasın; tam koddaki açılış temizliği bunu sağlar.
  • Güvenli başlangıç durumu: Kart her açıldığında röleyi kapalı başlat; ısıtıcı ya da pompa gibi yüklerde bu çok önemlidir.
  • Kritik işleri yalnızca bota bırakma: Kapı kilidi ya da kombi gibi işlerde yanlış bir komutun sonucunu düşün; onay mesajı ya da süre sınırı ekle.

Hareket ve gaz alarmı: Telegram'a bildirim gönderen tam proje

Şimdi parçaları birleştiriyoruz. Aşağıdaki kod PIR sensörü hareket algıladığında ve MQ-2'nin gaz değeri eşiği geçtiğinde sana saatli bir Telegram bildirimi gönderir. Aynı anda /ac, /kapat, /alarm_ac, /alarm_kapat ve /durum komutlarını dinler, /start yazdığında ekranın altına dokunmatik bir tuş menüsü getirir ve komutları Telegram'daki Menü düğmesine ekler. Sensörlerin kendi ayrıntıları için PIR Hareket Sensörü ve MQ-2 Gaz Sensörü yazılarına bakabilirsin.

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}
AyarDeğerAçıklama
GAZ_ESIK18000–4095 arası ham ADC değeri; temiz havadaki ölçümüne göre belirle
GAZ_FARK200Değer eşiğin bu kadar altına inmeden "normale döndü" denmez; sınırda gidip gelen bildirimleri önler
HAREKET_BEKLEME60000 msİki hareket bildirimi arasında en az 60 saniye bırakır
GAZ_ISINMA120000 msMQ-2 ısınırken yüksek değer verir; ilk 2 dakika gaz kontrol edilmez
KONTROL_ARALIGI1000 msTelegram'a yeni mesaj sorma sıklığı
bot.maxMessageLength4000Kütüphanenin okuduğu en uzun yanıt; varsayılan değer 1500

Koddaki iki alarm bilerek farklı çalışır. Hareket alarmı bekleme süresiyle korunur: PIR sensörü biri odada dolaştıkça tekrar tekrar tetiklenir ve bu süre olmasa telefonun dakikada onlarca mesajla dolar. Bekleme sayacı sıfırdan başladığı için ilk bildirim kart açıldıktan en erken 60 saniye sonra gelir; bu süre, PIR sensörünün açılışta dengelenmesi için gereken yaklaşık bir dakikayla da örtüşür. Gaz alarmı ise histerezisle çalışır: değer eşiği geçtiğinde bir kez uyarır, ancak eşiğin 200 birim altına indiğinde "normale döndü" der ve güvenlik gereği /alarm_kapat ile susturulamaz. Telegram da çok sık mesaja izin vermez: aynı sohbete saniyede birden fazla ya da bir gruba dakikada 20'den fazla mesaj göndermeye çalışırsan "Too Many Requests: retry after" hatası alırsın.

GAZ_ESIK değerini tahminle değil ölçerek belirle: kartı temiz havada 5–10 dakika çalıştır, Telegram'dan /durum yaz ve gelen gaz değerini not et. Eşiği bu değerin birkaç yüz birim üstüne koy. bot.longPoll değişkenini de bilmekte fayda var: 20 gibi bir değer verirsen getUpdates yeni mesaj gelene kadar 20 saniye bekler ve komutlara anında cevap verir, ama bu sürede loop() durduğu için sensörler okunmaz. Alarm projelerinde longPoll'u 0'da bırak.
MQ-2 bir öğrenme ve hobi sensörüdür, sertifikalı bir gaz dedektörü değildir; üstelik Wi-Fi ya da internet kesildiğinde bildirim de gelmez. Evinde gaz kaçağına karşı tek koruma olarak asla kullanma; standartlara uygun ticari bir dedektör tak ve bu projeyi ona ek bir uyarı sistemi olarak düşün.

ESP8266 (NodeMCU) ile Telegram bot

Aynı kütüphane ESP8266 NodeMCU ve Wemos D1 Mini kartlarında da çalışır; komut ve alarm mantığı birebir aynıdır, yalnızca bağlantı kısmı değişir. WiFi.h yerine ESP8266WiFi.h kullanılır, kök sertifika X509List ile setTrustAnchors() fonksiyonuna verilir ve ESP8266 sertifikanın geçerlilik tarihini kontrol ettiği için bağlanmadan önce saatin NTP'den alınması şarttır. Saat alınmazsa her bağlantı sessizce başarısız olur. NodeMCU'nun dahili LED'i D4 pinindedir ve LOW ile yanar; analog giriş olarak tek pin, A0 vardır.

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}

Raspberry Pi Pico W ve MicroPython ile Telegram bot

Raspberry Pi Pico W için ayrı bir kütüphaneye gerek yok; MicroPython'un requests modülüyle Telegram Bot API'sine doğrudan istek gönderebilirsin. Aşağıdaki kod hareket algılandığında bildirim gönderir, /ac ve /kapat komutlarıyla GP15'e bağlı röleyi ve kartın dahili LED'ini yönetir ve yalnızca senin chat ID'ne yanıt verir. Thonny ile Pico W'ya güncel MicroPython yükle ve kodu main.py adıyla kaydet. MicroPython'daki requests modülü bağlantıyı şifreler ama sunucu sertifikasını doğrulamaz; güvenlik düzeyi ESP32'deki setInsecure() ile aynıdır.

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)

ESP32 Telegram bot proje fikirleri

  • Kapı ve pencere alarmı: Bir reed röle ya da PIR sensörü ile evde kimse yokken hareket olduğunda telefona mesaj gönder.
  • Fotoğraflı güvenlik kamerası: Hareket algılandığında ESP32-CAM ile fotoğraf çekip Telegram'a yolla; adımlar ESP32-CAM Telegram yazısında.
  • Oda ve sera takibi: DHT11 ile ölçülen sıcaklık eşiği geçince uyar, /durum ile anlık değeri sor.
  • Bitki sulama hatırlatıcısı: Toprak nem sensörü kuruluk gösterince bildirim al, /sula gibi bir komutla pompayı birkaç saniye çalıştır.
  • Yangın uyarısı: Alev sensörünü MQ-2 ile birleştirip iki tehlikeyi birden izle.
  • Pille çalışan posta kutusu sensörü: ESP32'yi derin uykuda beklet, kapak açılınca uyanıp tek bir mesaj gönder ve yeniden uyu.
  • Uzaktan priz: Röleyle masa lambasını ya da fanı dünyanın her yerinden /ac ve /kapat ile yönet.

ESP32 Telegram bot sık hataları ve çözümleri

Belirti ya da mesajSebepÇözüm
sendMessage false döndürüyor, Seri Monitör'de hata yoksetCACert ya da setInsecure satırı eksik, token'da boşluk var ya da Wi-Fi bağlı değilSertifika satırını ekle, token'ı yeniden kopyala, önce Wi-Fi bağlantısını doğrula
Tarayıcı testinde "Forbidden: bot can't initiate conversation with a user"Bota hiç Başlat'a basmadın ya da botu engelledinTelegram'da botu açıp Başlat'a bas; engellediysen engeli kaldır
"Bad Request: chat not found"Chat ID yanlış, grup ID'sinde eksi işareti eksik ya da bot gruptan çıkarılmışID'yi getUpdates ile yeniden oku, grup ID'sini eksiyle yaz
"Unauthorized"Token hatalı ya da /revoke ile yenilenmişBotFather'dan güncel token'ı kopyala ve kodu yeniden yükle
Mesaj gönderiyor ama komutlara cevap vermiyorloop() içinde uzun delay(), yanlış chat ID ya da grupta komutun sonuna eklenen @bot_adiBeklemeleri millis() ile yap, @ kısmını kes, Seri Monitör'deki "Yetkisiz ID" satırına bak
Bot bir fotoğraf ya da çıkartmadan sonra tamamen sustuKütüphane yanıtın yalnızca ilk 1500 karakterini okur; uzun yanıt çözülemez ve aynı mesaj tekrar tekrar gelirsetup() içine bot.maxMessageLength = 4000; satırını ekle
Kart açılınca eski komutları uyguluyorTelegram okunmamış mesajları 24 saate kadar saklarAçılışta bekleyen mesajları okuyup atla
"Conflict: terminated by other getUpdates request"Aynı token iki cihazda ya da bilgisayardaki bir betikte aynı anda çalışıyorHer cihaz için BotFather'dan ayrı bir bot aç
"Too Many Requests: retry after 30"Çok kısa aralıklarla mesaj gönderiliyorBekleme süresi ekle; aynı sohbete saniyede en fazla bir mesaj gönder
Derlemede "ArduinoJson.h: No such file or directory"ArduinoJson kütüphanesi kurulu değilKütüphane Yöneticisi'nden ArduinoJson'u kur
Mesaj gönderirken kart yeniden başlıyorWi-Fi anındaki akım tepesini besleme karşılayamıyor (brownout)1 A'lik adaptör, kısa ve kaliteli kablo, 3V3 ile GND arasına 100–470 µF kondansatör
Sorun ararken sırayı koru: önce Seri Monitör'de Wi-Fi'ye bağlanıldığını gör, sonra tarayıcıda getMe ile token'ı, sendMessage ile chat ID'yi dene, en son koda bak. Tarayıcı testi için api.telegram.org/botTOKEN/sendMessage?chat_id=123456789&text=deneme adresini açman yeterli; Telegram hatanın sebebini description satırında düz metin olarak yazar. Wi-Fi aşamasında takılıyorsan ESP32 Wi-Fi Bağlanmıyor rehberine göz at.

Bir token, bir chat ID ve birkaç satır kodla ESP32'n artık evden haber veren ve senden komut alan küçük bir asistana dönüştü. Aynı yapıyı sıcaklık, su seviyesi ya da kapı sensörleriyle genişletebilir, bildirimleri bir aile grubuna yönlendirebilirsin. BlueGrays uygulamasında PIR, buzzer ve LED ile Telegram'a bildirim gönderen ESP32 hareket alarm sistemini, MQ-2 gaz ve duman dedektörü alarmını ve ESP32 Wi-Fi projelerini devre şemaları ve kodlarıyla adım adım bulabilirsin.

Sıkça sorulan sorular

ESP32 Telegram botu ücretsiz mi?

Evet. Telegram'da bot açmak, Bot API'yi kullanmak ve mesaj göndermek tamamen ücretsizdir; aylık bir mesaj kotası da yoktur. Yalnızca hız sınırları vardır: aynı sohbete saniyede yaklaşık bir mesaj, bir gruba dakikada 20 mesaj. Ev projeleri için bu sınırlar fazlasıyla yeterlidir.

Telegram chat ID nasıl bulunur?

En kolay yol Telegram'da @userinfobot gibi bir kimlik botunda Başlat'a basmaktır; bot sana ID numaranı gönderir. İstersen kendi botuna mesaj atıp tarayıcıda api.telegram.org/botTOKEN/getUpdates adresini açabilir ve "chat" bölümündeki id değerini okuyabilirsin. Grupların ID'si eksi işaretiyle başlar.

ESP32 Telegram'a neden mesaj göndermiyor?

En sık sebepler bota hiç Başlat'a basılmamış olması, yanlış chat ID, token'daki bir boşluk ya da kodda setCACert veya setInsecure satırının eksik olmasıdır. Tarayıcıda getMe ve sendMessage adreslerini deneyerek token ile chat ID'yi koddan bağımsız test edebilirsin. Kartın 2,4 GHz bir Wi-Fi ağına bağlı olduğundan da emin ol.

Telegram botumu başkası kontrol edebilir mi?

Bot kullanıcı adları herkese açık olduğu için koda ID kontrolü koymazsan evet, botu bulan herkes komut gönderebilir. Gelen mesajın chat ID'sini kendi ID'nle karşılaştırıp diğerlerini yok saymak bunu engeller, çünkü gönderenin kimliğini Telegram doğrular. Token'ı da kimseyle paylaşma; sızarsa BotFather'da /revoke ile yenile.

ESP8266 ile Telegram bot yapılır mı?

Evet. UniversalTelegramBot kütüphanesi NodeMCU ve Wemos D1 Mini gibi ESP8266 kartlarında da çalışır. Kök sertifika X509List ile setTrustAnchors() fonksiyonuna verilir ve bağlanmadan önce saat NTP'den alınmalıdır. ESP8266'nın belleği daha az olduğu için uzun mesajlarla ESP32 daha rahat çalışır.

ESP32 Telegram'a fotoğraf gönderebilir mi?

Evet. Kütüphanedeki sendPhotoByBinary() fonksiyonuyla ESP32-CAM'in çektiği bir kareyi doğrudan Telegram'a yollayabilirsin. Kamerası olmayan bir ESP32 de SD karttaki bir görseli aynı yöntemle ya da internetteki bir görselin adresini sendPhoto() ile gönderebilir. Hareket algılanınca fotoğraf gönderen sistemler güvenlik projelerinin en popüler örneğidir.

Tüm projeleri gör
ESP32 ile LED Yakma
#103Başlangıç

ESP32 ile LED Yakma

ESP32 ile temel GPIO çıkışı kullanımını öğretir. Bir LED'i dijital pinden açıp kapatarak yanıp sönme efekti elde ederiz. Arduino UNO'daki klasik blink projesinin ESP32 versiyonu; Arduino ortamındaki temel blink komutları aynıdır, ancak ESP32'nin pin yerleşimi ve 3,3 V GPIO seviyeleri Arduino UNO'dan farklıdır.

4.7(37)
99
ESP32 Dahili LED Yakma
#106Başlangıç

ESP32 Dahili LED Yakma

ESP32 DevKit V1'in üzerindeki dahili (built-in) mavi LED'i yanıp söndürmek. Hiçbir harici bileşen gerekmez! ESP32 satın aldığında ilk denemen gereken proje. GPIO 2 dahili LED'e bağlıdır.

4.8(29)
53
ESP32 Hareket Alarm Sistemi (PIR + Buzzer + LED + Telegram)
#145İleri
Premium

ESP32 Hareket Alarm Sistemi (PIR + Buzzer + LED + Telegram)

PIR sensörü hareket algıladığında buzzer ve LED'i aktif eden, aynı anda Telegram üzerinden sahibine anlık bildirim gönderen akıllı bir güvenlik alarm sistemidir. Tekrarlayan alarmların sıklığını sınırlamak için 30 saniyelik cooldown (bekleme süresi) mekanizması vardır; bu mekanizma PIR sensörünün yanlış algılamalarını doğrulamaz veya ortadan kaldırmaz. Ev güvenliği, garaj izleme, depo veya çalışma odası gibi alanlarda kullanılabilir. Telegram entegrasyonu sayesinde nerede olursanız olun anında h

0.0(0)
9
ESP32 MQ-2 Gaz/Duman Dedektörü Alarmı
#122Orta

ESP32 MQ-2 Gaz/Duman Dedektörü Alarmı

Bu projede MQ-2 gaz sensörü modülü ile yanıcı gaz (LPG, metan, propan) ve duman tespiti yapılır; tespit anında pasif buzzer üzerinden siren benzeri bir alarm sesi çalınır. Sensörün dijital eşik çıkışı (DO) ESP32'nin GPIO 4 pinine bağlanır; gaz ya da duman eşik değeri aştığında DO LOW olur ve alarm tetiklenir. Hassasiyet modül üzerindeki potansiyometre ile ayarlanır. Pasif buzzer tone() fonksiyonu ile sürülerek iki frekans arasında geçişli siren efekti üretilir.

4.7(28)
43
ESP32 Akıllı Aydınlatma (PIR + LDR + Röle + OLED)
#141İleri
Premium

ESP32 Akıllı Aydınlatma (PIR + LDR + Röle + OLED)

ESP32, PIR hareket sensörü, LDR ışık sensörü ve röle modülü ile evinin koridorunu, tuvaletini veya kilerini akıllı aydınlatmaya dönüştürüyoruz. Klasik "karanlıkta hareket algılanınca ışık yansın" senaryosunu inşa ediyoruz — ortam aydınlıksa hareket olsa bile ışık yanmaz, böylece gündüz gereksiz yere yanmaz ve enerji tasarrufu sağlanır. Işık 30 saniye yanık kalır; hareket devam ederse timer otomatik sıfırlanır ve süre uzar. SSD1306 OLED ekranda büyük fontlarla durum (AÇIK / GÜNDÜZ / BEKLE), geri

4.3(6)
11
ESP32 PIR Hareket Sensörü ile Otomatik Aydınlatma
#121Orta
Premium

ESP32 PIR Hareket Sensörü ile Otomatik Aydınlatma

Bu projede HC-SR501 PIR hareket sensörü ile odaya giren kişiyi algılayıp LED'i otomatik olarak yakacağız. LED'in açık kalma süresini millis() ile izleyeceğiz; sensör HIGH okundukça son hareket zamanı yenilenecek ve son HIGH okumasından en az 10 saniye sonra LED sönecek. Mevcut kod ayrıca her döngüde delay(50) ile 50 ms beklediğinden uygulama döngüsü tamamen bloklamayan bir yapıda değildir. Gerçek hayatta merdiven, koridor, banyo veya dolap içi aydınlatmalarda kullanılabilir.

4.4(24)
38
ESP32 Wi-Fi STA Bağlantısı (LCD Ekranlı)
#127İleri

ESP32 Wi-Fi STA Bağlantısı (LCD Ekranlı)

Bu projede ESP32'yi Station (STA) modunda evdeki Wi-Fi ağına güvenli ve hata toleranslı şekilde bağlıyoruz. SSID/şifreyi secrets.h dosyasına ayırarak Git'e sızmasını önlüyor, otomatik yeniden bağlanma mekanizması kuruyor, RSSI sinyal seviyesini ve IP adresini I2C LCD ekranda gösteriyoruz. Dahili LED durum göstergesi olarak çalışır. Üretim seviyesi bir bağlantı yöneticisidir.

4.4(21)
34