تاخیر در آردوینو بدون توقف برنامه
اکثر مواقع لازم در تابع void loop از تاخیر استفاده کنیم، اما مسئله اینجاست استفاده از این دستور باعث توقف برنامه می شود و تا پایان سر ریز شدن وقفه برنامه ادامه نخواهد یافت و باعث مختل شدن روند برنامه می شود. خوب برای رفع این مشکل باید از این کدها استفاده کرد تا تاخیر بدون وقفه در برنامه ایجاد کنیم ، ابتدا متغیری را به صورت زیر تعریف می کنیم.
unsigned long timer;
سپس در تابع void loop کد زیر را وارد می کنیم
if (millis() > timer) { timer = millis() + 60000; محل قرار گرفتن کد ها در دستور شرطی }
در بالا هر 60000 میلی ثانیه (60 ثانیه) کدهای شما اجرا می شود بدون اینکه برنامه متوقف شود.
نمونه کد تاخیر بدون وقفه شماره 2
unsigned long int RTimeout; boolean Status = false; void setup() { Serial.begin(9600); } void loop() { if(Serial.available()){ String command = Serial.readString(); if (command == "HIGH" and Status == false){ RTimeout = millis()/1000 + 2; Status = true; Serial.println("> "+String(millis()/1000)); } } if (RTimeout <= millis()/1000 and Status == true){ Status =false; Serial.println("> "+String(millis()/1000)); } }
در این نمونه کد بعد از اجرای یک شرط مثلا فشار دادن یک کلید با فاصله زمانی دلخواه که اینجا 2 ثانیه است دستور دیگری ، فقط یکبار اجرا می شود. برای تست سریعتر همانند کد بالا بجای استفاده از دکمه در سریال مانیتور رشته HIGH رو ارسال کنید و نتیجه رو مشاهده کنید
5
3
votes
امتیازدهی به مقاله
سلام..
من تو ی برنامه خیلی گیر افتادم و نمیدونم طور حل کنم:
من میخوام بعد از برقرار شدن یک شرط بعد از مثلا یک ثانیه یک led روشن بشود..اما بدون استفاده از دستور delay ..تقریبا مثل این :
}(if (p==HIGH
یک تاخیر یک ثانیه ای بجز delay
;(digitalWrite(led,HIGH
{
فقط اون قسمت تاخیر مشکل دارم..لطفا کمک کنید خیلی کارم گیره😭
آموزش رو اضاف کردم تست بزنید اگه مشکلی بود اطلاع بدید
نه خیر..متاسفانه به محض فشرده شدن کلید و HIGH شدن p .. ال ای دی روشن میشود.و تاخیری انجام نمی پذیرد.
آها متوجه شدم
اصلاح می کنم و تست می زنم , خبر می دم
for (int i = 0; i < 1000; i++) {
;(digitalWrite(led,HIGH
}
این کد را تست کن
سلام
متوجه نشدم
هیچ اتفاقی نمی افته و پین مورد نظر همیشه 1 هست
اول باید پین مورد نظر صفر باشد بعد شرط کنی که اگر پین مربوط به کلید فشرده شد بره داخل for و بعد از شمردن اون مقدار پین مورد نظرت را فعال کنه.برای تنظیم زمان مقدار داخل for را کم و بیشتر کن
کلا این پست در مورد مدت زمان تاخیر نیست، بلکه در مورد تاخیر بدون توقف برنامه برای پردازش موازی است، برای وقتی که نباید برنامه در زمان مثلا چشمک زدن led مکث نداشته باشه
مثال: همزمان با خواندن از adc یه چراغ هم چشمک بزنه
حالا شما با هر دو روش بررسی کنین
این کدی که شما آموزش دادید..داخل یک شرط جواب نمیده…فقط برا وقتی خوبه که میخوام از اول اینکار رو بکنه..
این برای وقتی هست که می خواین بدون توقف برنامه هر چند ثانیه کدی رو اجرا کنید
تغییراتی ایجاد کردم ، تست بزنید