Menu
CoddyTech

enum ile Adlandırılmış Durumlar

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

0, 1 ve 2 olarak numaralandırılmış bir mod işe yarar, ancak if (mode == 2) ifadesi 2'nin ne anlama geldiğini söylemez. Bir enum, her sayıya bir ad verir:

enum State { READY, RUNNING, DONE };
State state = READY;

İlk satır, tek değerleri READY, RUNNING ve DONE olan yeni bir tür, State, oluşturur. Altta hâlâ 0, 1 ve 2 olsalar da adları her birinin ne anlama geldiğini belirtir. İkinci satır bu türden bir değişken oluşturur.

Bir enum ile bir switch birlikte kullanılır: her durum için bir case.

switch (state) {
  case READY:
    // READY'nin ne yaptığı ve ne zaman bir sonraki duruma geçtiği
    break;
  case RUNNING:
    // ...
    break;
}

Yeni bir duruma geçmek için state değerini ayarlayın ve ne zaman başladığını hatırlayın: state = DONE; stateStart = millis();. Böylece her durum kendi süresini millis() - stateStart ile ölçer. Bir taslağı bu şekilde yazmaya durum makinesi denir.

challenge icon

Görev

Orta

Bir makinenin üç durumu vardır. READY sizin için yazılmıştır: yeşil LED yanar ve bir basış makineyi çalıştırır. Diğer iki durumu ekleyin:

  • RUNNING: sarı LED yanar. 2000 ms sonra LED'i kapatın ve DONE durumuna geçin.
  • DONE: kırmızı LED yanar. 1000 ms sonra LED'i kapatın ve READY durumuna geri dönün.

Her değişiklikte stateStart değerini kaydedin. Run'a basın, düğmeye basın, ardından Check'e basın.

Kendin dene

const int buttonPin = 2;
const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;

enum State { READY, RUNNING, DONE };
State state = READY;

unsigned long stateStart = 0;   // geçerli durumun başladığı zaman

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(greenLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(redLed, OUTPUT);
}

void loop() {
  unsigned long now = millis();

  switch (state) {
    case READY:
      digitalWrite(greenLed, HIGH);
      if (digitalRead(buttonPin) == LOW) {
        digitalWrite(greenLed, LOW);
        state = RUNNING;
        stateStart = now;
      }
      break;

    // RUNNING durumunu ekle: sarı LED'i yak; 2000 ms sonra sarı LED'i söndür ve DONE durumuna geç

    // DONE durumunu ekle: kırmızı LED'i yak; 1000 ms sonra kırmızı LED'i söndür ve READY durumuna dön
  }
}
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