چراغ چشمک زن با آردوینو بدون استفاده از دستورات تاخیری

جلسه هشتم: چراغ چشمک زن با آردوینو

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

ضعف استفاده از دستورات تاخیری در آردوینو

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

فرض کنید می خواهیم یک برنامه بسیار ساده با Arduino بنویسیم که در آن یک لامپ LED به مدت هر 10 دقیقه خاموش و روشن شود و بتوانیم با یک کلید در هر لحظه که خواستیم لامپ LED را خاموش کنیم. برای نوشتن این برنامه اگر بخواهیم برای ایجاد تاخیر 10 دقیقه ای از دستور Delay استفاده کنیم، زمانیکه پردازشگر به دستور Delay() می رسد برای مدت 10 دقیقه پشت دستور می ماند و دیگر دستورات بعدی را اجرا نمی کند به همین دلیل در طول این 10 دقیقه ما هر چندبار کلید را فشار دهیم لامپ ال.ای.دی خاموش نمی شود چراکه پردازشگر پشت دستور Delay متوقف شده و هیچ دستوری را تا زمان اتمام تاخیر بررسی نمی کند.

به همین دلیل می توان با کمی تفکر به این نتیجه رسید، دستور Delay برای ایجاد زمان تاخیر در این پروژه مناسب نیست چراکه ما در این پروژه به یک دستور تاخیری نیاز داریم، که پردازشگر آردوینو علاوه بر ایجاد تاخیر 10 دقیقه ای باقی کدها را نیز به صورت مداوم بدون هیچ تاخیری پردازش کند.

ایجاد تاخیر با استفاده از دستور millis() در آردوینو

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

حال شما می توانید به سادگی با نوشتن یک الگوریتم ساده از این دستور برای ایجاد تاخیر استفاده کنید. برای این منظور در ادامه ما یک برنامه به عنوان مثال با دستور Milis() نوشته ایم، که بدون استفاده از دستور تاخیری Delay() برنامه یک چراغ چشمک زن را نوشته ایم. که با مشاهده آن می توانید به راحتی متوجه نحوه استفاده از این دستور برای ایجاد تاخیر در برنامه های خود شد.

توجه : دستور millis() می تواند برای حداکثر 50 روز، زمان را در خود جای دهد و بعد از آن مقدار متغیر صفر شده و دوباره شروع به شمارش می کند.

لیست قطعات مورد نیاز

برد آردوینو Arduino UNO R3 مدل DIP1 عدد
لامپ LED زرد سایز 5mm میلی متر مدل مات1 عدد
مقاومت 220 اهم با توان 0.25 وات و تلرانس 1 درصد1 عدد
برد بورد (پروجکت برد) مدل GL1 عدد
سیم جامپر برد بوردی مدل دو سر نری (سری 40تایی)1 عدد

توضیحات پروژه

همانطور که پیشتر گفته شد در این مثال قصد داریم یک لامپ ال ای دی را به صورت مداوم توسط آردوینو بدون استفاده از دستور تاخیری Delay در فواصل زمانی مشخص روشن و خاموش کنیم، لطفا توجه داشته باشید برای کنترل LED لازم است که LED را به یکی از پایه های دیجیتال آردوینو متصل کنیم. که در برنامه نوشته شده برای این مثال، این پایه در تمامی مدل های آردوینو به غیر از دو مدل Gemma و MKR1000 پایه D13 است. همچنین در مدل MKR1000 پایه D6 و در مدل Gemma پایه D1 مد نظر است.

برای راه اندازی لامپ LED و اتصال آن به برد آردوینو باید همانند نقشه شماتیک زیر عمل کنید، به این صورت پایه بلند لامپ ال ای دی که نشان دهنده پلاریته مثبت آن است را به واسطه مقاومت 220 اهمی به پایه مربوطه در آردوینو که در بالا ذکر شد متصل کنید. و پایه کوتاهتر لامپ ال ای دی که نشان دهند پلاریته منفی آن است را به منفی منبع تغذیه یا پایه GND بر روی آردوینو متصل کنید.

بعد قبل
چراغ چشمک زن با آردوینو بدون استفاده از دستورات تاخیری
چراغ چشمک زن با آردوینو بدون استفاده از دستورات تاخیری
بعد قبل

سورس کد برنامه در نرم افزار آردوینو

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

 اطلاعات پروژه

 رمز فایل : www.electronics98.com (این مطلب فاقد فایل جهت دانلود است)

 محیط برنامه نویسی : Arduino (IDE)

 برنامه نویسی شده به زبان : ترکیبی از برنامه نویسی به زبان سی (C) یا سی پلاس پلاس (++C)

 نویسنده : فرهاد اکبری

 تاریخ انتشار : 16 آوریل 2018

