Butonlu Kronometre
Coddy'nin Arduino Journey'sinin delay() Kullanmadan Zamanlama bölümünün bir parçası. Ders 18 / 18.
Bir kronometrenin çalışan ve durmuş olmak üzere iki durumu vardır; bir basış onu bir durumdan diğerine geçirir. Zamanı güvenli bir şekilde ölçer: başlangıçta millis() değerini saklar, sonunda çıkarma yapar.
if (!running) {
running = true;
startTime = millis();
} else {
running = false;
Serial.println(millis() - startTime);
}Düğme, mod düğmesinde olduğu gibi sıçramalara karşı filtrelenir: okuma değiştiğinde işlem yapılır, ardından 20 ms beklenir. Her iki basışta da aynı 20 ms beklendiği için aralarındaki süre doğru kalır.
LED durumu gösterir: kronometre çalışırken yanar.
Görev
OrtaDüğme zaten okunuyor ve titreşim giderme uygulanıyor, ayrıca onPress() her basışta bir kez çalışıyor. onPress() işlevini yaz:
- kronometre çalışmıyorsa: başlat,
millis()değerinistartTimeiçine kaydet ve LED’i yak - çalışıyorsa: durdur, LED’i söndür ve süreyi milisaniye cinsinden yazdır
Run’a bas, düğmeye iki kez bas, ardından Check’e bas.
Kendin dene
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);
}
// Her basışta bir kez çağrılır.
void onPress() {
// çalışmıyorsa: başlat, zamanı kaydet, LED'i yak
// çalışıyorsa: durdur, LED'i söndür, süreyi ms cinsinden yazdır
}
void loop() {
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed != wasPressed) {
if (pressed) {
onPress();
}
wasPressed = pressed;
delay(20); // kontakların kararlı hâle gelmesini bekle
}
}
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