بناء كاشف الحواجز الذكي وتنبيهات فورية على تليكرام باستخدام ESP8266
في هذا الدليل التفصيلي، ستتعلم:
- المكونات الأساسية التي تحتاجها لبناء المشروع.
- كيفية توصيل الحساس باللوحة الإلكترونية خطوة بخطوة.
- كيفية إعداد بوت تليجرام الخاص بك.
- شرح كود البرمجة اللازم لقراءة الحساس وإرسال الرسائل.
- نصائح لتحسين المشروع واستكشاف الأخطاء الشائعة.
هيا بنا نبدأ في بناء نظامك الذكي للكشف عن الحواجز وتلقي التنبيهات!
ما هو الكشف عن الحواجز باستخدام الاردوينو (أو لوحة متوافقة)؟
لماذا ندمج الكشف عن الحواجز مع بوت تليجرام؟
الكشف عن الحواجز بحد ذاته مفيد في التطبيقات التي تكون فيها اللوحة والحساس في نفس المكان الذي تحتاج فيه إلى إجراء فوري (مثل روبوت يتجنب الاصطدام). ولكن في كثير من الحالات، قد ترغب في أن تكون على دراية بوجود حاجز عن بعد. هنا يأتي دور التكامل مع بوت تليجرام.
دمج الكشف عن الحواجز مع بوت تليجرام يمنحك المزايا التالية:
- تنبيهات فورية عن بعد: تتلقى إشعارًا على هاتفك بمجرد اكتشاف حاجز، بغض النظر عن مكان وجودك.
- سهولة الوصول: تليجرام هو تطبيق مراسلة شائع ومجاني ومتاح على معظم الأجهزة.
- مرونة: يمكنك تخصيص الرسالة التي يرسلها البوت لتشمل تفاصيل مثل وقت الاكتشاف أو حتى قراءة المسافة الفعلية.
- سجل التنبيهات: يحتفظ تليجرام بسجل للرسائل، مما يسمح لك بمراجعة متى تم اكتشاف الحواجز.
- مجاني وسهل الاستخدام: إنشاء البوت واستخدامه مجاني، والتعامل مع واجهة برمجة تطبيقات تليجرام (Telegram Bot API) سهل نسبيًا للمبتدئين باستخدام المكتبات المتاحة.
باختصار، هذا التكامل يحول مشروع الكشف المحلي إلى نظام مراقبة عن بعد فعال وذكي.
المكونات اللازمة للمشروع
- لوحة تطوير ESP8266 NodeMCU: هذه اللوحة هي العقل المدبر للمشروع. تحتوي على متحكم دقيق قوي وWi-Fi مدمج.
- حساس مسافة بالموجات فوق الصوتية HC-SR04: هذا هو الحساس الذي سيكتشف وجود الحواجز عن طريق قياس المسافة.
- أسلاك توصيل (Jumper Wires): ستحتاج إلى حوالي 4-5 أسلاك توصيل من نوع ذكر-أنثى (Male-Female) لتوصيل الحساس باللوحة.
- كابل Micro USB: لتوصيل لوحة ESP8266 بالكمبيوتر للبرمجة وتزويدها بالطاقة.
- مزود طاقة 5V (اختياري): مثل شاحن هاتف قديم مع كابل Micro USB، لتشغيل المشروع بشكل مستقل بعد البرمجة.
- شبكة Wi-Fi: تحتاج إلى شبكة Wi-Fi لتتمكن اللوحة من الاتصال بالإنترنت وإرسال رسائل تليجرام.
إعداد الدائرة الإلكترونية (توصيل المكونات)
إليك كيفية التوصيل:
- VCC: قم بتوصيل طرف VCC في حساس HC-SR04 بطرف 3.3V (أو أحيانًا VU الذي يتصل بـ 5V إذا كان متوفرًا على اللوحة ويعمل بشكل جيد مع الحساس) على لوحة ESP8266. لوحة ESP8266 تعمل بجهد 3.3V، ومعظم حساسات HC-SR04 تعمل بشكل جيد عند هذا الجهد، لكن بعضها قد يتطلب 5V. إذا واجهت مشاكل، يمكنك محاولة توصيله بـ VU إذا كانت لوحتك توفره وتشغله بجهد 5V من خلال USB. لنفترض أننا نستخدم 3.3V كبداية.
- GND: قم بتوصيل طرف GND في حساس HC-SR04 بطرف GND (الأرضي) على لوحة ESP8266. يوجد عادةً أكثر من طرف GND واحد على اللوحة، اختر أيًا منها.
- Trig (Trigger): هذا الطرف يستخدم لإرسال النبضة فوق الصوتية. قم بتوصيله بأي طرف رقمي (Digital Pin) على لوحة ESP8266. سنستخدم الطرف D1 (الذي يقابل GPIO5 في تسميات ESP8266 الفعلية).
- Echo: هذا الطرف يستقبل الصدى ويعطي نبضة عرضها يعتمد على زمن عودة الصدى. قم بتوصيله بأي طرف رقمي آخر على لوحة ESP8266. سنستخدم الطرف D2 (الذي يقابل GPIO4).
ملحوظة هامة: عند توصيل طرف Echo بلوحة ESP8266 (التي تعمل بجهد 3.3V)، قد تحتاج نظريًا إلى استخدام مقسم جهد (voltage divider) لأن طرف Echo في HC-SR04 يعمل بجهد 5V. ومع ذلك، في الممارسة العملية، غالبًا ما يعمل الحساس بشكل موثوق عند توصيل طرف Echo مباشرة بأطراف الإدخال/الإخراج الرقمية (I/O pins) لـ ESP8266 التي تكون متسامحة مع جهد 5V (5V tolerant) على الدخل، أو لأن الإشارة الناتجة من Echo قد لا تصل دائمًا إلى 5V الكاملة. لتجنب أي ضرر محتمل للأطراف الرقمية للوحة ESP8266 على المدى الطويل، يوصى باستخدام مقسم جهد إذا أمكن، باستخدام مقاومتين (مثل 1k Ohm و 2k Ohm) لتخفيض جهد إشارة Echo من 5V إلى حوالي 3.3V. مع ذلك، في العديد من المشاريع البسيطة للمبتدئين، يتم التوصيل المباشر ويعمل بنجاح (لكن على مسؤوليتك). في هذا الدليل، سنفترض التوصيل المباشر للتبسيط، لكن كن على دراية بمقسم الجهد كتحسين محتمل.
إعداد بيئة البرمجة (Arduino IDE)
إذا لم تكن قد استخدمت Arduino IDE من قبل لبرمجة لوحات ESP8266، فستحتاج إلى إعدادها أولاً.1- تنزيل وتثبيت Arduino IDE: قم بتنزيل أحدث إصدار من Arduino IDE من الموقع الرسمي (arduino.cc) وتثبيته على جهاز الكمبيوتر الخاص بك.
2- إضافة دعم لوحات ESP8266:
- افتح Arduino IDE.
- اذهب إلى File > Preferences (ملف > تفضيلات).
- في الحقل Additional Boards Manager URLs (روابط مديري لوحات إضافية)، أضف الرابط التالي:
- إذا كان لديك روابط أخرى بالفعل، أضف فاصلة (,) قبل لصق الرابط الجديد.
- اضغط OK.
- اذهب إلى Tools > Board > Boards Manager... (أدوات > لوحة > مدير اللوحات...).
- ابحث عن esp8266.
- حدد esp8266 by ESP8266 Community واضغط على Install. انتظر حتى يكتمل التثبيت.
- في Arduino IDE، اذهب إلى Sketch > Include Library > Manage Libraries... (الرسم > تضمين مكتبة > إدارة المكتبات...).
- ابحث عن UniversalTelegramBot.
- حدد المكتبة التي كتبها Brian Schwind أو ما شابه واضغط على Install. سيُطلب منك غالبًا تثبيت مكتبات تابعة أخرى (مثل ArduinoJson, ESP8266HTTPClient, WiFiClientSecure). وافق على تثبيتها جميعًا.
الآن أصبحت بيئة التطوير جاهزة لكتابة الكود وتحميله على لوحة ESP8266.
إعداد بوت تليكرام الخاص بك- إنشاء البوت باستخدام BotFather:
- افتح تطبيق تليجرام وابحث عن المستخدم @[BotFather].
- ابدأ محادثة معه واكتب الأمر /start.
- اكتب الأمر /newbot.
- سيطلب منك اختيار اسم لبوتك (مثال: My Obstacle Detector Bot). اكتب الاسم وأرسله.
- سيطلب منك اختيار اسم مستخدم لبوتك، يجب أن ينتهي بكلمة "bot" (مثال: MyObstacleDetector_bot). اكتب اسم المستخدم وأرسله.
إذا كان الاسم متاحًا، سيقوم BotFather بإنشاء البوت ويعطيك رسالة تهنئة تحتوي على HTTP API Token (رمز API الخاص بالبوت). هذا الرمز هو مفتاحك للتحكم في البوت، احتفظ به في مكان آمن ولا تشاركه مع أحد. ستحتاج هذا الرمز في كود الأردوينو.
2- الحصول على Chat ID الخاص بك:
- ابدأ محادثة جديدة مع البوت الذي أنشأته للتو في تليجرام.
- أرسل له أي رسالة (مثال: "مرحباً").
- الآن، لكي تعرف Chat ID الخاص بهذه المحادثة، تحتاج إلى استخدام متصفح الويب للوصول إلى واجهة برمجة تطبيقات تليجرام. افتح متصفحك وأدخل الرابط التالي، مع استبدال <YOUR_BOT_TOKEN> بالرمز الذي حصلت عليه من BotFather:
https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates
- إذا أدخلت الرمز بشكل صحيح وأرسلت رسالة للبوت، سترى صفحة JSON تحتوي على معلومات حول الرسائل التي تلقاها البوت. ابحث عن حقل يسمى "chat" وداخله ستجد حقل "id". القيمة الرقمية لهذا الحقل هي Chat ID الخاص بالدردشة بينك وبين البوت. ستحتاج هذا الرقم في كود الأردوينو.
كود الأردوينو للمشروع
سيقوم الكود بالمهام التالية:
- الاتصال بشبكة Wi-Fi.
- تهيئة الاتصال ببوت تليجرام باستخدام الرمز ومعرف الدردشة.
- قراءة المسافة من حساس HC-SR04.
- التحقق مما إذا كانت المسافة أقل من عتبة محددة (الكشف عن حاجز).
- إرسال رسالة تنبيه إلى بوت تليجرام عند اكتشاف حاجز.
- تجنب إرسال رسائل متكررة باستمرار عند وجود حاجز.
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>#include <UniversalTelegramBot.h>#include <ArduinoJson.h> // متطلب لمكتبة Telegram (تم تثبيتها معها عادةً)// تعريف معلومات شبكة الواي فاي الخاصة بك#define WIFI_SSID "اسم_شبكتك_هنا"#define WIFI_PASSWORD "كلمة_مرور_شبكتك_هنا"// تعريف رمز بوت تليجرام الخاص بك ومعرف الدردشة#define BOT_TOKEN "رمز_بوت_تليجرام_الخاص_بك_هنا" // من BotFather#define CHAT_ID "معرف_الدردشة_الخاص_بك_هنا" // الرقم الذي حصلت عليه من getUpdates// تعريف أطراف الحساس بالموجات فوق الصوتية (Trig و Echo)// استخدم تسميات أطراف لوحة NodeMCU// D1 = GPIO5, D2 = GPIO4const int TRIGGER_PIN = D1; // الطرف المتصل بـ Trig في الحساسconst int ECHO_PIN = D2; // الطرف المتصل بـ Echo في الحساس// تعريف أقصى مسافة للكشف بالموجات فوق الصوتية (بالسنتيمتر)// المسافة التي بعدها لا يهمنا وجود شيء (مثلاً 200 سم = 2 متر)#define MAX_DISTANCE 200// تعريف عتبة المسافة التي نعتبرها حاجزًا (بالسنتيمتر)const int OBSTACLE_THRESHOLD = 30; // مثال: أي شيء أقرب من 30 سم يعتبر حاجزًا// تعريف مدة الانتظار بين كل قراءة للحساس بالمللي ثانية// هذا يساعد في استقرار القراءات وعدم إرسال رسائل متكررة بسرعة فائقةconst long READ_INTERVAL = 100; // اقرأ كل 100 مللي ثانية// تعريف مدة الانتظار بين كل رسالة تليجرام يتم إرسالها عند اكتشاف حاجز// لتجنب إغراقك بالرسائل إذا بقي الحاجز لفترة طويلةconst long TELEGRAM_SEND_INTERVAL = 5000; // لا ترسل أكثر من رسالة كل 5 ثوانٍ// إنشاء كائن للاتصال بالواي فاي بشكل آمن لـ Telegram HTTPSWiFiClientSecure client;// إنشاء كائن بوت تليجرامUniversalTelegramBot bot(BOT_TOKEN, client);// لتخزين آخر وقت تم فيه قراءة الحساس وإرسال رسالة تليجرامunsigned long lastReadTime = 0;unsigned long lastTelegramSendTime = 0;// متغير لتتبع ما إذا كان هناك حاجز مكتشف حاليًا لمنع الرسائل المتكررةbool obstacleDetected = false;// *** ملاحظة بخصوص مكتبة الحساس ***// مكتبة NewPing هي خيار ممتاز للتعامل مع HC-SR04 وتبسط الكود.// إذا لم تكن مثبتة، قم بتثبيتها من Library Manager في Arduino IDE// ابحث عن "NewPing" وثبت المكتبة التي كتبها Tim Eckel.// سنستخدم هذه المكتبة لأنها تتعامل مع تفاصيل عمل الحساس بشكل أفضل.#include <NewPing.h>NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // كائن NewPing: (طرف Trig, طرف Echo, أقصى مسافة)void setup() {Serial.begin(115200); // بدء الاتصال التسلسلي لرؤية المخرجات Debugging// تهيئة الاتصال بالواي فايSerial.print("Connecting to WiFi: ");Serial.println(WIFI_SSID);WiFi.begin(WIFI_SSID, WIFI_PASSWORD);// الانتظار حتى يتم الاتصال بالواي فايwhile (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected.");Serial.print("IP address: ");Serial.println(WiFi.localIP());// تهيئة وقت النظام (يُستخدم من قبل مكتبة تليجرام لعمليات التشفير)// هذه الخطوة مهمة لعمل الاتصال الآمن HTTPSconfigTime(0, 0, "pool.ntp.org"); // استخدم خوادم NTP لضبط الوقتSerial.println("Waiting for NTP time sync...");time_t now = time(nullptr);while (now < 1000) { // انتظر حتى يتم الحصول على وقت صحيحdelay(500);now = time(nullptr);}Serial.println("Time synced.");// يجب أن يتم تعيين شهادات الجذر لمكتبة Telegram// لمزيد من الأمان والاتصال الصحيح بخوادم تليجرام// غالبًا ما تحتاج هذه المكتبة لشهادة معينة، يمكن إيجادها في أمثلة المكتبة// كمثال، قد تحتاج هذه الأسطر (تختلف حسب المكتبة وإصدارها):// client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // استخدم الشهادة المضمنة في المكتبة// تحقق من مثال مكتبة UniversalTelegramBot المسمى "ESP8266_sendPhoto" أو "ESP8266_ReceiveMessages"// لمعرفة كيفية تحميل الشهادة الصحيحة إذا لزم الأمر.// في أبسط أشكالها، قد يعمل بدونها في بعض الأحيان، لكن يفضل تضمينها للأمان والاستقرار.// مثال بسيط (قد لا يكون كافيًا دائمًا):// client.setInsecure(); // يسمح بالاتصال بدون التحقق الكامل من الشهادة - غير آمن للإنتاجSerial.println("Telegram bot setup done.");}void loop() {// التأكد من وجود اتصال واي فايif (WiFi.status() != WL_CONNECTED) {Serial.println("WiFi connection lost. Reconnecting...");WiFi.reconnect();// يمكن إضافة منطق انتظار أو إعادة تشغيل هنا إذا استمر فقدان الاتصالreturn; // لا تفعل شيئًا آخر حتى يعود الاتصال}// تحقق مما إذا كان قد حان وقت قراءة الحساس مرة أخرىif (millis() - lastReadTime > READ_INTERVAL) {lastReadTime = millis();// قراءة المسافة من الحساس// NewPing ترجع المسافة بالسنتيمتر// sonar.ping_cm() تقوم بإرسال النبضة واستقبال الصدى ثم حساب المسافة// ترجع 0 إذا لم يتم استقبال صدى (مما يعني أن الجسم بعيد جدًا أو غير موجود)unsigned int distance_cm = sonar.ping_cm();Serial.print("Distance: ");Serial.print(distance_cm);Serial.println(" cm");// تحقق مما إذا كانت المسافة أقل من العتبة وهل هي قراءة صالحة (أكبر من 0)// مسافة 0 تعني عدم وجود صدى، مما يعني لا يوجد حاجز قريب بما يكفي أو خطأ في القراءةbool currentObstacleStatus = (distance_cm > 0 && distance_cm <= OBSTACLE_THRESHOLD);// إذا تم اكتشاف حاجز الآن ولم يكن مكتشفًا من قبل (تغير الحالة من لا حاجز إلى حاجز)if (currentObstacleStatus && !obstacleDetected) {Serial.println("Obstacle detected!");// تحديث الحالة إلى تم اكتشاف حاجزobstacleDetected = true;// حاول إرسال رسالة تليجرام فورًا (مع احترام فترة الانتظار بين الرسائل)if (millis() - lastTelegramSendTime > TELEGRAM_SEND_INTERVAL) {String message = "تم اكتشاف حاجز! المسافة: " + String(distance_cm) + " سم.";bot.sendMessage(CHAT_ID, message);lastTelegramSendTime = millis(); // تحديث وقت آخر إرسالSerial.println("Telegram message sent.");} else {Serial.println("Waiting before sending next Telegram message.");}}// إذا لم يعد هناك حاجز ولكن كان مكتشفًا من قبل (تغير الحالة من حاجز إلى لا حاجز)else if (!currentObstacleStatus && obstacleDetected) {Serial.println("Obstacle cleared.");// تحديث الحالة إلى لا يوجد حاجزobstacleDetected = false;// يمكنك اختيار إرسال رسالة تفيد بإزالة الحاجز هنا إذا أردت// مثال:// if (millis() - lastTelegramSendTime > TELEGRAM_SEND_INTERVAL) {// String message = "تمت إزالة الحاجز. المسافة: " + String(distance_cm) + " سم.";// bot.sendMessage(CHAT_ID, message);// lastTelegramSendTime = millis();// Serial.println("Telegram 'cleared' message sent.");// }}// إذا بقي الحاجز مكتشفًا، نحاول إرسال رسالة تكرارية فقط إذا مرت فترة الانتظارelse if (currentObstacleStatus && obstacleDetected) {if (millis() - lastTelegramSendTime > TELEGRAM_SEND_INTERVAL) {String message = "لا يزال هناك حاجز. المسافة: " + String(distance_cm) + " سم.";bot.sendMessage(CHAT_ID, message);lastTelegramSendTime = millis();Serial.println("Telegram repeated message sent.");}}// إذا لم يكن هناك حاجز ولم يكن مكتشفًا من قبل (الحالة لم تتغير)، لا نفعل شيئًا خاصًا بالتنبيهات.}// معالجة رسائل تليجرام الواردة (إذا كنت تريد إضافة تفاعل، مثل التحكم في العتبة عن بعد)// هذه خطوة متقدمة وليست ضرورية للمشروع الأساسي، ولكن مكتبة تليجرام تسمح بها.// int numNewMessages = bot.getUpdates(bot.lastUpdateID + 1);// while (numNewMessages) {// handleNewMessages(numNewMessages);// numNewMessages = bot.getUpdates(bot.lastUpdateID + 1);// }// تأخير قصير في نهاية الحلقة لمنع تشغيلها بأقصى سرعة بدون داعي// يتم التحكم في توقيت قراءة الحساس وإرسال الرسائل بالفعل بواسطة READ_INTERVAL و TELEGRAM_SEND_INTERVAL// ولكن يمكن إضافة تأخير بسيط هنا (مثلاً 10 مللي ثانية) إذا لزم الأمر.// delay(10); // قد لا يكون ضروريًا بوجود check interval}// دالة لمعالجة الرسائل الجديدة (إذا كنت تريد تفعيل استقبال الرسائل)// void handleNewMessages(int numNewMessages) {// Serial.println("handling new messages");// for (int i = 0; i < numNewMessages; i++) {// String chat_id = String(bot.messages[i].chat_id);// String text = bot.messages[i].text;// String from_name = bot.messages[i].from_name;//// Serial.print(from_name);// Serial.print(" says: ");// Serial.println(text);//// if (text == "/start") {// String welcome = "أهلاً بك، " + from_name + "!\n";// welcome += "أنا بوت للكشف عن الحواجز. سأرسل لك رسالة عند اكتشاف حاجز.";// bot.sendMessage(chat_id, welcome);// }// // يمكنك إضافة أوامر أخرى هنا، مثل "/status" لعرض الحالة الحالية أو "/set_threshold 50" لتغيير العتبة// }// }
ملاحظات هامة حول الكود:
- WIFI_SSID: اسم شبكة الواي فاي الخاصة بك.
- WIFI_PASSWORD: كلمة مرور شبكة الواي فاي الخاصة بك.
- BOT_TOKEN: الرمز الذي حصلت عليه من BotFather.:
- CHAT_IDمعرف الدردشة الذي حصلت عليه من رابط .احصل على التحديثات
شرح كود الأردوينو بالتفصيل
دعنا نمر على الكود خطوة بخطوة لفهم آلية عمله:
2- تعريف الثوابت والمتغيرات: يتم تحديد معلومات الواي فاي وتليجرام، أطراف الحساس، عتبة المسافة، وأوقات الانتظار باستخدام أو defineconst int أو . هذه القيم يمكن تعديلها بسهولة في بداية الكود. يتم أيضًا تعريف كائنات const longWiFiClientSecure و وكائن UniversalTelegramBotNewPing للحساس.
3- متغيرات التوقيت والحالة: lastReadTime و يُستخدمان لتسجيل وقت آخر عملية قراءة للحساس وآخر إرسال رسالة تليجرام، وذلك لإدارة توقيت العمليات. lastTelegramSendTimeobstacleDetected هي علامة منطقية تُستخدم لتتبع ما إذا كان قد تم اكتشاف حاجز بالفعل في القراءة السابقة أو الحالية لمنع إرسال رسائل متكررة بلا داعي.
4- دالة :الإعداد()
- تبدأ الاتصال التسلسلي () لعرض معلومات أثناء التشغيل لأغراض التصحيح.Serial.begin
- تبدأ الاتصال بشبكة الواي فاي باستخدام اسم الشبكة وكلمة المرور المحددين.
- تنتظر حتى يتم الاتصال بالواي فاي بنجاح.
- تقوم بتهيئة وقت النظام باستخدام خوادم NTP، وهي خطوة ضرورية لعمل اتصال HTTPS الآمن الذي تتطلبه واجهة برمجة تطبيقات تليجرام.
- (خطوة الشهادات الاختيارية/الموصى بها) يتم إعداد العميل الآمن بالشهادات اللازمة للتحقق من هوية خادم تليجرام.
- تنتهي الدالة بالإشارة إلى أن إعداد بوت تليجرام قد تم.
- هذه الدالة هي قلب البرنامج وتعمل بشكل متكرر.
- التحقق من الواي فاي: تتأكد أولاً من أن الاتصال بالواي فاي لا يزال قائمًا، وإذا انقطع، تحاول إعادة الاتصال.
- إدارة التوقيت للقراءة: تستخدم (التي ترجع عدد المللي ثانية منذ بدء تشغيل اللوحة) مع millis()lastReadTime و للتأكد من أن قراءة الحساس لا تتم إلا بعد مرور الفترة الزمنية المحددة. هذا يمنع تحميل المعالج بقراءات مستمرة لا داعي لها.READ_INTERVAL
- قراءة الحساس: إذا حان وقت القراءة، يتم استدعاء من مكتبة NewPing للحصول على المسافة الحالية بالسنتيمتر.sonar.ping_cm()
- الكشف عن الحاجز: يتم مقارنة المسافة المقروءة مع .OBSTACLE_THRESHOLD
- منطق إرسال الرسائل:
- يتم استخدام المتغير لتحديد ما إذا كان هناك حاجز في القراءة الحالية.currentObstacleStatus
- إذا كانت صحيحة و currentObstacleStatusobstacleDetected كانت خاطئة (أي تم اكتشاف حاجز أو لأول مرةبعد إزالته) و مرت فترة منذ آخر رسالة، يتم إرسال رسالة "تم اكتشاف حاجز!" وتحديث TELEGRAM_SEND_INTERVALobstacleDetected إلى و truelastTelegramSendTime إلى الوقت الحالي.
- إذا كانت خاطئة و currentObstacleStatusobstacleDetected كانت صحيحة (أي بعد أن كان مكتشفًا)، يتم تحديث تمت إزالة الحاجزobstacleDetected إلى . يمكن إضافة خيار لإرسال رسالة "تمت إزالة الحاجز".false
- إذا كانت صحيحة و currentObstacleStatusobstacleDetected كانت صحيحة (أي )، يتم التحقق فقط مما إذا كان قد مرت فترة لا يزال هناك حاجزTELEGRAM_SEND_INTERVAL منذ آخر رسالة لإرسال رسالة تكرارية إذا لزم الأمر.
- معالجة رسائل تليجرام الواردة (اختياري): السطور المعلقة توضح كيف يمكنك استخدام لمعالجة الأوامر التي ترسلها أنت إلى البوت عبر تليجرام (مثل طلب الحالة أو تغيير الإعدادات) هذه ميزة متقدمة يمكنك إضافتها لاحقًا bot.getUpdates.
- تأخير: في نهاية يمكن إضافة تأخير بسيط إذا لزم الأمر، رغم أن إدارة التوقيت تتم بالفعل بواسطة فترات الانتظار الأخرى loop.
رفع الكود على لوحة ESP8266
بعد كتابة الكود (أو نسخه ولصقه) في Arduino IDE وتعديل البيانات الخاصة بالواي فاي وتليجرام، يمكنك الآن رفعه إلى لوحة ESP8266:
- توصيل اللوحة: قم بتوصيل لوحة ESP8266 NodeMCU بجهاز الكمبيوتر الخاص بك باستخدام كابل Micro USB.
- اختيار اللوحة الصحيحة: في Arduino IDE، اذهب إلى Tools > Board (أدوات > لوحة) وتأكد من تحديد "NodeMCU 1.0 (ESP-12E Module)".
- اختيار المنفذ الصحيح: اذهب إلى Tools > Port (أدوات > منفذ) واختر منفذ COM الذي ظهر عند توصيل اللوحة. يختلف اسم المنفذ من جهاز لآخر.
- رفع الكود: اضغط على زر السهم لليمين (Upload) في شريط الأدوات أو اذهب إلى Sketch > Upload (الرسم > رفع).
- الانتظار: ستظهر رسائل في الجزء السفلي من النافذة تشير إلى عملية التجميع (Compiling) ثم الرفع (Uploading). قد تحتاج لوحة NodeMCU إلى الضغط على زر FLASH (أو Boot) أثناء توصيلها أو الضغط على زر RST (Reset) بعد بدء الرفع لتتمكن من الدخول في وضع البرمجة، لكن في معظم اللوحات الحديثة لا تكون هذه الخطوة ضرورية. انتظر حتى تظهر رسالة "Uploading done" أو ما يشابهها.
تشغيل واختبار المشروع
الآن وقد تم رفع الكود على لوحتك، يمكنك اختبار النظام:
- تزويد الطاقة: افصل اللوحة عن الكمبيوتر (إذا كنت تستخدم كابل البرمجة فقط) وقم بتوصيلها بمصدر طاقة 5V مستقل عبر كابل Micro USB (مثل شاحن هاتف).
- المراقبة (اختياري): إذا أردت رؤية مخرجات السيريال لمتابعة عملية الاتصال بالواي فاي وقراءات الحساس، يمكنك إعادة توصيل اللوحة بالكمبيوتر (دون رفع الكود مرة أخرى) وفتح "Serial Monitor" من Tools > Serial Monitor (أدوات > شاشة السيريال). تأكد من ضبط السرعة على 115200 baud.
- الاختبار: ضع الحساس بحيث يكون قادرًا على "رؤية" المنطقة التي تريد مراقبتها.
- في Serial Monitor (إذا كنت تستخدمه)، يجب أن ترى رسائل تفيد بالاتصال بالواي فاي، ثم رسائل "Distance: X cm".
- قم بوضع يدك أو أي جسم آخر أمام الحساس وعلى مسافة أقل من .OBSTACLE_THRESHOLD
- يجب أن ترى في Serial Monitor رسالة "Obstacle detected!" (وإذا أبقيت يدك هناك، رسالة "لا يزال هناك حاجز..." بعد فترة).
- بعد فترة قصيرة (حسب )، يجب أن تتلقى رسالة على تطبيق تليجرام الخاص بك من البوت الذي أنشأته تفيد بوجود حاجز والمسافة المقاسة.TELEGRAM_SEND_INTERVAL
- قم بإزالة الحاجز، يجب أن ترى في Serial Monitor رسالة "Obstacle cleared." (إذا لم تقم بإضافة رسالة تليجرام عند الإزالة في الكود، فلن تتلقى تنبيهًا بذلك).
- كرر العملية للتأكد من أن التنبيهات تصل بشكل موثوق.
استكشاف الأخطاء الشائعة
- تأكد من كتابة و WIFI_SSIDWIFI_PASSWORD بشكل صحيح (تحقق من حالة الأحرف).
- تأكد من أن لوحة ESP8266 في نطاق تغطية شبكة الواي فاي.
- تأكد من أن جهاز الراوتر الخاص بك يسمح للأجهزة الجديدة بالاتصال.
- تأكد من كتابة و BOT_TOKENCHAT_ID بشكل صحيح تمامًا (لا تنسخ أي مسافات إضافية). الرمز والمعرف حساسان لحالة الأحرف.
- تأكد أن لوحة ESP8266 لديها اتصال إنترنت (يمكنك محاولة ping أي موقع من الكود للتحقق).
- تأكد أنك قمت بمحادثة البوت وأرسلت له رسالة واحدة على الأقل قبل محاولة الحصول على .CHAT_ID
- تحقق من إعدادات الشهادات في الكود (الجزء المتعلق بـ أو client.setCACertclient.setInsecure). قد تحتاج للبحث عن كيفية إعداد شهادات Telegram Root Certificate لمكتبة UniversalTelegramBot مع ESP8266 إذا لم يعمل الاتصال الآمن.
- تأكد من أن وقت النظام () قد تمت مزامنته بنجاح (راقب Serial Monitor).configTime
- تأكد من التوصيلات الكهربائية بشكل صحيح (VCC, GND, Trig, Echo بالأطراف الصحيحة على ESP8266).
- تأكد من أن طرف Trig موصل بطرف الإخراج الرقمي وطرف Echo موصل بطرف الإدخال الرقمي كما هو محدد في الكود.
- إذا كنت تستخدم التوصيل المباشر لطرف Echo بـ ESP8266 (3.3V)، حاول إضافة مقسم جهد كما ذكرنا سابقًا كتحسين محتمل.
- تأكد من أن الحساس يعمل بشكل صحيح (يمكن اختباره بشكل منفصل باستخدام كود بسيط يقرأ فقط من الحساس ويطبع المسافة على السيريال).
- تأكد من ضبط بشكل معقول.MAX_DISTANCE
- تأكد من عدم وجود عوائق قريبة جدًا (أقل من بضعة سنتيمترات) من وجه الحساس نفسه، فقد يؤثر ذلك على قراءاته.
تحسينات محتملة للمشروع
هذا المشروع هو نقطة انطلاق ممتازة. إليك بعض الأفكار لتحسينه وتوسيعه:
- إضافة مؤشرات مرئية أو صوتية: قم بتوصيل صمام ثنائي باعث للضوء (LED) ليضيء عند اكتشاف حاجز، أو استخدم جرس إلكتروني (Buzzer) لإصدار صوت تنبيه.
- استخدام حساسات أخرى: جرب استخدام حساسات مسافة تعمل بالأشعة تحت الحمراء أو الليزر، قد تكون مناسبة لتطبيقات مختلفة.
- إضافة واجهة ويب بسيطة: بدلاً من الاعتماد فقط على تليجرام، يمكنك بناء خادم ويب بسيط على ESP8266 لعرض الحالة الحالية للحاجز أو المسافة المقاسة.
- تكوين عن بعد عبر تليجرام: فعل الجزء المعلق من الكود لمعالجة رسائل تليجرام الواردة. يمكنك إضافة أوامر لتغيير عتبة الكشف، أو تفعيل/تعطيل التنبيهات، أو طلب قراءة المسافة الحالية.
- تسجيل البيانات: قم بتسجيل أوقات اكتشاف الحواجز في بطاقة SD (تتطلب إضافة قارئ بطاقة SD للوحة) أو أرسل البيانات إلى منصة إنترنت الأشياء (IoT platform) مثل Thingspeak أو Ubidots لتسجيلها وعرضها بيانيًا.
- استخدام ESP32: لوحات ESP32 أكثر قوة وتحتوي على بلوتوث وWi-Fi، وتوفر المزيد من الأطراف الرقمية. يمكن استخدامها لنفس المشروع مع تعديلات بسيطة في الكود والتوصيلات.
- تطبيقات متنوعة: استخدم هذا المشروع كأساس لبناء نظام مراقبة للمنزل، أو نظام إنذار بسيط، أو حساس اقتراب للأشخاص، أو جزء من مشروع روبوت معقد.