در پروژه های DIY کنترل درب به صورت اتوماتیک بسیار پرطرفدار است. در این خصوص روش های متفاوتی برای طراحی سیستم درب باز کن وجود دارد. یکی از این روش ها استفاده از کیپدهای ماتریسی است. کیپد ها دارای دو نوع فلت و معمولی و با ابعاد و کلیدهای متفاوتی هستند. در این آموزش به معرفی کیپد و نحوهی استفاده از آن خواهیم پرداخت. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسیدیجی اسپارک همراه باشید.
کیپد Keypad
کیپد مجموعه از تاچ سوئیچ ها میباشند که به صورت سطری ،ستونی; به طوری که تشکیل یک ماتریس دهند در کنار یک دیگر قرار گرفته اند. برای راه اندازی کیپد Keypad روشهای زیادی وجود دارد که در این آموزش به شرح یکی از روشهای ساده میپردازیم و در قسمتهای بعدی روشهای بهینه تری را آموزش میدهیم.
اتصالات
نمایی کلی از عملیاتی که باید انجام شود :
در روشی که در این پست قصد داریم به آموزش آن بپردازیم کیپد را همانند تصویر زیر به آردوینو متصل میکنیم.
سپس پینهای شماره ۱ ، ۲ ، ۳ و ۴ را در وضعیت ورودی و Pull Up قرار میدهیم.بعد از ین پینهای A , B ,C , D را خروجی میکنیم و در وضعیت ۱ منطقی قرار میدهیم. سپس مقدار LOW را میان پینهای A , B ,C , D شیفت میدهیم . یعنی همانند حالات زیر عمل میکنیم.
مراحل شیفت دهی
مرحله اول:
A = LOW
B = HIGH
C = HIGH
D = HIGH
مرحله دوم:
A = HIGH
B = LOW
C = HIGH
D = HIGH
مرحله سوم :
A = HIGH
B = HIGH
C = LOW
D = HIGH
مرحله چهارم:
A = HIGH
B = HIGH
C = HIGH
D = LOW
و به همین ترتیب مراحل بالا را از مرحله یک به چهار انجام میدهیم و منتظر میشویم که کلیدی فشرده شود. اگر کلیدی فشرده شد یکی از ستون ها در وضعیت LOW قرار میگیرد و ما با داشتن شماره سطر و شماره ستون میتوانیم کلید فشرده شده را تشخیص دهیم.
#include <Bounce2.h> #include <LiquidCrystal.h> //تنظیم پایه های ال سی دی LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28); #define c0 digitalRead(6) #define c1 digitalRead(7) #define c2 digitalRead(8) #define c3 digitalRead(9) //نمایی کلی از کاراکت های کیپد را به صورت آرایه در می آوریم char layout[16] = {'1' , '2' , '3' , 'A', '۴' , '۵' , '۶' , 'B', '۷' , '۸' , '۹' , 'C', '*' , '۰' , '#' , 'D' }; //آرایه بالایی با آرایه پایینی دارای یک مقدار می باشد و تفاوتی ندار از کدام یک استفاده کنیم /* char layout[16] = {'1' , '2' , '3' , 'A','4' , '5' , '6' , 'B','7' , '8' , '9' , 'C','*' , '0' , '#' , 'D'}; */ //پین های مربوط به سطرها را در یک آرایه ذخیره میکنیم int rows[4] = {2, 3, 4, 5}; //پین های مربوط به ستون ها را درون یک آرایه ذخیره میکنیم int cols[4] = {6, 7, 8}; void setup() { lcd.begin(16, 2); lcd.print("digispark.ir"); Serial.begin(9600); //تعریف کردن ستون ها به صورت ورودی و در وضعیت پول آپ که به ستون های کیپد متصل می شوند pinMode(6, INPUT_PULLUP); pinMode(7, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); pinMode(9, INPUT_PULLUP); ///تعریف پین هایی که به سطر های کیپد متصل می شند pinMode(2, OUTPUT); digitalWrite(2, HIGH); pinMode(3, OUTPUT); digitalWrite(3, HIGH); pinMode(4, OUTPUT); digitalWrite(4, HIGH); pinMode(5, OUTPUT); digitalWrite(5, HIGH); } void loop() { keyPad(); } void keyPad() { int col = -1; int row = 0; int pos = -1; // به وسیله ی حلقه ی زیر عملیات شیف دادن را انجام می دهیم for (int row = 0; row <= 5 ; row++) { digitalWrite(rows[(row)], LOW); if (!c0) { col = 0; } else if (!c1) { col = 1; } else if (!c2) { col = 2; } else if (!c3) { col = 3; } if (col != -1) { pos = row * 4 + col ; char c = layout[pos]; if (c == '#') { lcd.clear(); } else if (c == '*') { lcd.clear(); lcd.print("digispark.ir"); } else { lcd.print(c); } col = -1; } while (!c0) { ; } while (!c1) { ; } while (!c2) { ; } while (!c3) { ; } digitalWrite(rows[(row - 1 )], HIGH); } }
در پروژهی بالا هنگامی که دستتان را بر روی کلید نگه دارید متوجه میشوید که برنامه متوقف میشود و تا زمانی که دستتان را از روی لید برنداشته باشید برنامه در توقف میباشد.
دانلود شبیه ساز و کد پروژه
در این قسمت شبیه ساز پروزه به همراه کد آن قرار گرفته شده است. بر روی لینک زیر کلیک کرده و دانلود نمایید.
دانلود شبیه ساز و کدهای این پروژه
وسایل مورد نیاز
برد آردوینو Arduino
کیپد فلت ۴*۴ ماتریسی
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
پروژه و دریافت بن ارسال رایگان
برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکههای اجتماعی از جمله آپارات و اینستگرام، با هشتگهای دیجی_اسپارک دانشجوکیت digispark daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۰۳۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام ، تو قسمت قبل دیبانسینگ رو تدریس کردین.از دیبانسینگ تو این پروژه پس چررا استفاده نکردین
سلام در قسمت بعدی استفاده می شود
قسمت بعدی این آموزش رو کی میذارید؟؟؟
سلام
آقا من یه برنامه نوشتم،تو این برنامه میخوام فقط یکبار از کیپد عدد بگیرم…چجوری باید اینکارو بکنم؟
چیزی که الان نوشتم هردفعه که قراره حلقه تکرار بشه باید با کیپد مقدار بدم
پیشاپیش از راهنماییتون ممنونم
سبز باشید.
با سلام
ضمن تشکر از توجه شما، اگر منظورتات از یکبار عدد گرفتن این است که با فشردن کیپد چندبار عدد ارسال میشود، بایستی از آموزش دیبانسینگ استفاده کنید. ولی اگر میخواهید با یکبار فشردن کیپد لوپ برنامه اجرا شود، باید آرگومان مربوطه را در لوپ قرار دهید. چیزی شبیه به کد زیر:
void loop() {
char keypress = key.getKey();
while (keypress != NO_KEY){
if (keypress == ‘X’){
باسلام
علت نوشتن ۱۲۴ چی هست.من دلیلش رو متوجه نمیشم
با سلام
ضمن تشکر از توجه شما، منظورتان از ۱۲۴ چیست؟ لطفا دقیقتر سوالتان را مطرح کنید.
منظورم خط ۱۲۴ ام کد بالا می باشد
سلام مجدد
در این خصوص همانطور که در توضیحات آموزش هم ذکر شده است؛ مقدار LOW را شیفیت میدهید. یعنی تک به تک LOW میکنیم، سپس بعد از اینکه وضعیت یک پین LOW شد باید وضعیت پین قبلی به HIGH تغییر کند.
برنامه مربوط به atmega16 که زاویه ای رو توسط یک keypad که عددی بین ۰ تا ۹۰ درجه است رو بگیره و یک سرو موتور را به همان اندازه به چرخش در اورد با همین کد ها انجام میشه +کد های مربوط به سرو موتور؟؟؟
با سلام
خیر این کدها مربوط به آردوینو است و ارتباطی با برنامه نویسی تراشه میکرو ندارد.
سلام ببخشید من می خواستم یک عدد از کیپد بگیرم و اون رو به عنوان دمای مورد نظرم قرار بدم و بهوسیله tec او نو به دمای مورد نظر برسونم میشه درمورد قسمتی که عدد رو میگیره یه راهنمایی بکنید ممنون
ببخشید من می خواستم به وسیله کیپد یک عدد بدم اونوقت این عدد رو به عنوان متغیر تعریف کنم لطفا راهنمایی کنید
با سلام
خط ۷۱ درست است؟ rows یک آرایه ۴ تایی است در حالی که آرگومان آن(row) از مقدار ۰ تا ۵ تغییر می کند!
چند جای دیگر کد هم ایراد دارد.
با سلام
کاربر گرامی اگر اروری در کد دریافت میکنید، ضمیمه کنید تا بررسی شود.