Menu
CoddyTech
flag Ar iconالعربيةdown icon

إزالة ارتداد الزر

جزء من قسم المدخلات في رحلة Arduino على Coddy. الدرس 6 من 22.

زر هذا الدرس زر حقيقي، والبرنامج المبدئي هو العداد الذي أنشأته في الدرس السابق. شغّله واضغط الزر مرة واحدة: سيزداد العدد بأكثر من واحد.

يوجد داخل الزر موصلان معدنيان يتلامسان. عندما يلتقيان فإنهما يرتدّان: يلامس أحدهما الآخر لمدة تقارب ميلي ثانية، ثم ينفصلان ويرتدان ليلتقيا مجددًا. ويحدث الشيء نفسه عند ترك الزر. تقرأ loop() المنفذ مرات عديدة خلال تلك الميلي ثانية، وتحتسب كل ارتداد كضغطة.

يُسمّى الحل إزالة ارتداد الزر: عندما تتغير القراءة، تعامل معها مرة واحدة، ثم انتظر نحو 20 ms حتى تستقر الموصلات قبل القراءة مجددًا. لن يلاحظ أحد مدة 20 ms.

if (reading != lastReading) {
  if (reading == LOW) {
    presses++;
    Serial.println(presses);
  }
  delay(20);
}
lastReading = reading;

انتظر بعد كل تغيير، وليس بعد الضغط فقط: فالزر يرتد عند تركه أيضًا، وكل ارتداد أثناء عودته يبدو كأنه ضغطة جديدة.

challenge icon

التحدي

متوسط

أصلح العداد بحيث تُحتسب كل ضغطة مرة واحدة:

  • عندما تختلف 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;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المدخلات

تدرّب بنفسك: Playground لـ Arduino