Menu
CoddyTech

Kesme ile Basışları Sayma

Coddy'nin Arduino Journey'sinin delay() Kullanmadan Zamanlama bölümünün bir parçası. Ders 15 / 18.

Girişler bölümünde gördüğünüz gibi, düğmeler sıçrama yapar: yaklaşık bir milisaniye boyunca kontaklar birbirine değer, ayrılır ve tekrar değer; hem basıldığında hem de bırakıldığında. Bir kesme her teması görür; bu yüzden FALLING kesme hizmet yordamında (ISR) 1 eklemek, tek bir tıklamayı birkaç kez sayar.

Bir ISR, delay() ile sıçramayı gideremez: delay() saatin kendi kesmesine ihtiyaç duyar ve bir ISR çalışırken kesmeler duraklatılır. Bunun yerine saati kullanın. Son sayılan basışın ne zaman gerçekleştiğini hatırlayın ve ondan çok kısa süre sonra gerçekleşen düşüşleri yok sayın:

unsigned long lastPress = 0;

void onPress() {
  unsigned long now = millis();
  if (now - lastPress >= 200) {
    presses = presses + 1;
    lastPress = now;
  }
}

Bir ISR içinde millis() okumak uygundur: ISR'nin başladığı zamanı verir. Bırakma sırasında oluşan sıçramaların bu aralığın içinde kalması için bir tıklamadan uzun, iki hızlı tıklama arasındaki süreden kısa bir aralık seçin. İnsanlar için 200 ms uygundur.

challenge icon

Görev

Orta

Bu sayaç her tıklamayı birkaç kez sayıyor. onPress() içinde titreşimleri önle:

  • bir unsigned long lastPress değişkeni ekle
  • yalnızca lastPress üzerinden en az 200 ms geçtiyse bir düşen kenarı say ve ardından zamanı lastPress içinde sakla

Run düğmesine bas, düğmeye birkaç kez tıkla ve sayımı izle, ardından Check düğmesine bas.

Kendin dene

const int buttonPin = 2;

volatile int presses = 0;
int shown = 0;

void onPress() {
  // Pinin her düşen kenarı sayılır, sıçramalar da: burada sıçrama etkisini gider
  presses = presses + 1;
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}

void loop() {
  // Sayı her değiştiğinde yazdır
  if (presses != shown) {
    shown = presses;
    Serial.println(shown);
  }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

delay() Kullanmadan Zamanlama bölümündeki tüm dersler

Kendi başına pratik yap: Arduino playground