إزالة ارتداد الزر
جزء من قسم المدخلات في رحلة Arduino على Coddy. الدرس 6 من 22.
زر هذا الدرس زر حقيقي، والبرنامج المبدئي هو العداد الذي أنشأته في الدرس السابق. شغّله واضغط الزر مرة واحدة: سيزداد العدد بأكثر من واحد.
يوجد داخل الزر موصلان معدنيان يتلامسان. عندما يلتقيان فإنهما يرتدّان: يلامس أحدهما الآخر لمدة تقارب ميلي ثانية، ثم ينفصلان ويرتدان ليلتقيا مجددًا. ويحدث الشيء نفسه عند ترك الزر. تقرأ loop() المنفذ مرات عديدة خلال تلك الميلي ثانية، وتحتسب كل ارتداد كضغطة.
يُسمّى الحل إزالة ارتداد الزر: عندما تتغير القراءة، تعامل معها مرة واحدة، ثم انتظر نحو 20 ms حتى تستقر الموصلات قبل القراءة مجددًا. لن يلاحظ أحد مدة 20 ms.
if (reading != lastReading) {
if (reading == LOW) {
presses++;
Serial.println(presses);
}
delay(20);
}
lastReading = reading;انتظر بعد كل تغيير، وليس بعد الضغط فقط: فالزر يرتد عند تركه أيضًا، وكل ارتداد أثناء عودته يبدو كأنه ضغطة جديدة.
التحدي
متوسطأصلح العداد بحيث تُحتسب كل ضغطة مرة واحدة:
- عندما تختلف
readingعنlastReading، احتسبها إذا كانت ضغطة (LOW)، ثم انتظر 20 ms - واصل حفظ
lastReadingفي نهايةloop()
اضغط Run، واضغط الزر بضع مرات وراقب العد، ثم اضغط Check.
جرّب بنفسك
const int buttonPin = 2;
int presses = 0;
int lastReading = HIGH;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
int reading = digitalRead(buttonPin);
if (reading == LOW && lastReading == HIGH) {
presses++;
Serial.println(presses);
}
lastReading = reading;
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المدخلات
تدرّب بنفسك: Playground لـ Arduino