📱 Android tətbiqimizi sına
Orta

ESP8266 və Telegram ilə ev bildirişləri: qapı, hərəkət və işıq

Qapı açılanda, evdə hərəkət olanda və işıq yananda telefonuna Telegram mesajı gəlsin. ESP8266, PIR, LDR və gerkon rele ilə addım-addım: qoşulma, bot, tam kod və test.

Layihə ~60 dəq5 dəq oxumaYeniləndi: 24 sentyabr 2026
Mündəricat
  1. Necə işləyir
  2. Hissələr nə iş görür
  3. PIR hərəkət sensoru (HC-SR501)
  4. LDR işıq sensoru modulu (LM393)
  5. Gerkon (reed) rele
  6. ESP8266 NodeMCU
  7. Qoşulma
  8. Telegram botunu yaratmaq
  9. Chat ID-ni tapmaq
  10. Arduino IDE-ni ESP8266 üçün hazırlamaq
  11. Kod
  12. Kod necə işləyir
  13. Wi-Fi-ya qoşulma
  14. Telegram-a mesaj
  15. INPUT_PULLUP niyə lazımdır
  16. Mesaj niyə təkrarlanmır
  17. Yükləmə və test
  18. Problemlər və həllər

Qapı açılanda telefonuna «Qapı açıldı!» mesajı gəlsin, evdə hərəkət olanda və ya işıq yananda da xəbərin olsun. Bu dərsdə bunu bir ESP8266 kartı, üç ucuz sensor və pulsuz Telegram botu ilə quracağıq. Server və ya ayrıca proqram lazım deyil — ESP8266 mesajı birbaşa Telegram-a göndərir.

Videoda: dövrə, Telegram botunun yaradılması, kodun izahı və real test

Lazım olanlar

Təxmini cəmi: 38.00 ₼

Qiymət və stok mağazadan canlı gəlir.

Necə işləyir

  • Gerkon rele qapının açıldığını, PIR sensor hərəkəti, LDR modulu işığın yandığını hiss edir.
  • Hər üçü ESP8266-nın rəqəmsal girişlərinə qoşulur, kart onları saniyədə təxminən 10 dəfə oxuyur.
  • Vəziyyət dəyişən an ESP8266 Wi-Fi ilə Telegram-a HTTPS sorğusu göndərir və bot sənə mesaj yazır.

Hissələr nə iş görür

PIR hərəkət sensoru (HC-SR501)

İnsan və heyvan bədəninin yaydığı infraqırmızı istiliyi izləyir, qəfil dəyişiklik görəndə çıxışı HIGH olur. Modul 5V ilə qidalanır, amma çıxış siqnalı 3.3V-dur — ona görə ESP8266-ya birbaşa qoşula bilir.

Üzərindəki iki trimpotdan biri həssaslığı (məsafəni), digəri siqnalın nə qədər HIGH qalacağını tənzimləyir.

LDR işıq sensoru modulu (LM393)

Adi LDR rezistorla birlikdə analoq siqnal verir və orada işığın istənilən səviyyəsini görmək olur. Bu modulda isə LM393 müqayisəedicisi var: işıq trimpotla təyin etdiyin həddi keçəndə DO çıxışı dəyişir, yəni biz hazır rəqəmsal siqnal alırıq.

Gerkon (reed) rele

Şüşə borunun içində bir-birindən azca aralı iki nazik metal lövhə var. Maqnit yaxınlaşanda lövhələr bitişir və dövrə qapanır, maqnit uzaqlaşanda açılır. Gerkonu qapının çərçivəsinə, maqniti qapının özünə yapışdırırsan: qapı bağlıdır — kontakt qapalıdır, qapı açıldı — kontakt açıldı.

Bir ayağı GND-yə, digəri ESP8266-nın D5 girişinə qoşulur. Maqnit yaxında olanda D5 GND-yə birləşir (LOW), uzaqlaşanda isə heç yerə bağlı qalmır — bunun qarşısını kodda INPUT_PULLUP ilə alırıq.

ESP8266 NodeMCU

Layihənin beynidir: Wi-Fi-ya qoşulur, sensorları oxuyur və yazdığımız koda görə mesajı Telegram-a göndərir. Məlumatı heç yerdə saxlamır — hər hadisəni dərhal bildirir.

