📚 البرمجة: منطق المحاكاة (العقد الطرفية)
المفاهيم الأساسية
دالة `uniform()`: تعمل مثل دالة `randint()` ولكنها تنتج أعداداً حقيقية وليس فقط أعداداً صحيحة.
خريطة المفاهيم
```markmap
أدوات محاكاة إنترنت الأشياء
برنامج كاب كاربون (CupCarbon)
إنشاء مشروع محاكاة جديد
#### الخطوة 1: بدء مشروع جديد
- اضغط على أيقونة "New Project" (مشروع جديد) من شريط الأدوات.
#### الخطوة 2: حفظ المشروع
- اختر الموقع المراد حفظ المشروع فيه.
- اكتب اسم الملف: "My First CupCarbon Simulation".
#### الخطوة 3: تأكيد الحفظ
- اضغط على زر "Save" (حفظ).
مشروع محاكاة: مراقبة الحريق والتحذيرات
#### إنشاء مشروع جديد للمراقبة
##### الخطوة 1: بدء مشروع جديد
- اضغط على New Project (مشروع جديد) من شريط الأدوات.
##### الخطوة 2: تسمية المشروع وحفظه
- اختر الموقع الذي تريد تخزين المشروع فيه.
- اكتب "Fire Surveillance and Notification" في حقل File name (اسم الملف).
- اضغط على Save (حفظ).
إنشاء شبكة العقدة بوحدة التحكم الرئيسية والوسطي
#### الخطوة 1: إدراج العقد
- اضغط على "عقدة إنترنت أشياء (IoT) Node" من شريط Toolbar.
- اضغط على الخريطة لإضافة العقدة.
- اضغط على "All" من شريط State.
- ضع عقدتين أخريين داخل الدائرة الخارجية للعقدة الأولى.
- اضغط على Esc.
#### الخطوة 2: التعرف على العقد
- العقدة الأولى المضافة هي وحدة التحكم الرئيسية.
- العقدتان الأخريان هما عقد الوسطي.
#### الخطوة 3: ضمان الاتصال
- يجب وضع العقد داخل نصف قطر اتصال وحدة التحكم.
- إذا لم تكن داخل النطاق، اسحبها وأقلتها بالقرب حتى يظهر سهم اتصال ثنائي الاتجاه.
تابع إضافة العقد الطرفية
#### لإدراج العقد الطرفية:
##### الخطوة 1
- اضغط على Node IoT (عقدة إنترنت الأشياء) من شريط Toolbar (الأدوات).
##### الخطوة 2
- ضع عقدتين كل node proxy (عقدة وسطى)، وذلك داخل دائرتها الأخرى.
##### الخطوة 3
- اضغط على All (الكل) من شريط الحالة.
##### الخطوة 4
- اضغط على Esc في لوحة المفاتيح.
إنشاء المقاطع البرمجية
#### المكتبات اللازمة
- `import time`
- `import random`
#### منطق المحاكاة (العقد الطرفية)
##### توليد حدث حريق عشوائي
- داخل حلقة `while node.loop():`
- `fire = random.randint(1, 6)` لتحديد القطاع الذي قد يحدث فيه الحريق.
##### التحقق من وقوع الحريق وإرسال التحذير
- إذا كانت `fire == 1` (اندلع حريق في القطاع 1):
- `node.print("FIRE!")`
- إنشاء رسالة: `message = "FIRE IN SECTOR " + str(node.id())`
- إرسال الرسالة: `node.send(message)`
##### حالة عدم وجود حريق
- إذا أنتجت دالة التوليد أي رقم آخر (من 2 إلى 6):
- لا يوجد حريق في القطاع.
- تقوم العقدة بطباعة نص ذاتي فارغ: `node.print("")` لمسح أي نص مطبوع سابقاً.
##### فترة السكون العشوائية
- تهدف إلى محاكاة الأحداث في الحياة الواقعية.
- تستخدم الدالة `time.sleep(random.uniform(1, 4))`.
- فترة السكون تتراوح بين 1 و 4 ثوانٍ.
#### المقطع البرمجي النهائي (edge.py)
```python
import time
import random
while node.loop():
fire = random.randint(1, 6)
if fire == 1:
node.print("FIRE!")
message = "FIRE IN SECTOR " + str(node.id())
node.send(message)
else:
node.print("")
time.sleep(random.uniform(1, 4))
```
نقاط مهمة
- إذا لم يتم توليد الرقم 1 (أي تم توليد رقم من 2 إلى 6)، فهذا يعني عدم وجود حريق، وتقوم العقدة بمسح الشاشة السابقة.
- فترة السكون العشوائية بين 1-4 ثانية تُستخدم لمحاكاة التوقيت غير المنتظم للأحداث الواقعية.
- الكود الكامل للعقدة الطرفية يجمع بين توليد الحدث، والتحقق منه، وفترة الانتظار في حلقة مستمرة.