برمجة المتحكم الدقيق باستخدام C - إنترنت الأشياء - ثاني ثانوي
الجزء الأول
1. أسس إنترنت الأشياء
2. إنترنت الأشياء في حياتنا
3. إنشاء تطبيقات إنترنت الأشياء باستخدام الأردوينو
4. إنشاء تطبيق سحابي لإنترنت الأشياء
الجزء الثاني
5 .تطبيقات إنترنت الأشياء المتقدمة
6 .برمجة إنترنت الأشياء باستخدام ++C
7 .الرسائل في إنترنت الأشياء
8. محاكاة شبكة مستشعرات إنترنت الأشياء اللاسلكية
242 الدرس الثالث برمجة جهاز التحكم الدقيق باستخدام لغة ++C إنشاء قفل باب ذكي Build a Smart Door Lock سنستخدم في هذا المشروع المكونات الآتية: . لوحة أردوينو أونو Arduino Uno R33). . لوحة مفاتيح ( مقاس 4×4). شاشة LCD ( مقاس 16 × 122). . محرك سيرفو Micro Servo) المكونات المستخدمة في هذا المشروع 18 111 أردوينو اونو R3 شاشة LCD مقاس (212×16) الف الدارس البركتي www.jen.cd.com محرك سيرفو شکا 17 6: مكونات المشروع لوحة مفاتيح 4x4 مرارة التعليم
إنشاء قفل باب ذكي
24 ستبدأ بإضافة لوحة المفاتيح من فئة Input (الإدخال من components (المكونات ) وتوصيلها بالأردوينو. لتوصيل لوحة المفاتيح. ابحث عن مكون Keypad 4x4 (لوحة المفاتيح ) من فئة Input ( الادخال ) Components المكونات) واسحبه وأفلته في ساحة العمل. 2 قم بتوصيل السطر الأول من لوحة المفاتيح بالطرف الرقمي 9 الخاص بالاردوينو ) قم بتوصيل السطر الثاني من لوحة المفاتيح بالطرف الرقمي 8 الخاص بالأردوينو . قم بتوصيل السطر الثالث من لوحة المفاتيح بالطرف الرقمي 7 الخاص بالأردوينو 1 قم بتوصيل السطر الرابع من لوحة المفاتيح بالطرف الرقمي 6 الخاص بالأردوينو . قم بتوصيل السطر الأول من لوحة المفاتيح بالطرق الرقى 5 الخاص بالأردويني ن قم بتوصيل السطر الثاني من لوحة المفاتيح بالطرق الرقمي 4 الخاص بالأردوينو قم بتوصيل العمود الثالث من لوحة المفاتيح بالطرف الرقمي 3 الخاص بالأردوينو قم بتوصيل العمود الرابع من لوحة المفاتيح بالطرف الرقمي 2 الخاص بالأردوينو 2 > غير كافة الاسلاك إلى اللين green ( الأحصر). 1 2 4 6 8 3 5 7 9 DIGITAL PWM حرارة الي شكل 6.18 توصيل لوحة المفاتيح
توصيل لوحة المفاتيح
ابحث الآن عن شاشة LCD من فئة Output ( الإخراج من Components (المكونات). ووصلها في breadboard small (لوحة توصيل الدوائر الصغيرة ) . التوصيل شاشة LCD النت عن الكون (122) 162 LCD م ة Output ( الاحراج) من فئة Components ( المكونات ... ار سعيه و أقلته في مساحة العمل قم توصيل الطرف GND ( الأرضي ) الشاشة LCD مطرف GND ( الأرضي) الخاص بالأردوينو وغير لون السلك إلى black ( الأسود). قم بتوصيل طرف Power (الطاقة) الشاشة LCD بالطرف 57 (5 فولت) بالأردوينو، وعر لون الملاك إلى red ) الأحمر) قم بتوصيل طرف SDA الشاشة LCD بطرف SDA بالأردوينو وغير لون الملك إلى green (الأحضر ) 0 قم بتوصيل طرف SCLE الشاعة LCD طرف SCL بالأردوينو، وغير لون السلك إلى yellow الأصفر ) 8 وزارة التعليم شكل 6,19 تسيل شاشة LED 2 3 5 1 244
توصيل شاشة LCD
خناما، ستقوم بتوصيل محرك سيرفو. ابحث عن Servo motor ( محرك سيرفو) من فئة Output ( الإخراج في Components (المكونات)، ووصله في breadboard small ) لوحة توصيل الدوائر الصغيرة). التوصيل المحرك المؤازرة > ابحث عن Servo motor محرك سيرفو من فئة Output (الاحراج) في Components (المكونات) واسحبه وأطلته في مساحة العمل. قم بتوصيل الطرف GND | الأرضي للمحرك بطرف GND (الأرسي) بالأردويلو وغير لون السلك إلى black ( الأسود ) 2 قم بتوصيل طرف Power ) الطاقة الشاشة LCD بالطرف 5 (5 فولت) سالار درينو وغير من السلك إلى red ( الأحمر). > قم بتوصيل طرف Signal ( الإشارة للمحرك بالطرف Digital ( الرقمي ) 11 بالأردوينو، وغير لون السلك الى orange | البرتقائي ) . 3 2 مشکل 20 تا توصيل المعرب سيرهم مرارة التعليم 1415 1
توصيل المحرك المؤازر
246 تضمين المكتبات Include the Libraries بعيدا عن وحدة تحكم الأردوينو، ولاستخدام باقي المكونات وبرمجة منطقها بلغة ++C ، فأنت بحاجة أولا إلى تضمين مكتباتها في قسم البرمجة في بيئة تينكر كاد الأساسية. توفر هذه المكتبات العديد من الدوال الخاصة بكل مكون ستحتاج إلى كتابة الضيفة الآتية لتضمين مكتبة في ++C بالنسبة للمشروع الحالي، ستحتاج إلى تضمين المكتبات الآتية: بالنسبة للوحة LCD بالنسبة للوحة المفاتيح بالنسبة للمحرك المؤازر إنشاء الكائنات Create the Objects #include <library name> #include <Adafruit Liquid Crystal.h> #include <Keypad.h> #include <Servo.h> بعد تضمينك للمكتبات الضرورية، ستحتاج إلى إنشاء بعض الكائنات وتهيئة بعض الوسيطات. ستحتاج إلى إنشاء الكائنات الأتية كائن لشاشة LCD . كائن للمحرك المؤازر (Servo motor) كائن للوحة المفاتيح عند إنشاء كائن (object) أو عينة (instance) لفئة (class) تحتاج أحيانًا إلى تزوية بعض الوسيطات إلى منشئ (constructor) هذا الكائن المنشئ هو وظيفة فئة خاصة تستدعى عند إنشاء كائن، وتتصل وظيفتها في هيئة مرارة التعليم وسيطات الكائن.
تضمين المكتبات
إنشاء الكائنات
كالس المحرك المؤازر لإنتماء كائن للمحرك سيرك Servo servo; تشير دالة Servo إلى نوع الكائن. ونشر دالة "sevo" إلى الكائن الفعلي المستخدم في البرنامج، وهنا لا تحتاج إلى إضافة أي معاملات للتهيئة. كاني شاشة 100 لإنشاء كائن لشاشة LCD Adafruit_LiquidErystal lcd(); يمكنك باستخدام هذا الأمر تهيئة كائن من نوع Adafruit_Liquid Crystal. وتمرير عنوان الأردوينو الابتدائي الخاص به (وهو ) افتراضيا ) كوسيط إلى مشى الفئة. كاس لوحة المفاتيح شكل 21 6 محرك سيره اکادر مكركادا تحتاج عملية الإنشاء والهيئة لكائن لوحة المفاتيح إلى بعض البرمجة لإعداده. ستحتاج في البداية إلى تحديد عدد الصفوف والأعمدة الموجودة في لوحة المفاتيح. يتم ذلك بهذه الأوامر. const byte numRows = 41 number of rows on the keypad const byte numCols = 41 // number of columns on the keypad شكل 23 6 لوحة المفاتيح اعلان للكرلار تحدد هنا عدد الصفوف (numRows) من النوع const byte وينطبق الشيء ذاته على عدد الأعمدة (numCols). حرارة التعليم
كائن شاشة LCD
كائن المحرك المؤازر
كائن لوحة المفاتيح
ذلك إلى تحديد المفتاح المضغوط وفقا للصف والعمود تماما كما يظهر على لوحة المفاتيح طريقة ستحتاج بعد القيام بذلك هي // keymap defines the key pressed according to the rows and columns just as they appear on the keypad char keymap[numRows] [numCols] = ('1', '2', '3', 'A'), ('4', '5', '6', 'B'), 171, 18', '91, "C"}, {', '0', '#', '0'} }; ستنشن هنا مصفوفة keymap باستخدام numRows و numCols التي قمت بتعريفها سابقا وتحديد المفاتيح الموجودة على لوحة المفاتيح بشكل صريح. ستحتاج بعد ذلك إلى إعداد اتصالات لوحة المفاتيح بأطراف الأردوينو. يمكنك القيام بذلك عن طريق تحديد متغيرين من نوع byte // Code that shows the the keypad connections to the arduino terminals byte rowPins numRows] = 19,8,7,6); //Rows 0 to 3 byte colPansinuncols] = 15,4,3,2}: //Columns @ to 3 تتمثل الخطوة الأخيرة في تحديد كائن Keypad عن طريق استدعاء منشته، وتوفير وسيطاته اللازمة. // initializes an instance of the Keypad class. Keypad keypad = Keypad makeKeymap(keymap), rowPins, colpins, numRows, numCols); الاستكمال برنامج الإعداد، ستعرف متغيرا باسم password يقوم بتخزين كلمة مرور قفل الباب، وهو عبارة عن مجموعة من الأحرف بطول 4 thar password[4]; دراة السليم 246
تحديد المقتاح المضغوط
ايقاف البرنامج Break down the code في هذه المرحلة يكون برنامج الإعداد قد اكتمل. وكما أوضحنا في الدرس الأول، فإن وحدة التحكم في الأردوينو تنفذ دالة ( ) setup مرة واحدة فقط عند تشغيلها، ثم تنقذ دالة ( )loop بصورة مستمرة دعونا الآن توقف البرنامج. تستخدم دالتي Servo من مكتبة Servo كما يلي: (11)Servo attach ترفق متعير Servo بالطرف 11 servo writer تخدم الكتابة قيمة إلى serve في هذه الحالة تكتب القيمة ، وتتحكم في عمود الحركة وفقا لالا يجدد هذا راوية العنود في محرك سيرفو القياسي | بالدرجات ) ثم تجريد العود إلى هذا الاتجاه نستخدم بعد ذلك ثلاث دوال المكتبة Adafruit_Liquid Crystal كالآتي: (Ed.begin (cal.row بی رحمة الحالمة ACD وتحدد أبعاد الشاشة (العرض والارتفاع يجب استدعاء فيه الدالة | begin قيل لي وتر أخرى خاصة عكشة LCD، وسيطات هذه الدالة هي: cools وهي عدد الأعمدة الموجودة في الشاشة. rows وهي عدد الصوف الموجودة في الثانة ولان شاشة LD المستقيمة 16x2 فيمكن اعطاء الدالة الوسيطات 16 = Tow = 2 Col وبالتالي تكون جاعتها (162) ted begin الدالة الآتية هي: الصف تقوم بالة cd setCursor(col, rom | تحديد الموقع الذي سيموص فيه النص المكتوب على قاعة LED. العرض عبارة "Seta haracter password حسين كلمة مرور مكونة من ه اجرت كانت بحاجة إلى كلا الحفر لجان LCD ستعرض في الصف الأول عبارة Set 4 character" القاسي ستعرض عارة "password" للقيام بذلك عليك استدعاء المالية بالصيغة 0 0 1 lcd.setCursor ا قبل عرض السيارة الأولى. ثم استعاد الدالة مرة أخرى بالصيغة 1 lcd sex Cursor لعرض الشارة الثانية ، وهي التعليمات البرمجية لدالة ( ) setup هي void setup() 1/servo setup servo.attach(11); servo write(0); //led setup and password set Led.begin(16, 2); led.setCursor (0, 0); lcd.print("Set 4 character"); lcd.setCursor(0, 1); lcd.print("password;"); For (int i = 0; i < 4; i++) ( password[i] = keypad.waitForKey(); الجزء الأخير من البرمجة في دالة ()setup هو تكرار for الذي يخزن كلمة مرور يتكون من 4 أحرف يكتبها المستخدم على لوحة المفاتيح. في متغير | 4 password. للقيام بذلك، تستخدم دالة مكتبة لوحة المفاتيح. تستدعى الدالة Keypad.waltROFKEYU وانتي ستعرف على المفتاح الذي تم الضغط عله. وتعزه في مصفوفة password | كلمة المرور وزارة التعليم 249
إيقاف البرنامج
void loop() الآن وبالنسبة للمهمة الرئيسة لهذا المشروع ستستدعي دالة التكرار ( )loop عدة مرات. أوامر دالة ( )loop clear the screen and display the new message Lcd.clear(); Lcd.setCursor(0, 0); Lcd.print("Enter password:"); bool correctPass = true; char buttonPressed; // this code checks each button pressed against the corresponding password digit // e.g. it will check the 1st button pressed against the first digit of the password and so on for (int i=0; i < 4; i++) { buttonPressed = keypad.waitForKey(); if (password[1] != button Pressed){ correctPass = false; J Lcd.setCursor(1, 1); lcd.print(button Pressed); delay(1000); //this code will be executed if the password is correct if (correctPass): [ clear the lcd screen وزارة التعليم 1250
أوامر دالة loop
// set the cursor to the beginning of the 1st line Lcd.setCursor(0, 0); Lcd.print("Correct password!"); // set the cursor to the beginning of the 2nd line lcd.setCursor(0, 1); Lcd.print("Unlocking..."); 1/ write the angle by which the servo will rotate servo.write(180); // wait 5 sec and then rotate the servo to its original angle delay(5000); servo.write(0); else{ // this code will be executed if the password is wrong // clear the lcd screen Lcd.clear(); // set the cursor at the 1st col, row lcd.setCursor(0, 0); // print the message lcd.print("Wrong password!"); إيقاف البرنامج Break this Code down توجد في البرنامج بعض التعليمات البرمجية لمسح شاشة LCD، ولعرض رسالة تطلب كلمة المرور. // clear the screen and display the new message lcd.clear(); cd.setCurr(0, 0); lcd.print("Enter password:");
تابع أوامر دالة loop
إيقاف البرنامج
يتبع ذلك التعليمات البرمجية التي تستقبل كلمة المرور التي يقوم المستخدم بإدخالها وتتحقق من صحتها يتم ذلك بالمقارنة بين الأزرار التي يتم الضغط عليها واحدا تلو الآخر بالتتابع مع رقم كلمة المرور الموجود في نفس الموضع. على سبيل المثال، لنفترض أن كلمة المرور التي ضُبطت في البداية هي "5456" ويقوم المستخدم بكتابة كلمة المرور "5453"، نظرا لأن كل مفتاح يضغط عليه المستخدم سيقارن بمفتاح كلمة المرور المقابل، فإن ما سيحدث هو: 5 مقارنة مع 5 ( نفس الشيء، لا توجد مشكلة) 4 مقارنة مع 4 ( نفسها، لا توجد مشكلة) 5 مقارنة مع 5 (لا توجد مشكلة بعد ) 3 مقارنة مع 6 نيستا متطابقتين، لذا فإن كلمة المرور التي تم الضغط عليها غير صحيحة). عندما يقارن البرنامج بين مفتاحين مختلفين. يحب تحديث المتغير بالمعلومات التي تفيد بأن كلمة المرور غير صحيحة. ولا يهم ما إذا كان المفتاح الخطا أول رقم أو آخره أو في أي مكان بينهما، فالنتيجة أن كلمة المرور بأكملها خطأ. لذلك. ولتخزين هذه المعلومات. يمكنك استخدام متغير منطقي يتم تهيئته على أنه صائب (true) . وعند الضغط على مفتاح خطأ، تتغير قيمة المتغير إلى خطا .(false) . وبعد إجراء المقارنة يمكنك التحقق من قيمة هذا المتغير وإذا كانت هذه القيمة صائبة، فهذا يعني أن المستخدم كتب كلمة المرور الصحيحة، أما إذا كانت هذه القيمة خطأ. فهذا يعني أن المستخدم كتب كلمة مرور خطأ. يتم تنفيذ الدالة التي تم وصفها أعلاه بواسطة هذا الجزء من البرنامج: boal correctPass = true; char buttonPressed; // this code checks each button pressed against the corresponding password digit // e.g. it will check the 1st button pressed against the first digit of the password and so on for (int i=0; 1 < 4; i++) { buttonPressed = keypad.waitForKey(); if(password[i] != buttonpressed) { correctPass = false; Lcd.setCursor(i, 1); lcd.print (buttonpressed); حرارة التعليم 252
التعليمات البرمجية التي تستقبل كلمة المرور
والأن نصل إلى الجزء المهم من البرنامج وهو عملية فتح الباب ( تدوير محرك سيرهو) إذا كانت كلمة المرور المكتوبة صحيحة، وغلق القفل مرة أخرى بعد فترة من الوقت، أو عرض رسالة تفيد بأن كلمة المرور كانت خطأ. يتم تنفيذ هذه الدالة بواسطة التعليمات البرمجية الأتية // this code will be executed if the password is correct if(correctPass){ } it clear the lcd screen lcd.clear(); // set the cursor to the beginning of the 1st line lcd.setCursor(0, 0); lcd.print("Correct password!"); // set the cursor to the beginning of the 2nd line lcd.setCursor(0, 1); lcd.print("Unlocking..."); i write the angle by which the servo will rotate: servo write(180); // wait 5 sec and then rotate the servo to its original angle delay(5000); servo.write(0); else il this code will be executed if the password is wrong // clear the lcd screen lcd.clear(); set the cursor at the 1st col, row lcd.setCursor(0, 0); // print the message Lcd.print("Wrong password!"); } درارة التعليم
// C++ code W #include <Adafruit_LiquidCrystal.h> #include <Keypad.h> #include <Servo.h> Adafruit LiquidCrystal Lcd(0); Servo servo; ختاما، سيبدو البرنامج بأكمله المشروع القفل الذكي للباب كالآتي: البرنامج بأكمله Complete Code احمر وصع البرمجة نص (Text مجرد التعليقات البرمجة const byte numRows = 4; //number of cows on the keypad const byte numCols = 4; //number of columns on the keypad // keymap defines the key pressed according to the rows and columns just as they appear on the //keypad char keymap[numRows][numCols] = [1, 2, 3, 'A'), 1'4', '5', '6', 'B), }; '7', '8', '9', 'C', *#*, 'D' } // Code that shows the the keypad connections to the arduino terminals byte rowPins [numRows] [9,8,7,6]; //Rows @ to 3 = byte colPins[numCols] (5,4,3,2); //Columns 0 to 3 = // initializes an instance of the Keypad class Keypad keypad Keypad (makeKeymap(keymap), rowPins, colpins, numRows, numCols); وزارة التعليم 254
برنامج القفل الذكي للباب
داوات char password[4]; void setup() f // servo setup servo.attach(11); servo.write(0); // led setup lcd.begin(16, 2); // Lcd print 1st Line Lcd.setCursor(0, 0); lcd.print("Set 4 character"); // lcd print 2nd line lcd.setCursor(@, 1); lcd.print("password:"); } // gets and stores the password for(int i = 0; i <4; 1++)[ passwordfil keypad.waitForkey(); void loop() { // clear the screen and display the new message Led.clear(); lcd.setCursor(0, 0); lcd.print("Enter password: "); bool correctPass = true; ebar buttressed;
تابع برنامج القفل الذكي1
// this code checks each button pressed against the corresponding password digit //e.g. it will check the 1st button pressed against the first digit of the password and so on for(int i=0; i<4; i++) { buttonPressed keypad.waitForKey(); if(password[i] != buttonPressed) [ correctPass = false; } } lcd.setCursor(1, 1); lcd.print(buttonPressed); delay(1000); // this code will be executed if the password is correct if (correctPass){ // clear the lod screen lcd.clear(); // set the cursor to the beginning of the 1st line Lcd.setCursor(0, 0); Lcd.print("Correct password!"); // set the cursor to the beginning of the 2nd Line Lcd.setCursor(0, 1); lcd.print("Unlocking..."); // write the angle by which the servo will rotate servo.write(180); wait 5 sec and then rotate the servo to its original angle delay(5000); servo.write(0); else 1. "this code will be executed if the password is wrong حرارة التعليم 256
تابع برنامج القفل الذكي2
} // clear the lcd screen lcd.clear(); // set the cursor at the ist col,row Lcd.setCursor(0, 0); // print the message Lcd.print("Wrong password!"); ابعد الانتهاء من كتابة البرنامج أصحط على تريلة المحاكاة (Start Simulation | مرارة الكلية
تابع برنامج القفل الذكي3
257 تمرينات 1 أنشئ مافرة في برنامج تينكر كاد تتصل بمستشعر درجة الحرارة وشاشة LCD، ثم قم ببرمجتها باستخدام لغة ++C لعرض درجة الحرارة التي يقوم المستشعر بقراءتها على شاشة LCD 2 افلتى دائرة في برنامج تيلكر كاد تتصل بلوحة مفاتيح 44 وشاشة LED ثم قم سرمجتها باستخدام لغة ١٠) لعرض الأخرف التي يتم الضغط عليها وذلك على شاشة LCD. جرارة الم
اتشي دائرة في برنامج تينكر كاد تتصل بلوحة مفاتيح 4x4 ودايودين مشمين للضوء أحدهما أحمر والآخر أحصر سيقوم المستخدم يتعيين كلمة مرور ثم سيحاول استخدامها اذا كان الإدخال صافيا سيصين الدايود المشع للضوء الأخضر، وإذا كان خطأ، فإن الدايود المشع للضوء الأحمر سيو مض بصورة متكررة 4 أقسى دائرة مع برنامج تشكر كان تصل بمستشعر طوبة التربة ومحرلد سير فو. ثم قم ببرمجتها باستخدام لغة ++C لتشغيل محر لك سيرفو عند وصول درجة رطوبة التربة إلى قيمة معينة. جرارة الصلح