جلسه هفتم دوره آردوینو- ادامه راه اندازی کلیدفشاری با آردوینو

مقدمه

دوستان سلام. در جلسه قبل در مورد کلید فشاری با هم صحبت کردیم و گفتیم چطور با زدن یک کلید یه چراغ رو روشن کنیم. در ادامه هم توضیح دادیم که این روش وقتی که بخوایم چراغمون روشن بمونه کاربرد نداره چون مدام باید دستمون رو کلید بمونه. در این جلسه سعی داریم تلاشی کنیم برای رفع این مشکل. مثل همیشه مستقیم میریم سر اصل مطلب.

دوست عزیز ، این جلسه یک جلسه کاملا عملی است. اگر نیاز به کدنویسی دارد ، ادیتور خود را باز کنید. اگر مداری لازم است بسته شود ، قطعات آن را تهیه کنید و گام به گام با این جلسه پیش بروید. اگر هم محاسباتی لازم است ، خودتان کاغذ و قلم را بردارید و محاسبات را انجام دهید. این کارها را انجام دهید تا یک بار برای همیشه آردوینو را به صورت حرفه ای یاد بگیرید.

اولین تلاش برای روشن ماندن یک LED

این که میگیم اولین تلاش یعنی یه کاری انجام میدیم ولی این کاره یه عیب هم داره که در ادامه میگم و سپس در جلسات بعدی این تلاش رو کاملتر میکنیم تا به نتیجه کاملا دلخواه خودمون برسیم. همونطور که در جلسات قبلی هم گفتیم میخوایم اصولی با همدیگه آردوینو یادبگیریم پس زیاد نگران این نباشید که این جلسات دستوری رو معرفی نمیکنیم. به وقتش در مورد دستورات آردوینو هم کامل توضیح میدیم.

 برای این که فقط با یکبار زدن کلید چراغ برای همیشه روشن بمونه باید از حافظه میکروکنترلر استفاده کنیم . برای این کار ما از متغیرها استفاده میکنیم. یک متغیر در فضایی در حافظه آردوینو هست که میتونه داده ها رو در خودش ذخیره کنه.  حالا این داده میتونه یه عدد باشه یه متن باشه یا هر چیز دیگه.

برای این که این مفهوم رو بهتر یاد بگیرید دفترچه یادداشت رو در نظر بگیرید. این دفترچه یه فضایی داره برای نوشتن که در این دفترچه شما میتونید اطلاعات رو ذخیره کنید و هر وقت که دوباره نیازتون شد بهش مراجعه کنید. 

در آردوینو استفاده از متغیر خیلی ساده است و فقط کافیه شما ابتدا نوع داده ای که میخواید در یک متغیر ذخیره کنید رو بنویسید ( مثلا int برای ذخیره اعداد صحیح) سپس اسم متغیر خودتون رو مینویسید و در آخر هم اگه دوست داشتید میتونید به این متغیرتون یه مقدار اولیه بدید. نمونه ای از تعریف یک متغیر در مثال زیر آورده شده:

int val = 0;

این به این معنی هست که شما داده های صحیح رو در متغیرتون ذخیره میکنید. اسم این متغیر val  هست و مقدار اولیه صفر رو هم بهش نسبت دادید. 

البته شما میتونید در هر جای برنامه مقدار این متغیر رو عوض کنید. مثلا در وسط کدتون بنویسید:

val = 112;

که از اون خط به بعد دیگه مقدار متغیر val صفر نیست و برابر 112 هست. 

 

This is box title
تا حالا توجه کردید آخر همه دستوراتی که نوشتیم سیمی کالن وجود داره؟ این کار رو انجام میدن تا کامپایلر بدونه که اون دستور تموم شده و یه دستور جدید قراره شروع بشه ( کامپایلر یه بخشی از نرم افزار آردوینو هست که دستوراتی که ما مینویسیم رو به زبانی قابل فهم برای میکروکنترلر تبدیل میکنه.)

