سنراقب في هذا المشروع وضع الباب باستخدام ESP8266 NodeMCU ومفتاح قصبي مغناطيسي (magnetic reed switch) إذ سيصلك إشعار على حسابك على تلغرام يخبرك بحالة الباب مفتوحاً كان أم مغلقاً أينما كنت عندما يكون هاتفك متصلاً بالإنترنت.
سنبرمج لوح ESP8266 باستخدام أردوينو IDE.
نظرة عامة
سننشئ في هذا المشروع بوت bot على تطبيق تلغرام والذي سيرسل رسائل إلى حسابك على تلغرام عندما تتغير وضعية الباب، ولتتبُّع هذا التغيير سنستخدم مفتاحاً تلامسياً مغناطيسياً وهو عبارة عن مفتاح قصبي reed switch مغلف بالبلاستيك، مما يسهل وضعه على الباب أو النافذة أو الدرج لتتبع حالته إن كان مفتوحاً أم مغلقاً.
تكون الدارة مغلقة عندما يكون المغناطيس قريباً من المفتاح القصبي والباب مغلقاً، أما عندما يكون المغناطيس بعيداً عن المفتاح القصبي فالباب مفتوح والدارة مفتوحة كما في الشكل أدناه.
يمكن وصل المفتاح المغناطيسي لـ ESP8266 GPIO لتحري تغيرات الحالة.
مقدمة عن تطبيق تلغرام
هو تطبيق مراسلة فورية وصوتية قائم على السحابة وخدمة IP .
يمكن تثبيت التطبيق بسهولة فهو متاح للتحميل على هاتفك الذكي (سواء ذو النظام أندرويد Andoid أومن آبلApple ) أو على الحاسوب (حاسوب شخصي وماك ولينكس)، كما أنه مجاني وخالٍ من الإعلانات، ويسمح لك بإنشاء بوت خاص والتفاعل معه.
يمثل البوت تطبيق الطرف الخارجي الذي يعمل ضمن تلغرام، حيث يمكن للمستخدمين التفاعل مع البوت بإرسال الرسائل والأوامر والطلبات المنسقة، وبإمكانك التحكم بالبوت باستخدام طلبات HTTP لخدمة بوت التلغرام API.
ستتفاعل ESP8266 مع البوت عبر إرسال الرسائل لحسابك على تلغرام عندما تتغير حالة الباب فستتلقى إشعاراً على هاتفك الذكي (طالما لديك اتصال بالإنترنت).
إنشاء بوت تلغرام
اذهب إلى المتجر المتوفر لديك Google play أو App store وقم بتحميل تلغرام وتثبيته.
افتح التلغرام واتبع الخطوات التالية لإنشاء البوت.
أولاً، ابحث عن كلمة botfather، واضغط عليها كما هو مبين أدناه، أو افتح هذا الرابط على هاتفك المحمول t.me/botfather
ستُفتح النافذة التالية وستتمكن من الضغط على زر البدء.
اكتب /newbot واتبع الخطوات لإنشاء البوت الخاص بك:
سمِّه وأعطِه اسم مستخدم، سنسمي البوت الخاص بهذا المشروع Door sensor واسم المستخدم ESPDoorSensorBot
إذا تم إنشاء البوت بنجاح ستتلقى رسالة مع رابط للدخول للبوت ورمز هذا البوت.
احفظ رمز البوت لإنك ستحتاجه ليقدر لوح ESP8266 على التفاعل مع البوت.
إرسال رسالة إلى البوت
هذه الخطوة مهمة للغاية، يجب ألّا نغفل عنها فبدونها لن يعمل المشروع. عليك إرسال رسالة من حسابك على تلغرام إلى البوت الذي قمت بإنشائه لتفعيل قيامه بإرسال الرسائل إليك.
- عد مجدداً لقائمة الدردشات وفي قائمة البحث اكتب اسم مستخدم البوت الذي أنشأته
- قم باختيار البوت لبدء المحادثة
- اضغط على رابط البدء
والآن بإمكانك المتابعة في القسم التالي من المشروع
كيف تحصل على هوية المستخدم خاصتك على تلغرام
لإرسال رسالة إلى حسابك يحتاج البوت للتعرف على هوية مستخدم حسابك، لذلك
اكتب بقائمة البحث myidbot أو افتح الرابط التالي t.me/myidbot
ابدأ المحادثة مع البوت واكتب /getid وستحصل على رد بهوية المستخدم الخاصة بك، لا تنسى حفظها لأنك ستحتاجها لاحقاً.
تحضير أردوينو IDE
سنبرمج لوح ESP8266 باستخدام بيئية تطوير أردوينو (IDE) لذلك تحقق من إضافة اللوح في بيئة أردوينو ولتحميل لوح ESP8266 في أردوينو تصفح المقال هنا.
مكتبة بوت تلغرام
للتفاعل مع بوت تلغرام سنستخدم مكتبة بوت تلغرام والمصممة بوساطة بريان لووف Brian lough والتي توفر واجهة برمجية سهلة لبوت تلغرام API
اتبع الخطوات التالية لتثبيت أحدث إصدار مكتبة متوفر:
- اضغط هنا لتحميل مكتبة تلغرام بوت.
- اذهب إلى ملف>تضمين مكتبة>إضافة مكتبة.ZIP
- أضف المكتبة التي قمت بتحميلها
ملاحظة: لا تثبّت المكتبة من مدير المكتبات في بيئة أردوينو فقد يُثبت أحد الإصدارات القديمة.
وللمزيد من التفاصيل عن المكتبة اضغط هنا.
مكتبة ArduinoJson
عليك تثبيت مكتبة ArduinoJson أيضاً لذلك اتبع الخطوات التالية:
- اذهب إلى ملف>تضمين مكتبة>إدارة المكتبات
Sketch > Include Library > Manage Libraries
- ابحث عن “ArduinoJson”
- قم بتحميل المكتبة
هنا نستخدم مكتبة ArduinoJson إصدار 6.15.2
المعدات المطلوبة لإكمال المشروع:
- لوح ESP8266
- مفتاح مغناطيسي
- مقاومة 10kΩ
- لوح توصيل
- أسلاك
وصلنا هنا المفتاح المغناطيسي إلى GPIO 4 (D2) ولكن بإمكانك وصله لأي GPIO مناسب.
البرمجة والتعليمات البرمجية:
انسخ النص البرمجي التالي في بيئة أردوينو Arduino IDE واستبدل اسم شبكة الإنترنت (SSID) وكلمة المرور ورمز البوت وهوية المستخدم ببياناتك.
لتحميل الكود البرمجي الأول: اضغط هنا.
كيفية عمل البرنامج:
واصل القراءة إذا أردت معرفة كيفية عمل الكود أو تخطى الفقرات إلى فقرة التوضيح
أولاً: ضمّن المكتبات المطلوبة
<include<ESP8266WiFi.h#
<include<WiFiClientSecure.h#
<include<UniversalTelegramBot.h#
<include<ArduinoJson.h#
اضبط GPIO للمفتاح المغناطيسي والليد (على اللوح الليد يمثل GPIO 2) حيث سيضاء الليد على اللوح عندماً يكون الباب مفتوحاً
;const int reedSwitch = 4
const int led = 2; //optional
إن المتغير المنطقيchangeState سيتحقق من حالة تغير وضع الباب.
;bool changeState = false
المتغير state سيمثل حالة المفتاح والمتغير doorState فكما يشير اسمه سيمثل حالة الباب مفتوح أم مغلق.
;bool state
;String doorState
متغيرات المؤقت الزمني التالية تسمح لنا بتخطي المفتاح القصبي، حيث سيُأخذ بعين الاعتبار التغيرات التي حدثت خلال 1500 ميلي ثانية على الأقل
;unsigned long previousMillis = 0
;const long interval = 1500
أدخل اسم الشبكة وكلمة المرور في المتغيرات التالية ليتصل لوح ESP8266 بالإنترنت.
;"const char* ssid = "REPLACE_WITH_YOUR_SSID
;"const char* password = "REPLACE_WITH_YOUR_PASSWORD
أدخل رمز بوت التلغرام الخاص.
"define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#
ادخل معرف (ID) المحادثة.
"define CHAT_ID "XXXXXXXXXX#
أنشئ عميل Wi-Fi جديد مع WiFiClientSecure
;X509List cert(TELEGRAM_CERTIFICATE_ROOT)
;WiFiClientSecure client
أنشأ بوت مع رمز وعميل معرف سابقاً.
;UniversalTelegramBot bot (BOTtoken, client)
سيعمل تابع changeDoorStatus() عندما يطرأ أي تغيير على حالة الباب وهذا التابع سيحول المتغير changeState إلى true، ثم في loop()سنعالج ما يحدث عندما تتغير الحالة (عكس حالة الباب السابقة وإرسال رسالة لحسابك على تلغرام).
} ()ICACHE_RAM_ATTR void changeDoorStatus ;Serial.println("State changed") ;changeState = true {
تابع setup()
سوف يهيئ هذا التابع الشاشة التسلسلية بهدف كشف الأخطاء:
;Serial.begin(115200)
أضف شهادة الأصل (root certificate) إلى api.telegram.org
client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
حدد المفتاح المغناطيسي كدخل واحفظ الحالة الحالية عندما يبدأ ESP8266 بالعمل
;pinMode(reedSwitch, INPUT_PULLUP)
;state = digitalRead(reedSwitch)
حدد الليد كخرج وحدد حالته لتطابق حالة المفتاح المغناطيسي (الدارة مغلقة فالليد عات، والدارة مفتوحة فالليد مضيء)
;pinMode(led, OUTPUT) ;digitalWrite(led, state)
– الباب مغلق ← يقرأ ESP8266 إشارة HIGH ←إطفاء الليد على اللوح (إرسال إشارة HIGH)
– الباب مفتوح ← يقرأ ESP8266 إشارة LOW ←تشغيل الليد على اللوح (إرسال إشارة LOW)
يعمل الليد المدرج على لوح ESP8266 بمنطق معكوس (إرسال إشارة HIGH لإطفاء الليد وإشارة LOW لتشغيله)
تعيين المقاطعة:
سنعيّن المفتاح المغناطيسي كمقاطعة.
;attachInterrupt(digitalPinToInterrupt(reedSwitch), changeDoorStatus, CHANGE)
لتعيين مقاطعة في بيئة أردوينو نستخدم التابع () attachInterrupt والذي يقبل الحالات التالية كمعاملات: رقم الطرف الذي سيتسبب بالمقاطعة، واسم التابع الذي يجب أن يُفعّل، والوضع.
المعامل الأول والتي تمثل طرف المقاطهعة فعليك استخدام digitalPinToInterrupt (GPIO) لتعيين الطرف المستخدم كطرف مسبب للمقاطعة.
المعامل الثاني لتابع () attachInterrupt هو اسم التابع الذي سيُستدعى كل مرة تُشغَّل بها المقاطعة – تابع خدمة المقاطعة ISR وفي هذه الحالة يكون هو التابع changeDoorStatus
يجب أن يكون تابع ISR بسيطاً قدر الإمكان لكي يعود المعالج لتنفيذ البرنامج الرئيسي بسرعة.
ويتمثل المعامل الثالث بالوضع حيث نختار القيمة CHANGE لتشغيل المقاطعة عندما تتغير القيمة على الرجل مثل من HIGH إلى LOW أو من LOW إلى HIGH.
تهيئة شبكة الانترنت Wi-Fi
تمثل السطور التالية ربط ESP8266 ب Wi-Fi
;WiFi.mode(WIFI_STA) ;WiFi.begin(ssid, password) } while (WiFi.status() != WL_CONNECTED) ;delay(500) ;(".")Serial.print {
;("")Serial.println
;Serial.println("WiFi connected")
أرسل رسالة لحسابك على تلغرام لإعلامه أن البوت بدأ بالعمل
;bot.sendMessage(CHAT_ID, "Bot started up", "")
تابع loop()
وهنا سنقرأ المتغير changeState وإذا حصل تغيير ستصل رسالة لحسابك التلغرام
أولاً: تحقق إذا طرأ تغيير
} if (changeState)
ثم تحقق إذا مرت 1500 ميلي ثانية على الأقل منذ آخر حالة تغيير حصلت
} if(currentMillis - previousMillis >= interval)
إذا كان true أعد ضبط المؤقت وأعكس حالة المفتاح الحالية
;state = !state
إذا كان المفتاح في الوضع 1 (true) فالباب مغلق، بذلك يمكننا تعديل المتغير doorState إلى closed.
} if(state) ;"doorState = "closed }
وإذا كان 0 (false) فالباب مفتوح
} else ;"doorState = "open {
عيّن حالة الليد وفقاً لذلك واطبع حالة الباب في شاشة العرض التسلسلية.
;digitalWrite(led, state) ;changeState = false ;Serial.println(state) ;Serial.println(doorState)
وأخيراً سيرسل السطر التالي إشعاراً لحسابك على تلغرام بوضع الباب الحالي.
;bot.sendMessage(CHAT_ID, "The door is " + doorState, "")
التوضيح
بعد تعديل تلك التعليمات لتضمين بيانات شبكتك ورمز البوت وهوية المستخدم، حملها إلى ESP8266 عبر الذهاب إلى أدوات > اللوحة واختر ESP8266 ثم اذهب إلى أدوات>المنفذ واختر منفذ COM المناسب.
افتح شاشة العرض التسلسلية على معدل بود 115200 للتحقق من حدوث أي تغيير.
من أجل النموذج الأولي والاختبار بإمكانك تعليق المفتاح مغناطيسي على الباب باستخدام شريط لاصق.
والآن عندما يُفتح أو يُغلق الباب ستتلقى رسالة على حسابك على تلغرام.
تعلمنا في هذا المقال كيفية إرسال إشعار على حساب تلغرام عندما تتغير حالة المفتاح القصبي والذي يكون مفيداً لتعقب حالة الباب والنوافذ والدرج إذا كانت مفتوحة أم مغلقة.
المصدر: هنا
ترجمة: سها اديب، مراجعة: رولا دنوره، تدقيق لغوي: حنين الغاليه، تصميم: علي العلي، تحرير: حسين هجران.