نواصل سلسلة المقالات حول استخدام إمكانات مجموعة المختبر الرقمي NR05 لدراسة برمجة وحدات التحكم الدقيقة باستخدام مثال Arduino وتصميم الأجهزة الإلكترونية المفيدة.
لا تتظاهر مادتنا بأنها تصميم نهائي ، ولكن ، كما سترى ، فإنها تفي تمامًا بجميع الوظائف الأساسية لقفل الرمز ، ويمكن أن تكون بمثابة توضيح جيد لقدرات وحدات التحكم الدقيقة واستخدام المكونات الإضافية الخارجية. يمكن إعادة تصميم برنامج وحدة التحكم الدقيقة وفقًا لتقديرك ، وإضافة أو تغيير وظائف القفل ، وفي الوقت نفسه زيادة مستوى معرفتك البرمجية.سنستخدم ، أولاً وقبل كل شيء ، حقيقة أن لوحة التوسيع ، التي تعد جزءًا من المجموعة ، تحتوي على شاشة بلورية سائلة من سطرين ، بالإضافة إلى 5 أزرار. نستخدم هذه العناصر لبناء قفل مركب.دعونا نقوم بالمتطلبات التالية:1. هناك 5 أزرار لإدخال الرمز الذي يفتح القفل.2. الزر الأيسر يتوافق مع الرمز 1 ، ثم من اليسار إلى اليمين - 2،3،4،5 ؛3. يمكن أن يكون عدد أرقام كود الإدخال أي (ضمن حدود معقولة) ويتم تثبيته ببساطة في البرنامج ؛4. يتم عرض رمز الاتصال مع العلامات النجمية.5. إذا تزامن الرمز الذي تم إدخاله مع الرمز المثالي ، يتم توفير دفعة إيجابية للمدة المحددة في البرنامج للمشغل ؛6. إذا تم إدخال الرمز بشكل غير صحيح ، تظهر رسالة خطأ ؛7. إذا قمت بكتابة الرمز جزئيًا ، فسيتم إعادة تعيين القيم المطلوبة بعد فترة.8. نستخدم الشاشة و RGB LED وباعث الصوت الموجود في الطقم لعرض معلومات سهلة الاستخدام.9. سنفتح قفل كهروميكانيكي حقيقي مدعوم بجهد 12 فولت.الآن نلتقط الجهاز الذي سيطبق جهد الفتح على القفل. هذا الجهد ، وفقًا لجواز سفر القفل الكهروميكانيكي ، الذي سنفتحه ، هو 12 فولت بتيار حوالي 1 أمبير. لا يمكن أن تعمل لوحة توسيع مجموعة NR05 مع هذه الفولتية والتيارات ، لذلك هناك حاجة إلى وحدة تبديل إضافية. يمكن أن تكون هذه الوحدات عبارة عن مرحلات MP515 مقدمة من Master Kit ، أو وحدات ترحيل MP2211 ، MP4411اعتمادًا على ما إذا كنا نريد التحكم ليس فقط في القفل ، ولكن أيضًا في الأجهزة الأخرى ، على سبيل المثال ، قم بتشغيل الضوء عند فتح الباب. جميع هذه الأجهزة متوافقة مع مستويات إشارة التحكم Arduino. في حالتنا الخاصة ، نستخدم MP2211 - وحدة مع مرحلتين.بالنظر إلى ما سبق ، سنرسم مخطط اتصال للأجهزة المستخدمة:
إذا نظرت عن كثب إلى علامة لوحة التوسعة ، فسنرى أن القناة الخضراء لمصباح GREEN RGB LED والإخراج إلى مرحل CH3 متصلان بدبوس واحد من D9 Arduino Nano. في هذه الحالة ، هذا مسموح ، لأن إدخال دائرة التحكم في التتابع لديه مقاومة إدخال عالية بما فيه الكفاية ، ويتم استخدام دبوس D9 فقط كمخرج رقمي. بشكل عام ، يجب عليك التحقق لمعرفة ما إذا كانت دبابيس اللوحة التي تستخدمها متصلة بنفس دبوس Arduino ، وتجنب هذا الموقف.يستهلك القفل الكثير من التيار أثناء التشغيل ، لذلك نقوم بتشغيله ودائرة التحكم بشكل منفصل.هنا رسم تخطيطي يعمل في Arduino ، المفسد// RGB-
// NR05
//-------------------------------------------------------------------
// LiquidCrystalRus
#include <LiquidCrystalRus.h>
#include <LineDriver.h>
#include <LiquidCrystalExt.h>
// RGB-
#define red 5
#define blue 6
#define green 9
#define beep 12
// ,
#define NUM_KEYS 5
// ( )
int adcKeyVal[NUM_KEYS] = {30, 150, 360, 535, 760};
///////////////////////////////////////////////////////////
// ,
#define codeLength 6
// , , . codeLength
const int codeOrigin[codeLength] = {1, 2, 3, 4, 5, 3};
// ,
const int unlockTime = 400;
///////////////////////////////////////////////////////////
//
int codePressed[codeLength];
// ( )
int pressCount;
//
unsigned long oldTime;
unsigned long currentTime;
const int timeout = 5; // , .
//-----------------------------------------------------------------------
// , RS,EN,DB4,DB5,DB6,DB7
LiquidCrystalRus lcd(A1, A2, A3, 2, 4, 7);
//-----------------------------------------------------------------------
// 1 Arduino
void setup()
{
// LCD: 16 2
lcd.begin(16, 2);
// ()
// « »
lcd.print(« »);
//
lcd.setCursor(0,1);
lcd.print(«t.: „);
lcd.print(unlockTime);
lcd.print(“ »);
// 2000 = 2
delay(2000);
//
lcd.clear();
//
pressCount = 0;
// « » RGB-
pinMode(red, OUTPUT);
pinMode(blue, OUTPUT);
pinMode(green, OUTPUT);
pinMode(beep, OUTPUT);
}
//-----------------------------------------------------------------------
// setup .
void loop() {
// ( ),
currentTime = millis();
// ,
if (currentTime — oldTime <= timeout*1000){
// key
int key;
// , get_key
key = get_key();
lcd.setCursor(0, 0);
lcd.print(« :»);
//
digitalWrite(blue, HIGH);
if (key > 0){ //
codePressed[pressCount] = key; //
// (50 )
digitalWrite(beep, HIGH);
delay(50);
digitalWrite(beep, LOW);
// ,
lcd.setCursor(pressCount, 1);
lcd.print('*');
digitalWrite(blue, LOW);
delay(200);
digitalWrite(blue, HIGH);
pressCount++; //
//
oldTime = currentTime;
}
}
// ,
else{
pressCount = 0;
lcd.clear();
oldTime = currentTime;
}
// , : codeOrigin codePressed
if (pressCount == codeLength){
int compareResult = 1;
for (int i = 0; i < codeLength; i++)
if (codeOrigin[i] != codePressed[i])
compareResult = 0; //
//
if (compareResult == 1){ //
digitalWrite(blue, LOW);
digitalWrite(green, HIGH);
lcd.setCursor(0, 0);
lcd.print(« „);
delay(unlockTime);
digitalWrite(green, LOW);
pressCount = 0;
delay(1000);
lcd.clear();
digitalWrite(blue, HIGH);
}
//
else {
lcd.setCursor(0, 1);
lcd.print(“ »);
digitalWrite(blue, LOW);
digitalWrite(red, HIGH);
digitalWrite(beep, HIGH);
delay(2000);
pressCount = 0;
lcd.clear();
digitalWrite(beep, LOW);
digitalWrite(blue, HIGH);
digitalWrite(red, LOW);
}
}
}
//-----------------------------------------------------------------------
//
// ,
// ,
int get_key()
{
int input = analogRead(A6);
int k;
for(k = 0; k < NUM_KEYS; k++)
if(input < adcKeyVal[k])
return k + 1;
return 0;
}
//
يتم توفير قائمة الرسم بالتعليقات التفصيلية لمساعدتك على فهم البرنامج.ومع ذلك ، نلفت انتباهك إلى بعض ميزاته.كما كتبنا بالفعل ، في لوحة التوسيع يتم استخدام نظام اتصال زر يستخدم دبوس Arduino واحدًا فقط. مثل هذا المخطط يحفظ مخرجات المعالجات الدقيقة ، لكنه لا يسمح بمعالجة الضغط المتزامن لعدة أزرار في نفس الوقت ، ولكن في حالتنا هذه ليست ضرورية. لاحظ وظيفة get_key في نهاية الرسم. إذا لم يتم الضغط على أي أزرار ، فإن الوظيفة ترجع 0 ، إذا تم الضغط عليها ، ثم رقم الزر المضغوط.انظر أيضًا إلى تطبيق مقارنة مصفوفتين:الكود المرجعي والكتابة : int CompareResult = 1؛for (int i = 0؛ i <codeLength؛ i ++)if (codeOrigin [i]! = codePressed [i])مقارنة النتيجة = 0 ؛ // إذا كان زوج واحد على الأقل من العناصر غير متساوي ،غالبًا ما تتم مناقشة مسألة الخوارزمية لمثل هذه المقارنة في منتديات البرمجة ، ولكن في كل مرة يتعلق الأمر بمقارنة العناصر ، والتي يتم استخدامها في حالتنا. يظل المتغير مقارنة النتيجة يساوي 1 إذا كانت عناصر المصفوفات التي لها نفس المؤشر متساوية ، وتصبح مساوية للصفر إذا لم يتطابق زوج واحد على الأقل من العناصر.لعرض الأحرف السيريلية ، يتم استخدام مكتبة LiquidCrystalRus ، التي طورتها إيليا دانيلوف. لكي تعمل المكتبة بشكل صحيح ، يجب أن يكون هناك ثلاثة أسطر في عنوانرسمنا : #include <LiquidCrystalRus.h>#include <LineDriver.h>#include <LiquidCrystalExt.h>ويجب أن يبدو التهيئة بالشكل التالي:LiquidCrystalRus lcd (A1، A2، A3، 2، 4، 7)؛يتم تحديد طول رمز الإدخال بواسطة كود محدد مسبقًاطول الطول ، على سبيل المثال ، لرمز ست نقرات# كود تعريفالطول 6يتم تحديد مجموعة من القيم المرجعية لرمز 6 نقرات بواسطة السطر التالي:const int codeOrigin [codeLength] = {1، 2، 3، 4، 5، 3} ؛يجب أن يكون عدد القيم في الأقواس مساوياً لـ codeLength. إذا كان هناك المزيد من القيم ، فسيقوم المترجم بإلقاء خطأ ؛ إذا كان هناك عدد أقل ، فلن يكون هناك خطأ ، ولكن سيتم استخدام القيم العشوائية كعناصر مفقودة ، الأمر الذي لن يجعل من الممكن كتابة التعليمات البرمجية التي ستفتح القفل.يعيد البرنامج كل 5 ثوانٍ تعيين عناصر التعليمات البرمجية المكتوبة. إذا تم الضغط على الزر ، فسيتم تذكر وقت الضغط ، ويبدأ العد التنازلي للفاصل الزمني لمدة خمس ثوانٍ مرة أخرى. يتم تنفيذ ذلك باستخدام الدالات المضمنة millis () ، والتي تُرجع عدد المللي ثانية التي مرت منذ بداية الرسم ، والمتغيرات oldTime و currentTime.فيما يلي مقطع فيديو قصير يوضح عملية قفل الرمز:بالنسبة للمبرمجين الإلكترونيين الفضوليين والفضوليين ، يمكنك طرح بعض الأفكار الإضافية للانتهاء الذاتي من الرسم وإدراج وحدات في الدائرة التي توسع قدرات القلعة. على سبيل المثال ، أدخل رمزًا رئيسيًا في البرنامج ، بمساعدة وضع القفل في وضع البرمجة ويتذكر الأزرار المضغوطة كرمز مرجعي ، حتى لا يتم تغيير هذا الرمز في الرسم التخطيطي. تنتهي برمجة رمز جديد إذا تجاوز الفاصل الزمني بين النقرات وقتًا معينًا.أو ، استنادًا إلى المواد المتعلقة بتفاعل Arduino مع هاتف ذكي عبر Bluetooth ، قم بعمل قفل يفتح برمز تم إرساله بواسطة هذا الهاتف الذكي.يمكنك أيضًا ببساطة إدخال قناة التحكم اللاسلكي في جهازنا. للقيام بذلك ، يكفي استخدام وحدتين: جهاز الإرسال-المرسل MP910 وجهاز استقبال أحادي القناة مع خرج التتابع MP911 ، يعمل بتردد 433 ميجاهرتز. يتم توصيل جهات اتصال الترحيل لوحدة MP2211 بالتوازي مع الزر الموجود على جهاز التحكم عن بعد ، ويتم توصيل مرحل وحدة الاستقبال بالقفل. يمكن أن تصل مسافة التحكم إلى 100 متر، قم بدراسة Arduino ، وادرس الميكروكونترولر ، وبرمجتها - ويمكنك إنشاء العديد من الأجهزة الإلكترونية الذكية والمفيدة!