Döngünün Kaçırdığı Bir Basış
Coddy'nin Arduino Journey'sinin delay() Kullanmadan Zamanlama bölümünün bir parçası. Ders 12 / 18.
Bir sketch bazen yavaş bir işle meşgul olabilir ya da uzun bir delay() kullanabilir. Düğmeyi yalnızca işlemler arasında okuyan bir döngü, bunlardan birinin içinde başlayıp biten basışları kaçırır.
Kesme bunu çözer: bir pin değiştiğinde kart yaptığı işi durdurur, seçtiğin bir işlevi çalıştırır ve sonra devam eder. Çip, delay() sırasında bile pini kendi başına izler.
void onPress() {
digitalWrite(ledPin, HIGH);
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}attachInterrupt() üç şey alır: pinin kesmesini (digitalPinToInterrupt(buttonPin) bunu bulur), çalıştırılacak işlevi ve ne zaman çalıştırılacağını. FALLING, pinin HIGH durumundan LOW durumuna geçtiği andır: pull-up kullanıldığında, düğmeye basıldığı an.
Bu işleve kesme hizmet yordamı veya ISR denir. Kısa tut: delay() ve Serial kullanma.
Görev
KolayBu alarm, düğmesini yalnızca her 2 saniyede bir kontrol eder; bu yüzden kısa bir basış algılanmaz. Basışın LED’i hemen yakmasını sağlayın:
- LED’i yakan bir ISR olan
onPress()yazın setup()içinde bunuFALLINGile düğme pinine bağlayın
Yavaş işi loop() içinde bırakın. Alarmda olduğu gibi LED, basıştan sonra yanık kalır. Run düğmesine basın, düğmeye dokunun, ardından Check düğmesine basın.
Kendin dene
const int ledPin = 13;
const int buttonPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
// kesmeyi buraya bağla
}
void loop() {
// yavaş işlem: olduğu gibi bırak
Serial.println("working");
delay(2000);
// bu, düğmenin durumunu yalnızca 2 saniyede bir kontrol eder,
// bu yüzden kısa süreli bir basış algılanmaz
if (digitalRead(buttonPin) == LOW) {
digitalWrite(ledPin, HIGH);
}
}
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