Mündəricat
- Necə işləyir
- Hissələr nə iş görür
- PIR hərəkət sensoru (HC-SR501)
- LDR işıq sensoru modulu (LM393)
- Gerkon (reed) rele
- ESP8266 NodeMCU
- Qoşulma
- Telegram botunu yaratmaq
- Chat ID-ni tapmaq
- Arduino IDE-ni ESP8266 üçün hazırlamaq
- Kod
- Kod necə işləyir
- Wi-Fi-ya qoşulma
- Telegram-a mesaj
- INPUT_PULLUP niyə lazımdır
- Mesaj niyə təkrarlanmır
- Yükləmə və test
- 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.
Lazım olanlar
Təxmini cəmi: 38.00 ₼
ESP8266 NodeMCU V3 (CH340)15.00 ₼Stokda var
HC-SR501 PIR hərəkət sensoru5.00 ₼Stokda var
LDR işıq sensoru (LM393)4.00 ₼Stokda var
Gerkon modulu KY-021və ya adi 2 ayaqlı gerkon3.00 ₼Stokda var- Kiçik maqnitgerkonu işə salır — qapıya yapışdırılır
Breadboard, 830 nöqtə5.00 ₼Stokda var
Jumper naqillər (M-M, 20 sm)40 ədədlik dəst3.00 ₼Stokda var
Mikro-USB kabelməlumat ötürən3.00 ₼Stokda var
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
- Telegram-da axtarışa BotFather yaz, mavi təsdiq nişanlı hesabı aç və «Start» bas.
/newbotəmrini göndər.- Bota ad ver — məsələn «Ev Sistemləri».
- İ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. - 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:
- Yaratdığın botu Telegram-da tap,
/startbas və istənilən test mesajı yaz. - Brauzerdə aşağıdakı linki aç —
TOKENyerinə öz tokenini yaz. - Cavabda
"chat":{"id":123456789hissəsini tap — bu rəqəm sənin chat ID-ndir. Kopyala.
https://api.telegram.org/botTOKEN/getUpdatesArduino IDE-ni ESP8266 üçün hazırlamaq
- File → Preferences pəncərəsində «Additional boards manager URLs» sahəsinə aşağıdakı linki əlavə et.
- Tools → Board → Boards Manager-də
esp8266yaz və «esp8266 by ESP8266 Community» paketini qur. - Kartı USB ilə kompüterə qoş. Tools → Board-dan «NodeMCU 1.0 (ESP-12E Module)», Tools → Port-dan kartın portunu seç.
https://arduino.esp8266.com/stable/package_esp8266com_index.jsonKod
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.
/*
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
- Upload düyməsini bas. ESP8266-ya yükləmə Arduino-ya nisbətən uzun çəkir — 30–60 saniyə normaldır.
- Serial Monitor-u 115200 baud ilə aç və «Wi-Fi bağlantısı uğurludur» yazısını gözlə.
- Telegram-a «✅ Ev sistemi işə düşdü» mesajı gəlməlidir.
- 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ə/startyazmamı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 = HIGHyaz. - 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.

