ممکناست بارها برای شما پیش آمده باشد که بخواهید در پروژتان از کلیدهای زیادی استفاده کنید و با کمبود پین مواجه هستید. با ما همراه باشید تا طریقه رفع این مشکل را به شما آموزش دهیم.ما در این پست قصد داریم روشی را به شما آموزش دهیم که به کمک آن بتوانید هر تعداد کلیدی را که دوست دارید در پروژه خود به کار ببرید آن هم فقط با استفاده از یک پین. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
روش اجرای پروژه
برای اتصال چند کلید به یک پین از مبدل آنالوگ به دیجیتال یا همان ADC استفاده میکنیم. به این صورت که مقاوتها و کلیدها را با یک آرایش خاص به آردوینو متصل میکنیم و سپس مقدار خروجی هر کلیدی را که فشرده شد به دست میآوریم.سپس با تعریف کردن آن مقادیر در برنامه وظیفه هر کلید را معین میکنیم. ابتدا طبق تصویر زیر مقاومتها و کلیدها را به آردوینو متصل کنید.
اجرای کد آردوینو
کد را در نرم افزار آردوینو اجرا کنید.
void setup() { Serial.begin(9600); } void loop() { unsigned int value = analogRead(A0); Serial.println(value); delay(250); }
پس از آپلود کد فوق به صورت تک تک کلیدها فشار دهید و مقداری که بر روی سریال مانیتور نرمافزار نمایش داده میشود را یادداشت کنید.در پروژهای که ما انجام دادیم مقادیر به به صورت زیر هستند:
شماره کلید | مقدار نمایش داده شده بر روی سریال مانیتور نرمافزار |
---|---|
۱ | ۵۳ |
۲ | ۱۰۴ |
۳ | ۱۴۹ |
۴ | ۱۹۰ |
۵ | ۲۲۸ |
اکنون کتابخانه کلیدهای آنالوگ را از لینک زیر دانلود و طبق آموزش زیر به نرمافزار آردوینو اضافه کنید:
دانلود کتابخانه کلیدهای آنالوگ
پس از نصب کتابخانه توسط دستور زیر کتابخانه به نرم افزار اضافه میکنیم:
#include <AnalogButtons.h>
سپس باید از کلاس analogButtons یک شی میسازیم و به جای آرگمان اول یعنی analog_pin شماره پین آنالوگی که کلیدها به آن وصل هستند را وارد میکنیم.
AnalogButtons analogButtons(ANALOG_PIN, 0);
چون کلیدهایمان را به پین شماره آنالوگ شماره ۱ یعنی A0 متصل کردیم پس باید اینگونه کد نویسی کنیم:
AnalogButtons analogButtons(A0, 0);
هر کلید دو مد کاری میتوانند داشته باشد : حالت اول Click است که هنگامی که کلید فشرده شود رخ میدهد. و حالت دوم Hold است که هنگامی که کلید نگه داشته شود رخ میدهد. د این کتابخانه باید اینگونه عمل کرد که ابتدا برای هر یک از دو وضعیت فوق یک تابع ببنویسیم.
مثلا میخواهیم هنگامی که کلید شماره ۲ فشرده شد عبارت “button ۲ clicked” و هنگامی که کلید شماره ۲ نگه داشته شد عبارت “button 2 held” بر روی سریال مانیتور نرمافزار آردوینو نمایش داده شود ، پس باید برای هر یک از دو حالت فوق یک تابع به شکل زیر بنویسیم:
void b2Click() { Serial.print("button 2 clicked"); } void b2Hold() { Serial.print("button 2 held"); }
اکنون باید از کلاس button یک شی بسازیم و مقادیری که قبلا از خواندن مقدار پین A0 از روی سریال مانیتور یاداشت کردیم را به توابع نوشته شده فوق نسبت دهیم.سازنده کلاس button به صورت زیر میباشد:
Button(uint16_t value, void (*clickFunction)(void) = 0, void (*holdFunction)(void) = 0, uint16_t holdDuration = 1000, uint16_t holdInterval = 250);
value : مقدار آنالوگ خوانده شده از کلید میباشد.
clickFunction : تابعی است که برای رخداد Click نوشتیم
holdFunction : تابعی است که برای رخداد Hold نوشتیم
holdDuration : مقدار زمانی است که برای تشخیص حالت Hold استفاده میشود و به طور پیشفرض دارای مقدار ۱۰۰۰ میلیقانیه میباشد.
holdInterval: مقدار زمانی است که برای تشخیص حالت Click استفاده میشود و به طور پیش فرض دارای مقدار پیشفرض ۲۵۰ میلیثانیه میباشد.
ساخت شی از کلاس button
در حالت اول اگر قرار بود که کلید فقط دارای وضعیت Click باشد یعنی فقط برای آن تابع Click نوشته بودیم باید طبق روش زیر آبجکتمان را ایجاد کنیم.
{ Serial.print("button 1 clicked"); // do somthing else } Button b1 = Button(anlog_value, &b1Click);
که بهجای analog_value باید مقدار خروجی کلید شماره ۱ که در ابتدای کار از روی سریال مانیتور نرمافزار نمایش داده شد وارد کنیم. مقدار خوانده شده ۵۳ بود پس باید اینگونه کد را توسعه دهیم:
{ Serial.print("button 1 clicked"); // do somthing else } Button b1 = Button(53, &b1Click);
در حالت دوم: کلید هم دارای وضعیت Click و هم ضعیت Hold میباشد یعنی برای کلید موردنظرمان هم تابع Click و هم تابع Hold نوشتیم. پس باید طبق روش زیر آبجکتمان را ایجاد کنیم:
Button b4 = Button(190, &b4Click, &b4Hold,holdDuration, holdInterval);
که b4Click تابع نوشته شده برای رخداد Click میباشد همچنین b4Hold تابع نوشته شده برای رخداد نگه داشتن کلید میباشد. و holdDutation مقدار زمان برای رخداد hold و holdInterval هم مقدار زمان برای رخداد Click می باشد.
پس با توجه به این الگو اگر بخوایم با نگه داشتن ۲۰۰۰ میلی ثانیه کلید تابع رخداد Hold نمایش داده شود و هچنین زمان برای تشخیص رخداد Click برابر ۲۰ میلی ثانیه باشد باید کدها را اینگونه توسعه دهیم:
void b4Click() { Serial.print("button 4 clicked"); } void b4Hold() { Serial.print("button 4 held"); } Button b4 = Button(190, &b4Click, &b4Hold,holdDuration, holdInterval);
در مرحله بعدی باید توسط تابع add شی ساخته شده از کلاس button را به شی ساخته شده از کلاس analogButtons نسبت دهیم.به صورت زیر:
analogButtons.add(aButton);
مثال: اکنون میخواهیم کلید شماره ۱و۲ را به کلاس analogButtons نسبت دهیم.
analogButtons.add(b1); analogButtons.add(b2);
در مرحله آخر تنها کاری که باید انجام دهیم این است که دستور زیر را در loop برنامه بنویسیم:
analogButtons.check();
پروژه
در این پروژه با توجه به جدول و شماتیک زیر برنامهای مینویسیم که در آن ۵ کلید به پین A0 متصل شده اند و با توجه به تحریک آن یا نگه داشتن آن ، رخداد متناظر با آن کلیک بر روی سریال مانیتور نرمافزار نمایش داده میشود.
شماره کلید | مقدار نمایش داده شده بر روی سریال مانیتور نرمافزار |
---|---|
۱ | ۵۳ |
۲ | ۱۰۴ |
۳ | ۱۴۹ |
۴ | ۱۹۰ |
۵ | ۲۲۸ |
#include <AnalogButtons.h> #define ANALOG_PIN A0 void b1Click() { Serial.print("button 1 clicked"); // do somthing else } void b1Hold() { Serial.println("button1 held"); } void b2Click() { Serial.print("button 2 clicked"); } void b2Hold() { Serial.print("button 2 held"); } void b3Click() { Serial.print("button 3 clicked"); } void b3Hold() { Serial.print("button 3 held"); } void b4Click() { Serial.print("button 4 clicked"); } void b4Hold() { Serial.print("button 4 held"); } void b5Click() { Serial.print("button 5 clicked"); } void b5Hold() { Serial.print("button 5 held"); } AnalogButtons analogButtons(A0, 0); Button b1 = Button(53, &b1Click, &b1Hold); Button b2 = Button(104, &b2Click, &b2Hold); Button b3 = Button(149, &b3Click, &b3Hold); // Default hold activation frequency of 250ms is overriden for button 4 so to // get it activated (hold function invoked) only every 500ms Button b4 = Button(190, &b4Click, &b4Hold,200, 30); // Default hold duration is 1 second, lets make it 5 seconds for button5 Button b5 = Button(228, &b5Click, &b5Hold, 5000); void setup() { Serial.begin(9600); Serial.println("Testing your Analog buttons"); analogButtons.add(b1); analogButtons.add(b2); analogButtons.add(b3); analogButtons.add(b4); analogButtons.add(b5); } void loop() { analogButtons.check();
وسایل مورد نیاز
آردوینو uno
۶ عدد مقاومت با هر مقداری که در دسترس هست پیشنهاد ما ۴ عدد مقاومت ۲۷۰ اهم و یک عدد مقاومت ۴٫۷ کیلواهم
برد بورد
آموزش عالی و بسیار کاملی بود.مچکرم
خواهش میکنم
خوشحالم که مورد رضایتتون واقع شده
با عرض سلام و خسته نباشید
دلیل error زیر در هنگام استفاده از برنامه ی موجود در آموزش چیه؟ با تشکر
#include <AnalogButtons.h>
^
exit status 1
#include expects “FILENAME” or
سلام من هم همین ارورو دارم
مشکل از کتاب خانست ایا ؟ چتور رفع میشه ؟
با سلام
ارور دریافتی را ارسال نمایید تا بررسی شود.
ممنون
اما آیا میشه توی پروژه های تولید زیاد هم از این روش استفاده کرد ؟
چون مقاومت ها به علت خطا ممکنه با هم فرق کنند . اونوقت باید بیاییم برای هر دستگاه جداگانه حساب کنیم؟!!!
با سلام
ضمن تشکر از توجه شما، در چنین شرایطی بر اساس حساسیت پروژه باید از مقاومت با درصد خطای کمتر استفاده کنید، تا اطمینان سیستم را بالا ببرید.
درود
از این روش برای LED ها و سایر هم میشه استفاده کرد ؟
با سلام و تشکر از توجه شما
خیر ماهیت ال ای دی با میکروسوئیچ متفاوت است. برای فرمان بایستی از ماژولهای درایور مانند Max7219 استفاده کنید.
سلام ممنون
میشه یه راهی بگید که چند تا ال ای دی رو به یک پایه دیجیتال وصل کنیم
من میخوام بدون دات ماتریس یه تابلو ال ای دی روان بسازم و مشکل کمبود پایه دارم
ممنون میشم راهنمایی کنید
سپاس
سلام
برای اتصال چند ال ای دی محدودیتی وجود ندارد ولی این روش پینشهاد نمیشود. برای هر ال ای دی به یک مقاومت برای کنترل جریان نیاز خواهید داشت و هر پایه دیجیتال آردوینو در حدود ۴۰ میلی آمپر جریان میکشد که باید ولتاژ و جریان کافی در مدار برقرار شود.
سلام من هر کدوم از دکمه ها رو میزنم عدد ۱۰۲۳ رو نشون میده چیکار کنم؟
سلام
اتصالات خود را مجددا بررسی نمایید.
با سلام
خب..حالااگه دویاسه تا از کلید ها همزمان فشرده بشه چی؟؟؟این مشکل رو چجوری میشه حلش کرد که با یک پین برای برد تعریف بشه؟ ممنون
با سلام
کاربر گرامی لطفا سوال خود را شفاف بپرسید تا راهنمایی شود.
سلام.چه جور از یک کلید برای انجام چند کار در اردوینو استفاده کنیم.مثل تایمر با هربار فشارش یک تایم تشان بدهد.با تشکر
با سلام
در این خصوص بایستی برنامه نویسی مجزا انجام داده شود. همین آموزش را جداگانه مطالعه فرمایید.
درود….ممنون بابت آموزش خوبتون…..آیا محدودیت کلید در این پروژه وجود داده؟منظورم اینه که مثلا اگه بخوایم صدعدد کلید به یک پایه متصل کنیم این روش حواب میده؟
با سلام
متن آموزش را دوباره بخوانید.