Menu
CoddyTech

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.

challenge icon

Görev

Orta

Düğ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;
  }
}
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