در برنامه ای که در زیر آورده شده. متغیر val برای این استفاده میشه تا نتیجه دستور digitalRead رو در خودش ذخیره کنه. هر چی که در ورودی پایه مربوط به digitalRead قرار داره در این متغیر ذخیره میشه تا وقتی که مقدار این ورودی تغییر کنه و مقدار جدیدی در این متغیر قرار بگیره.توجه کنید که متغیر ها از حافظه ی RAM استفاده میکنند که این حافظه خیلی سریع هست ولی ایرادش اینه که وقتی برد رو خاموش میکنید کل داده هایی که ذخیره شدن پاک میشه ( یعنی وقتی برد رو ریست میکنید دوباره مقدار متغیرها برمیگرده به همون حالت اولی که ابتدای برنامه تعریف کردید)  توجه داشته باشید که خود برنامه در حافظه ی flash ذخیره میشه. این حافظه همون حافظه ای هست که شما در گوشی ها شماره های موبایل یا آهنگ ها یا هر چیز دیگه ای رو ذخیره میکنید و حتی اگه گوشیتون رو هم خاموش کنید این اطلاعات باقی میمونن.

 حالا اجازه بدید که یه متغیر دیگه تعریف کنیم و وضعیت روشن یا خاموش بودن LED بعد از این که کلید رو رها کردیم، در اون متغیر ذخیره بشه.  

راه اندازی کلیدفشاری با آردوینو

 

حالا بیایید با هم این کد رو تست کنیم . اگه این کار رو انجام بدید میبینید که این کد یه خورده کار میکنه. می بینید که چراغ خیلی سریع وضعیتش تغییر میکنه و شما نمیتونید با فشار یه کلید به صورت کامل چراغ رو روشن یا خاموش نگه دارید.

قسمت جالب این کد متغیر state هست. متغیر state که مقدار 0 یا 1 رو در خودش ذخیره میکنه  که نشون دهنده وضعیت روشن یا خاموش بودن LED هست.  بعد از این که کلید رها شد مقدار این متغیر صفر میشه( در واقع LED خاموش میشه).در ادامه ما وضعیت فعلی کلید رو میخونیم و اگه کلید فشار داده شده باشه (val==HIGH) مقدار متغیر state رو از صفر به یک تغییر میدیم .طبق کد همون طور که میبینید در واقع مقدارش رو عکس کردیم. 

ما این کار رو با استفاده از یه تکنیک کوچک انجام دادیم. یعنی با دستور state = 1-state اگه مقدار state صفر باشه که این مقدار به یک تبدیل میشه و اگه مقدارش هم 1 باشه که این مقدار به صفر تبدیل میشه.  اگه بخوایم به این دستور ریاضی وار نگاه کنیم خیلی به چیز جالبی نمیرسیم  اما در برنامه نویسی از این دستورات میشه استفاده کرد. علامت = به این معنی هست که “مقداری رو که در طرف راست معادله بدست میاد در طرف سمت چپ قرار بده.” در اینجا مقداری که در state (طرف چپ معادله) قرار میگیره برابر 1 منهای مقدار قدیمی state هست.

در ادامه برنامه میبینیم که ما از state برای این که بفهمیم LED روشن هست یا خاموش استفاده کردیم و همونطور هم که گفته شد این باعث ناپایدار شدن نتیجه میشه. 

حالا چرا نتیجه مون ناپایدار میشه؟

علت این ناپایدار شدن به نحوه خوندن ما از کلید برمیگرده. آردوینو خیلی سریع هست و دستورالعمل های داخلیش رو هر ثانیه 16 میلیون بار اجرا میکنه. این یعنی وقتی شما کلید رو فشار میدید آردوینو احتمالا وضعیت کلید رو چند صد بار میخونه و مطابق اون متغیر state رو تغییر میده و همین عامل باعث میشه یه نتیجه غیر قابل پیش بینی اتفاق بیفته. مثلا وقتی میخواید LED خاموش باشه اون روشنه و بالعکس.  دقیقا مثل این که یه ساعت خراب هم در طول هر روز زمان رو دوبار درست نشون میده این کد هم هر چند وقت یه بار درست عمل میکنه. اما اکثر اوقات درست کار نمیکنه.

حالا باید چکار کنیم که این موضوع حل بشه. این کار رو در جلسه بعد با هم دیگه بررسی میکنیم. 

دوستان این جلسه هم به پایان رسید. مثل همیشه میتونید ما رو در تلگرام و یا اینستاگرام دنبال کنید:

اگه هم که خیلی عاشق ما هستید که ما رو به دوستاتون هم معرفی کنید. ممنون از همکاریتون 😉 

 

اشتراک گذاری:
مطالب زیر را حتما بخوانید

2 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

  • سلام ممنون از سایت خیلی خوبتون و این که رایگان هست. نمیدونم چرا این برنامه و بعضی برنامه های دیگه این ارور رو میده.لطفا کمک کنید واقعا گیر کردم توش

    • با سلام.
      لطفا کد خود را برای ما در این جا قرار دهید تا ما کد را تست کرده و خطاها را توضیح دهیم.
      موفق باشید.

دیدگاهتان را بنویسید