القياس باستخدام micros()
جزء من قسم التوقيت دون delay في رحلة Arduino على Coddy. الدرس 16 من 18.
تحسب millis() المللي ثانية الكاملة، وهذا غير دقيق بما يكفي للأشياء القصيرة: فالضغط لمدة 2.5 ms سيُقرأ على أنه 2 أو 3. أما micros() فهي ساعة من النوع نفسه، لكنها تحسب الميكروثانية، أي أجزاء من مليون من الثانية: 1000 منها في كل مللي ثانية.
على Uno، تزداد القيمة بخطوات مقدارها 4 ميكروثوانٍ، وتُرجع أيضًا قيمة unsigned long. لقياس الوقت، اقرأ القيمة قبل العملية وبعدها، ثم اطرح:
unsigned long start = micros();
int reading = analogRead(A0);
unsigned long took = micros() - start;
Serial.println(took); // حوالي 110: تستغرق analogRead() حوالي 0.1 msلأنها تحسب بسرعة كبيرة، تنفد الأرقام في micros() أسرع بكثير من millis(): فبعد نحو 70 دقيقة تبدأ من جديد عند 0. استخدمها للأوقات القصيرة، واستخدم millis() لأي مدة أطول من بضع دقائق.
التحدي
سهلقِس المدة التي يُضغط فيها على الزر، بالميكروثانية:
- عندما يُضغط على الزر، خزّن
micros()فيpressedAt - عندما يُترك الزر، اطبع
micros() - pressedAt
اضغط على Run، وانقر على الزر، ثم اضغط على Check.
جرّب بنفسك
const int buttonPin = 2;
bool wasPressed = false;
unsigned long pressedAt = 0;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed && !wasPressed) {
// تم الضغط على الزر للتو: احفظ الوقت
}
if (!pressed && wasPressed) {
// تم تحرير الزر للتو: اطبع مدة الضغط عليه بالميكروثانية
}
wasPressed = pressed;
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس التوقيت دون delay
تدرّب بنفسك: Playground لـ Arduino