Qoşulma

Hissə

Ayağı

NodeMCU

Gerkon rele

1-ci ayaq

D5

Gerkon rele

2-ci ayaq

GND

PIR (HC-SR501)

VCC

VIN (5V)

PIR (HC-SR501)

OUT

D6

PIR (HC-SR501)

GND

GND

LDR modulu

VCC

3V3

LDR modulu

DO

D7

LDR modulu

GND

GND

KY-021 gerkon modulu işlədirsənsə: S → D5, «−» → GND. Orta ayağı (+) 3V3-ə qoşmaq olar, amma vacib deyil — kodda daxili pull-up onsuz da açıqdır. Məntiq eynidir: maqnit yaxında — LOW.

Telegram botunu yaratmaq

  1. Telegram-da axtarışa BotFather yaz, mavi təsdiq nişanlı hesabı aç və «Start» bas.
  2. /newbot əmrini göndər.
  3. Bota ad ver — məsələn «Ev Sistemləri».
  4. İstifadəçi adı ver. O, mütləq bot sözü ilə bitməlidir: məsələn ev_sistemleri_bot. Ad tutulubsa başqasını yoxla.
  5. BotFather sənə token göndərəcək (123456789:AA… kimi). Onu kodda işlədəcəyik.

Chat ID-ni tapmaq

Bot sənə yaza bilsin deyə ona «kimə yazacağını» — chat ID-ni vermək lazımdır. Onu tapmaq üçün:

  1. Yaratdığın botu Telegram-da tap, /start bas və istənilən test mesajı yaz.
  2. Brauzerdə aşağıdakı linki aç — TOKEN yerinə öz tokenini yaz.
  3. Cavabda "chat":{"id":123456789 hissəsini tap — bu rəqəm sənin chat ID-ndir. Kopyala.
Adi mətn
https://api.telegram.org/botTOKEN/getUpdates

Arduino IDE-ni ESP8266 üçün hazırlamaq

  1. File → Preferences pəncərəsində «Additional boards manager URLs» sahəsinə aşağıdakı linki əlavə et.
  2. Tools → Board → Boards Manager-də esp8266 yaz və «esp8266 by ESP8266 Community» paketini qur.
  3. Kartı USB ilə kompüterə qoş. Tools → Board-dan «NodeMCU 1.0 (ESP-12E Module)», Tools → Port-dan kartın portunu seç.
Adi mətn
https://arduino.esp8266.com/stable/package_esp8266com_index.json

Kod

Aşağıdakı kodu Arduino IDE-yə yapışdır və əvvəlində dörd yeri öz məlumatınla dəyiş: Wi-Fi adı, Wi-Fi şifrəsi, bot tokeni və chat ID. Kodu hazır fayl kimi səhifənin sonundan da yükləyə bilərsən.

Arduino / C++
/*
  ESP8266 + Telegram: qapı, hərəkət və işıq bildirişləri
  embedded.az/az/dersler/esp8266-telegram-ev-bildiris-sistemi

  Qoşulma (NodeMCU v3):
    Gerkon (reed) rele : bir ucu D5, digər ucu GND
    PIR (HC-SR501)     : VCC → VIN (5V), OUT → D6, GND → GND
    LDR modulu (LM393) : VCC → 3V3, DO → D7, GND → GND
*/

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

// ── Wi-Fi (yalnız 2.4 GHz şəbəkə) ──
const char* WIFI_SSID     = "WIFI_ADI";
const char* WIFI_PASSWORD = "WIFI_SIFRESI";

// ── Telegram ──
const char* BOT_TOKEN = "123456789:BURAYA_BOTFATHER_TOKENI";  // BotFather-dan
const char* CHAT_ID   = "123456789";                          // getUpdates-dən

// ── Pinlər ──
const int DOOR_PIN   = D5;  // gerkon rele
const int MOTION_PIN = D6;  // PIR sensorun OUT çıxışı
const int LIGHT_PIN  = D7;  // LDR modulunun DO çıxışı

// LDR modulu işıq yananda hansı səviyyəni verir? Çoxu LOW verir.
// Serial Monitor-da yoxla: işıq yanıqkən "Işıq" dəyəri 0-dırsa LOW saxla, 1-dirsə HIGH yaz.
const int LIGHT_ON_LEVEL = LOW;

// Əvvəlki vəziyyətlər — mesaj yalnız DƏYİŞİKLİK anında getsin.
int prevDoorState;
int prevMotionState;
int prevLightState;

// Mətni URL üçün kodlayır: boşluq, "ı", "ə", emoji və s. Telegram-a düzgün çatsın.
String urlEncode(const String& text) {
  const char* hex = "0123456789ABCDEF";
  String out;
  for (unsigned int i = 0; i < text.length(); i++) {
    uint8_t c = (uint8_t)text[i];
    if (isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') {
      out += (char)c;
    } else {
      out += '%';
      out += hex[c >> 4];
      out += hex[c & 0x0F];
    }
  }
  return out;
}

void sendTelegramMessage(const String& message) {
  WiFiClientSecure client;
  // Sertifikat yoxlanmır: ESP8266-nın yaddaşı azdır, dərs üçün sadə yol.
  client.setInsecure();

  if (!client.connect("api.telegram.org", 443)) {
    Serial.println("Telegram serverinə qoşulmaq alınmadı");
    return;
  }

  String url = String("/bot") + BOT_TOKEN + "/sendMessage?chat_id=" + CHAT_ID + "&text=" + urlEncode(message);
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: api.telegram.org\r\n" +
               "Connection: close\r\n\r\n");

  // Cavabın ilk sətri: "HTTP/1.1 200 OK" olmalıdır.
  unsigned long start = millis();
  while (client.connected() && !client.available() && millis() - start < 5000) {
    delay(10);
  }
  Serial.println(client.readStringUntil('\n'));
  client.stop();
}

