حاجز ليزر لكشف التسلل باستخدام حساس الضوء و ESP32
في الحلقة الثامنة من سلسلة ESP32 من الصفر سنصنع حاجز ليزر بسيطًا لكشف التسلل. طالما يصل شعاع الليزر إلى المقاومة الضوئية يبقى النظام في وضع المراقبة، وبمجرد قطع الشعاع يكتشف ESP32 الحدث ويشغّل جرس الإنذار.
الميزة المهمة في هذا المشروع هي أن الإنذار يبقى مشتغلًا حتى إذا عاد شعاع الليزر إلى الحساس، ولا تتم إعادة تسليح النظام إلا بعد إعادة تشغيل لوحة ESP32.
فيديو المشروع
فكرة المشروع
نعتمد في عملية الكشف على المقاومة الضوئية LDR التي تتغير مقاومتها حسب كمية الضوء الساقط عليها. نوجّه شعاع ليزر منخفض القدرة نحو الحساس، ثم يقرأ ESP32 الإشارة التناظرية الناتجة عبر GPIO34.
بعد معايرة الحساس نحدد قيمة عتبة Threshold تفصل بين حالتي وصول الليزر وانقطاعه. في التركيب المستخدم في الفيديو تنخفض قراءة الحساس عند قطع الشعاع. عندما تصبح القراءة أقل من العتبة، يفعّل ESP32 الترانزستور المتصل بـ GPIO23 فيعمل الجرس.
مسار العمل:
Laser → LDR → GPIO34 → ESP32 → GPIO23 → NPN Transistor → Buzzer
⚠️ تحذير مهم بخصوص الليزر: استخدم ليزرًا منخفض القدرة ومثبتًا باتجاه الحساس فقط. لا توجّه شعاع الليزر نحو العين أو نحو الأشخاص أو الأسطح العاكسة. الليزر ليس لعبة وقد يسبب أذى للعين.
المكونات المطلوبة
| المكوّن | الكمية / القيمة |
|---|---|
| لوحة ESP32 | 1 |
| مقاومة ضوئية LDR | 1 |
| مقاومة | 10kΩ |
| وحدة ليزر منخفض القدرة | 1 |
| جرس Buzzer يعمل بشكل مناسب عند 3.3V | 1 |
| ترانزستور NPN | 1 |
| مقاومة لقاعدة الترانزستور | 1kΩ |
| لوحة تجارب Breadboard | 1 |
| أسلاك توصيل Jumper Wires | حسب الحاجة |
توصيل حساس الضوء

نستخدم المقاومة الضوئية مع مقاومة 10kΩ لتكوين مقسم للجهد Voltage Divider. يتم توصيل نقطة المنتصف بالمنفذ GPIO34 حتى يتمكن ESP32 من قياس تغير الجهد كقيمة تناظرية.
| العنصر | التوصيل / الوظيفة |
|---|---|
| LDR + مقاومة 10kΩ | مقسم جهد |
| نقطة المنتصف | GPIO34 |
| GPIO34 | قراءة الإشارة التناظرية |
معايرة حساس الضوء وتحديد العتبة
قبل كتابة برنامج الإنذار يجب معرفة القيم الفعلية التي يعطيها الحساس في حالتي وصول الليزر وانقطاعه. يمكن استخدام برنامج بسيط يقرأ GPIO34 ويعرض النتيجة على Serial Monitor.
const int ldrPin = 34;
void setup() {
Serial.begin(115200);
}
void loop() {
int valeurLDR = analogRead(ldrPin);
Serial.println(valeurLDR);
delay(200);
}
سجّل القراءة عندما يصل الليزر إلى LDR، ثم سجّلها مرة أخرى عند قطع الشعاع. بعد ذلك اختر قيمة بين القراءتين لتكون عتبة الكشف.
مهم: لا تنسخ قيمة العتبة من تجربة أخرى بشكل عشوائي. القراءة تتأثر بالمقاومة الضوئية، وشدة الليزر، وطريقة تركيب مقسم الجهد، والإضاءة المحيطة. قم بالمعايرة على دائرتك الفعلية ثم ضع القيمة التي حصلت عليها في البرنامج.
إضافة الجرس والترانزستور NPN