12 دیدگاه

  1. سلام من اردوینو رو به لپتاپم وصل کردم ال ای دی خودش نا خدا اگاه بدون اینکه برنامه ای بهش داده باشم شروع به چشمک زدن میکنه
    میشه لطفا بهم بگید دلیل اون چیه ممنون

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

  3. سلام ببخشید با استفاده از دستورات millisچطور می توان یک ساعت درست کرد که در سریال مانیتور نمایش بدهد؟؟

    ممنون

  4. سلام دوست عزیز
    قبل از هر چیز باید بدانید این زمان برای ساخت ساعت، دقیق نیست یعنی ممکن است زمان در طول شبانه روز عقب و یا جلو بیافتد. به همین دلیل در صورت تمایل به ساخت ساعت باید از ماژول و یا آی سی ساعت استفاده کنید که زمان دقیق در اختیاز شما قرار می دهد.
    در همین مثال زمان یک ثانیه تولید می شود و هر یک ثانیه لامپ LED خاموش روشن می شود، حال شما می توانید سه متغیر (ثانیه، دقیقه، ساعت)در برنامه تعریف کنید و برنامه را طوری توسعه دهید که با هر بار روشن شده لامپ LED به مقدار متغیر ثانیه یک واحد افزایش یابد و بعد از آن به ترتیب مقدار دقیقه و ساعت تغیر کند و در پایان مقادیر با دستور Serial.println(); در محیط سریال نمایش داده شوند.

  5. سلام
    بنده یه برنامه می خوام که دو تا رله 5 ولت رو به صورت جداگانه زمان قطع و وصل بدهم .با Dlay نمیشه .راهنمایی کنید .ممنون

  6. ممنون از شما آقای اکبری
    بنده با یک ماژول 5 ولت دارای دو رله و بورد UNO R3 می خوام دو تا فن رو در دو زمان متفاوت روشن و خاموش کنم .در واقع با یک بورد آردوینو دو تایمر متفاوت داشته باشم . چنین برنامه ای میشه بهم معرفی کنید . که بریزم روی بورد جواب بگیرم

  7. سلام دوست عزیز
    برای زماندهی رله ها که هر رله در یک ساعت مشخص روشن و خاموش شوند بهتر است از یک ماژول و یا آی سی ساعت مثل DS1307 استفاده کنید، برای آشنایی با ماژول و آی سی ساعت و راه اندازی آن با برد آردوینو می توانید پروژه زیر را مطالعه فرمایید:
    آموزش ساخت ساعت و کار با آی سی DS1307 توسط آردوینو

  8. سلام من میخواهم فقط با یک push button یک led را روشن و خاموش کنم و وقتی که روشن است خودش بعد از فقط ۱۰ دقیقه خاموش شود. از دستور Milis استفاده کردم و پروژه را ساختم اما وقتی LED را با دکمه روشن میکنم دقیقا بعد از 10 دقیقه LED خاموش نمیشود بعضی وقت ها بعد از 7 الی 8 ثانیه خاموش میشود و بعضی وقت ها هم بین 4 الی 5 دقیقه یعنی بین بازه ی 1 ثانیه تا 10 دقیقه متغیر است. که فکر میکنم به خاطر دستور milis است که همیشه در حال شمارش است. لطفا راهنمایی کنید که اشکال کار من کجاست.
    ممنون

  9. سلام.
    من میخاستم یه کدی رو بنویسم که اگه یک کلیدی 1 بار وصل شد یک کاری رو انجام بده. واگه همون کلید 2بار پشت سر هم وصل شد یک کار دیگه ای انجام بده. لطفا راهنمایی بفرمایید و در صورت امکان مثال هم بزنید.

  10. لطفا راهنمایی کنید. خیلی لازم دارم. خودم هم هرچه قدر فکر میکنم چیزی به ذهنم نمی رسه.
    ممنون

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

  12. سلام.
    خیلی ممنون از راهنماییتون آقای اکبری.
    مشکلم برطرف شد.

 شرایط و قوانین ثبت دیدگاه

 فارسی بنویسید و از کیبورد فارسی استفاده کنید.

 لطفاً بیش‌از‌حدِ معمول، شکلک یا ایموجی استفاده نکنید و از کشیدن حروف یا کلمات با صفحه‌کلید بپرهیزید.

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

 از ارسال لینک‌های سایت‌های دیگر و ارایه‌ی اطلاعات شخصی خودتان مثل شماره تماس، ایمیل و آی‌دی شبکه‌های اجتماعی پرهیز کنید.