ساعة إيقاف بزر
جزء من قسم التوقيت دون delay في رحلة Arduino على Coddy. الدرس 18 من 18.
لساعة الإيقاف حالتان: التشغيل والإيقاف، والضغط ينقلها من إحداهما إلى الأخرى. وهي تقيس الوقت بالطريقة الآمنة: خزّن millis() عند البدء، واطرحه عند الانتهاء.
if (!running) {
running = true;
startTime = millis();
} else {
running = false;
Serial.println(millis() - startTime);
}تُزال ارتدادات الزر كما في زر الوضع: تصرّف عند تغيّر القراءة، ثم انتظر 20 ms. ينتظر كلا الضغطين المدة نفسها، وهي 20 ms، لذا يبقى الوقت بينهما صحيحًا.
يُظهر LED الحالة: يكون مضاءً أثناء تشغيل ساعة الإيقاف.
التحدي
متوسطالزر تتم قراءته وإزالة الارتداد منه بالفعل، وتُشغَّل onPress() مرة واحدة لكل ضغطة. اكتب onPress():
- إذا لم تكن ساعة الإيقاف قيد التشغيل: شغّلها، وخزّن
millis()فيstartTimeوأضئ LED - إذا كانت قيد التشغيل: أوقفها، وأطفئ LED واطبع الوقت بالمللي ثانية
اضغط Run، ثم اضغط الزر مرتين، ثم Check.
جرّب بنفسك
const int ledPin = 13;
const int buttonPin = 2;
bool wasPressed = false;
bool running = false;
unsigned long startTime = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
// تُستدعى مرة واحدة عند كل ضغطة.
void onPress() {
// غير مشغّل: ابدأ، واحفظ الوقت، وأضئ LED
// مشغّل: توقّف، وأطفئ LED، واطبع الوقت بوحدة ms
}
void loop() {
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed != wasPressed) {
if (pressed) {
onPress();
}
wasPressed = pressed;
delay(20); // دع نقاط التلامس تستقر
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس التوقيت دون delay
تدرّب بنفسك: Playground لـ Arduino