تاخیر در آردوینو بدون توقف برنامه

محتوا

تاخیر در آردوینو بدون توقف برنامه

اکثر مواقع لازم در تابع 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
امتیازدهی به مقاله
بخش نظرات
مشترک شوید
Notify of
guest
11 نظرات
قدیمی ترین
جدیدترین بیشترین آرای
Inline Feedbacks
View all comments
علی
علی
5 years ago

سلام..
من تو ی برنامه خیلی گیر افتادم و نمیدونم طور حل کنم:
من میخوام بعد از برقرار شدن یک شرط بعد از مثلا یک ثانیه یک led روشن بشود..اما بدون استفاده از دستور delay ..تقریبا مثل این :
}(if (p==HIGH
یک تاخیر یک ثانیه ای بجز delay
;(digitalWrite(led,HIGH
{

فقط اون قسمت تاخیر مشکل دارم..لطفا کمک کنید خیلی کارم گیره😭

علی
علی
5 years ago

نه خیر..متاسفانه به محض فشرده شدن کلید و HIGH شدن p .. ال ای دی روشن میشود.و تاخیری انجام نمی پذیرد.

رضا
رضا
2 years ago
Reply to  علی

for (int i = 0; i < 1000; i++) {
;(digitalWrite(led,HIGH
  }
این کد را تست کن

رضا
رضا
2 years ago

اول باید پین مورد نظر صفر باشد بعد شرط کنی که اگر پین مربوط به کلید فشرده شد بره داخل for و بعد از شمردن اون مقدار پین مورد نظرت را فعال کنه.برای تنظیم زمان مقدار داخل for را کم و بیشتر کن

علی
علی
5 years ago

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

11
0
Would love your thoughts, please comment.x
×
×

سبد خرید