void connectWiFi() {
  Serial.print("Wi-Fi-ya qoşulur");
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  int attempt = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
    attempt++;
    if (attempt % 5 == 0) {  // hər 5 saniyədən bir yenidən cəhd
      Serial.println("\nYenidən cəhd edilir...");
      WiFi.disconnect();
      WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    }
  }
  Serial.print("\nWi-Fi bağlantısı uğurludur. IP: ");
  Serial.println(WiFi.localIP());
}

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

  pinMode(DOOR_PIN, INPUT_PULLUP);  // maqnit uzaqlaşanda pin "havada" qalmasın
  pinMode(MOTION_PIN, INPUT);
  pinMode(LIGHT_PIN, INPUT);

  connectWiFi();

  // Başlanğıc vəziyyət — açılışda boş yerə mesaj getməsin.
  prevDoorState   = digitalRead(DOOR_PIN);
  prevMotionState = digitalRead(MOTION_PIN);
  prevLightState  = digitalRead(LIGHT_PIN);

  sendTelegramMessage("✅ Ev sistemi işə düşdü");
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    connectWiFi();  // bağlantı qopubsa bərpa et
  }

  int doorState   = digitalRead(DOOR_PIN);
  int motionState = digitalRead(MOTION_PIN);
  int lightState  = digitalRead(LIGHT_PIN);

  // Yoxlama üçün — hər şey işləyəndən sonra bu sətri şərhə ala bilərsən.
  Serial.printf("Qapı: %d  Hərəkət: %d  Işıq: %d\n", doorState, motionState, lightState);

  // Qapı: maqnit yaxında = LOW (bağlı), uzaqlaşanda = HIGH (açıq).
  if (doorState == HIGH && prevDoorState == LOW) {
    sendTelegramMessage("🚪 Qapı açıldı!");
  }

  // PIR: hərəkət olanda HIGH.
  if (motionState == HIGH && prevMotionState == LOW) {
    sendTelegramMessage("🚶 Hərəkət aşkarlandı!");
  }

  // LDR: işıq yandığı an.
  if (lightState == LIGHT_ON_LEVEL && prevLightState != LIGHT_ON_LEVEL) {
    sendTelegramMessage("💡 İşıq yandı!");
  }

  prevDoorState   = doorState;
  prevMotionState = motionState;
  prevLightState  = lightState;

  delay(100);
}

Kod necə işləyir

Wi-Fi-ya qoşulma