في التجربة وجدنا أن الجرس المستخدم يعمل جيدًا عند 3.3V ويستهلك حوالي 14mA. ومع ذلك، بدل جعل منفذ ESP32 يغذي الجرس مباشرة، نستخدم ترانزستور NPN كمفتاح إلكتروني.
بهذه الطريقة يقوم GPIO23 فقط بالتحكم في قاعدة الترانزستور عبر مقاومة 1kΩ، بينما يحصل الجرس على التغذية من خط 3.3V.
| الجزء | التوصيل / الوظيفة |
|---|---|
| حساس الضوء | GPIO34 |
| خرج التحكم | GPIO23 |
| GPIO23 → قاعدة الترانزستور | عبر مقاومة 1kΩ |
GPIO23 LOW | الترانزستور متوقف → الجرس صامت |
GPIO23 HIGH | الترانزستور يعمل → الجرس يشتغل |
سبق أن شرحنا استخدام ترانزستور NPN كمفتاح إلكتروني بتفصيل أكبر في الحلقة الخامسة من سلسلة ESP32 من الصفر.
الكود الكامل للمشروع
ضع في المتغير threshold قيمة العتبة التي حصلت عليها أثناء المعايرة. القيمة 3200 في المثال التالي هي قيمة توضيحية فقط ويجب استبدالها بالقيمة المناسبة لدائرتك.
const int ldrPin = 34;
const int buzzerPin = 23;
const int seuil = 3200;
void setup() {
Serial.begin(115200);
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW);
}
void loop() {
int valeurLDR = analogRead(ldrPin);
Serial.println(valeurLDR);
if (valeurLDR < seuil) {
digitalWrite(buzzerPin, HIGH);
while (true) {
// Alarme verrouillée jusqu'au redémarrage
}
}
delay(50);
}
شرح الكود
تحديد المنافذ
نحدد GPIO34 كمنفذ قراءة المقاومة الضوئية، بينما نستخدم GPIO23 للتحكم في الترانزستور المسؤول عن تشغيل الجرس.
تحديد عتبة الكشف
المتغير threshold يحتوي على قيمة العتبة التي حددناها أثناء المعايرة. هذه القيمة تسمح للبرنامج بالتمييز بين وصول شعاع الليزر إلى الحساس وانقطاعه.
تهيئة النظام
داخل setup() نبدأ الاتصال التسلسلي، ثم نحدد منفذ الجرس كمخرج ونرسل إليه LOW حتى يبدأ النظام والإنذار متوقف.
قراءة حساس الضوء
داخل loop() نستخدم analogRead() لقراءة GPIO34 باستمرار، ونرسل القيمة إلى Serial Monitor لمراقبتها أثناء الاختبار.
اكتشاف قطع شعاع الليزر
في تركيب الفيديو تنخفض قراءة الحساس عند قطع الليزر. لذلك نتحقق مما إذا أصبحت القراءة أقل من threshold. عند تحقق الشرط نرسل HIGH إلى GPIO23 فيعمل الترانزستور ويبدأ الجرس بإصدار الإنذار.
لماذا يبقى الإنذار مشتغلًا؟
بعد اكتشاف التسلل يدخل البرنامج في حلقة while (true) لا تنتهي. بذلك يتوقف البرنامج عن العودة إلى قراءة LDR ويبقى GPIO23 في الحالة المرتفعة. حتى إذا عاد شعاع الليزر إلى الحساس، يبقى الجرس مشتغلًا.
إعادة تسليح نظام الإنذار
لإيقاف الإنذار وإعادة النظام إلى وضع المراقبة، نعيد تشغيل ESP32 باستخدام زر EN الموجود على اللوحة. عند إعادة التشغيل تُنفذ setup() من جديد، فيتوقف الجرس ويصبح النظام جاهزًا لاكتشاف محاولة جديدة.
رفع البرنامج وتجربة المشروع
- وجّه الليزر نحو المقاومة الضوئية مع الالتزام باحتياطات السلامة.
- نفّذ المعايرة وحدد قيمة
thresholdالمناسبة. - ضع قيمة العتبة في البرنامج.
- اربط ESP32 بالحاسوب وارفع البرنامج.
- افتح Serial Monitor لمراقبة قراءة حساس الضوء.
- تأكد أن الليزر يصل إلى LDR وأن الجرس متوقف.
- اقطع شعاع الليزر بيدك أو بجسم غير عاكس.
- يجب أن يعمل الجرس ويبقى مشتغلًا حتى بعد عودة الليزر.
- اضغط زر EN لإعادة تشغيل ESP32 وتسليح النظام من جديد.
مشاكل شائعة وحلولها
| المشكلة | ما الذي يجب التحقق منه؟ |
|---|---|
| الإنذار يعمل دائمًا | تحقق من قيمة threshold ومن اتجاه مقسم الجهد وقيم الحساس عند وصول الليزر. |
| قطع الليزر لا يشغّل الإنذار | أعد المعايرة وتأكد من أن القراءة تعبر العتبة عند قطع الشعاع. |
| قراءة الحساس تتغير كثيرًا | تأكد من ثبات الليزر وحاول تقليل تأثير الإضاءة المحيطة على LDR. |
| GPIO23 يتغير لكن الجرس لا يعمل | تحقق من توصيل الترانزستور وأطرافه ومقاومة 1kΩ وتغذية الجرس والأرضي المشترك. |
| الإنذار لا يتوقف بعد عودة الليزر | هذا هو السلوك المقصود. اضغط زر EN لإعادة تسليح النظام. |
كيف يمكن تطوير المشروع؟
هذا المشروع نموذج تعليمي بسيط ويمكن تطويره بعدة طرق، مثل إضافة شاشة لعرض حالة النظام، أو زر مستقل لإعادة التسليح، أو إرسال تنبيه عبر WiFi عند اكتشاف قطع شعاع الليزر.
ماذا تعلمنا؟
- استخدام المقاومة الضوئية LDR مع ESP32.
- إنشاء مقسم جهد باستخدام مقاومة 10kΩ.
- قراءة إشارة تناظرية عبر
GPIO34. - معايرة الحساس واختيار عتبة الكشف.
- استخدام ترانزستور NPN كمفتاح إلكتروني للتحكم في الجرس.
- التحكم في الترانزستور بواسطة
GPIO23. - اكتشاف انقطاع شعاع الليزر.
- تثبيت حالة الإنذار حتى إعادة تشغيل ESP32.
بهذا نكون قد أنجزنا حاجز ليزر بسيطًا باستخدام ESP32، وجمعنا في مشروع واحد بين القراءة التناظرية، والمعايرة، واتخاذ القرار، والتحكم في خرج إلكتروني.
