تابع ()pulseInLong آردوینو
تابع ()pulseInLong آردوینو جزو توابع ورودی خروجی پیشرفته آردوینو می باشد و جایگزینی برای تابع ()pulseIn است که در مدیریت سناریوهای تحت تأثیر پالسهای طولانی و وقفه بهتر عمل میکند.
به کمک تابع ()pulseInLong می توان یک پالس ( یا HIGH یا LOW ) را بر روی پین موردنظر خواند. برای مثال اگر پارامتر value مقدارش HIGH باشد، تابع ()pulseInLong منتظر می ماند تا پین موردنظر از LOW به HIGH برود و بلافاصله شروع به اندازه گیری زمان می کند تا زمانی که پین موردنظر دوباره به حالت LOW برگردد آنگاه اندازه گیری زمان را متوقف می کند و طول و مدت زمانی را که اندازه گیری کرده است را برحسب میکروثانیه برمی گرداند یا اینکه اگر در مدت زمانی که برای پارامتر timeout درنظر گرفته شده است هیچ پالس کاملی اتفاق نیفتد، مقدار صفر را برمی گرداند.
نکته مهم 1: زمانبندی تابع ()pulseInLong به صورت تجربی تعیین شده است و احتمالاً در پالسهای طولانیتر خطا نشان میدهد. روی پالسهایی با طول ۱۰ میکروثانیه تا ۳ دقیقه کار میکند. این روال فقط در صورت فعال بودن وقفهها قابل استفاده است. علاوه بر این، بالاترین وضوح با فواصل زمانی طولانی به دست میآید.
نکته مهم 2: اگر از پارامتر اختیاری timeout استفاده شود، کد سریعتر اجرا خواهد شد.
استفاده از تابع ()pulseInLong آردوینو - نحو و سینتکس
در برنامه نویسی آردوینو، تابع ()pulseInLong را می توان برای اندازهگیری طول پالس روی یک پین خاص، به صورت های زیر استفاده کرد:
pulseInLong(pin, value)
pulseInLong(pin, value, timeout)
همانطور که در عبارت بالا دیدیه می شود، تابع ()pulseInLong پارامتر زیر را می پذیرد:
pin: شماره پین آردوینو که میخواهید پالس را روی آن بخوانید. انواع داده مجاز:int.
value: نوع پالس برای خواندن: HIGH یا LOW . انواع داده مجاز:int.
timeout (اختیاری): تعداد میکروثانیههایی که باید برای شروع پالس منتظر بمانید؛ مقدار پیشفرض یک ثانیه است. انواع دادههای مجاز:unsigned long.
مقدار برگشتی از تابع ()pulseInLong آردوینو
این تابع، طول پالس (برحسب میکروثانیه) را برمی گرداند یا در صورت عدم شروع پالس قبل از زمان انقضا، 0 را برمیگرداند. نوع داده:unsigned long
مثال از تابع ()pulseInLong آردوینو
مثال زیر، مدت زمان یک پالس روی پین ۷ را بر حسب میکروثانیه چاپ میکند.
int pin = 7;
unsigned long duration;
void setup() {
Serial.begin(9600);
pinMode(pin, INPUT);
}
void loop() {
duration = pulseInLong(pin, HIGH);
Serial.println(duration);
}
نکته مهم 3: این تابع متکی است بر ()micros بنابراین نمیتوان از آن در زمینه ()noInterrupts استفاده کرد .