connectWiFi() Wi-Fi-ya qoşulana qədər gözləyir: hər saniyə ekrana nöqtə yazır, hər 5 saniyədən bir qoşulmanı yenidən başladır. Sistem məlumatı heç yerə yazmır, yalnız Telegram-a göndərir — internet yoxdursa işləməyinin mənası yoxdur, ona görə qoşulmadan davam etmir. loop()-un əvvəlində də bağlantı yoxlanılır: modem yenidən başlasa, ESP özü qayıdıb qoşulur.

Telegram-a mesaj

sendTelegramMessage() api.telegram.org serverinə 443-cü port üzərindən qoşulur və sendMessage sorğusu göndərir. Telegram yalnız HTTPS qəbul edir, ona görə WiFiClientSecure işlədirik.

setInsecure() serverin sertifikatını yoxlamamağı deyir. Sertifikatı saxlamaq və yoxlamaq ESP8266-nın onsuz da az olan yaddaşını yeyir, ona görə dərs üçün bu sadə yolu seçmişik.

urlEncode() mesajdakı boşluqları, «ı, ə, ş» kimi hərfləri və emojiləri URL üçün kodlayır. Bunsuz Azərbaycan hərfli mesaj Telegram-a yarımçıq və ya xətalı çatar.

INPUT_PULLUP niyə lazımdır

INPUT_PULLUP pini mikrokontrollerin içində bir rezistorla 3.3V-a «çəkir». Maqnit uzaqlaşanda gerkon açılır və D5 heç yerə bağlı qalmır — belə «havada» qalan pin təsadüfi 0 və 1 oxuyur. Pull-up sayəsində o, dəqiq HIGH olur: qapı bağlıdır — LOW, açıqdır — HIGH.

Mesaj niyə təkrarlanmır

Hər sensorun əvvəlki vəziyyətini (prevDoorState və s.) yadda saxlayırıq və mesajı yalnız vəziyyət dəyişən an — LOW-dan HIGH-a keçəndə göndəririk. Bu olmasa, qapı açıq qaldığı müddətdə hər 100 ms-dən bir «Qapı açıldı» gedərdi. loop()-un sonunda cari vəziyyət «əvvəlki»yə yazılır ki, növbəti yoxlama düzgün olsun. Sondakı delay(100) isə ESP-nin sabit işləməsinə kömək edir.

Yükləmə və test

  1. Upload düyməsini bas. ESP8266-ya yükləmə Arduino-ya nisbətən uzun çəkir — 30–60 saniyə normaldır.
  2. Serial Monitor-u 115200 baud ilə aç və «Wi-Fi bağlantısı uğurludur» yazısını gözlə.
  3. Telegram-a «✅ Ev sistemi işə düşdü» mesajı gəlməlidir.
  4. Maqniti gerkondan uzaqlaşdır — «🚪 Qapı açıldı!» gəlir. Sensorun qabağından keç — «🚶 Hərəkət aşkarlandı!». Otağın işığını yandır — «💡 İşıq yandı!».

Problemlər və həllər

  • Wi-Fi-ya qoşulmur — ESP8266 yalnız 2.4 GHz şəbəkəni görür, 5 GHz-ə qoşulmaz. Adı və şifrəni böyük-kiçik hərfə diqqət edərək yoxla.
  • Mesaj gəlmir — Serial Monitor-da cavabın ilk sətrinə bax: 401 — token səhvdir, 400 — chat ID səhvdir və ya bota hələ /start yazmamısan.
  • PIR qoşulan kimi «hərəkət» göstərir — HC-SR501 qidalanandan sonra 30–60 saniyə «isinir», bu müddətdə yalançı siqnal normaldır.
  • Hərəkət mesajı çox tez-tez gəlir — PIR-in vaxt trimpotunu artır, həssaslıq trimpotunu azalt.
  • «İşıq yandı» işıq sönəndə gəlir — modulun çıxışı tərsdir: kodda LIGHT_ON_LEVEL = HIGH yaz.
  • Qapı mesajı dayanmadan gəlir — gerkonun GND ayağının qoşulduğunu və pinMode(DOOR_PIN, INPUT_PULLUP) sətrinin yerində olduğunu yoxla.

Fayllar

Səndə alındı?

Suallar və cavablar

Dərsdə ilişdin? Soruş — mən və digər oxucular kömək edəcəyik.

Hələ sual yoxdur. İlişsən, ilk sualı sən ver.