Düğmeyle Modlar Arasında Geçiş Yap
Coddy'nin Arduino Journey'sinin delay() Kullanmadan Zamanlama bölümünün bir parçası. Ders 11 / 18.
Birçok cihazda modlar arasında geçiş yapan tek bir düğme vardır: bisiklet lambası kapanır, yanar, yanıp söner, hızlı yanıp söner ve sonra tekrar kapanır. Bu, saatin değil bir basışın sonraki duruma geçirdiği bir durum makinesidir.
Adımı kendi işlevine koy. Geçerli mod üzerindeki bir switch sonraki modu belirler ve son mod ilk moda geri döner:
void nextMode() {
switch (mode) {
case OFF:
mode = ON;
Serial.println("ON");
break;
// ... ve FAST tekrar OFF durumuna dönene kadar böyle devam eder
}
}Program taslağı, her basışta nextMode() işlevini bir kez çağırır. Düğmenin sıçraması, Girişler bölümünde öğrendiğin şekilde giderilir: okuma değiştiğinde işlem yap, ardından kontakların oturması için 20 ms bekle. mode üzerindeki ikinci bir switch, LED'i ayarlar.
Görev
OrtaDüğme ve LED sizin için yazılmıştır. Her basışta bir sonraki moda geçip modun adını yazdıracak şekilde nextMode() işlevini yazın: OFF, ON, BLINK, FAST, ardından tekrar OFF.
Run'a basın, düğmeye birkaç kez basın, sonra Check'e basın.
Kendin dene
const int ledPin = 13;
const int buttonPin = 2;
enum Mode { OFF, ON, BLINK, FAST };
Mode mode = OFF;
bool wasPressed = false;
unsigned long blinkPrevious = 0;
int ledState = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
// Sonraki moda geçer ve modun adını yazdırır.
void nextMode() {
// Her mod için bir case: sonraki modu ayarla, adını yazdır, break
}
// LED'in durumunu her interval ms'de bir değiştirir.
void blinkEvery(unsigned long interval) {
unsigned long now = millis();
if (now - blinkPrevious >= interval) {
blinkPrevious = now;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);
}
}
void loop() {
// 1. bir basış (sekme giderildikten sonra) nextMode() işlevini çağırır
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed != wasPressed) {
if (pressed) {
nextMode();
}
wasPressed = pressed;
delay(20); // kontakların kararlı hâle gelmesini bekle
}
// 2. LED'in ne yapacağına mod karar verir
switch (mode) {
case OFF:
digitalWrite(ledPin, LOW);
break;
case ON:
digitalWrite(ledPin, HIGH);
break;
case BLINK:
blinkEvery(500);
break;
case FAST:
blinkEvery(100);
break;
}
}
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
2Durum Makineleri
Modu Hatırlaswitch ile Seçimenum ile Adlandırılmış DurumlarTrafik Işığı Durum MakinesiDüğmeyle Modlar Arasında Geçiş YapKendi başına pratik yap: Arduino playground