Menu
CoddyTech

Trafik Işığı Durum Makinesi

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

Bir trafik ışığı bir durum makinesidir: her zaman bir durumdadır (yeşil, sarı veya kırmızı), her durum belirli bir süre devam eder ve her durum sırada hangisinin geleceğini bilir:

  • GREEN: yeşil yanar; 2 s sonra YELLOW durumuna geçer
  • YELLOW: sarı yanar; 1 s sonra RED durumuna geçer
  • RED: kırmızı yanar; 2 s sonra GREEN durumuna geçer

Her satır bir case olur:

case GREEN:
  setLights(HIGH, LOW, LOW);
  if (now - lightStart >= 2000) {
    light = YELLOW;
    lightStart = now;
  }
  break;

delay(2000) ile ışık da çalışırdı, ancak başka hiçbir şey çalışamazdı. millis() ile loop() içindeki her geçiş mikrosaniyeler sürer; böylece kartın diğer işler için zamanı olur: burada, denetleyicinin çalışır durumda olduğunu göstermek için tüm süre boyunca yanıp sönen bir durum LED’i.

challenge icon

Görev

Orta

13. pindeki durum LED'i zaten yanıp sönüyor ve enum ile lightStart hazır. Trafik ışığını, her ışık için bir case olacak şekilde switch (light) olarak yaz:

  • yeşil 2 s, sarı 1 s, kırmızı 2 s, sonra yeniden yeşil
  • her seferinde tek LED, setLights() ile
  • delay() kullanma; böylece durum LED'i yanıp sönmeye devam eder

Run'a, ardından Check'e bas.

Kendin dene

const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;
const int statusLed = 13;   // kartın kendi LED'i

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;   // mevcut ışığın ne zaman yandığı

unsigned long statusPrevious = 0;
int statusState = LOW;

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

void setLights(int green, int yellow, int red) {
  digitalWrite(greenLed, green);
  digitalWrite(yellowLed, yellow);
  digitalWrite(redLed, red);
}

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

  // denetleyicinin çalıştığını göstermek için durum LED'i her 250 ms'de bir açılıp kapanır
  if (now - statusPrevious >= 250) {
    statusPrevious = now;
    if (statusState == LOW) {
      statusState = HIGH;
    } else {
      statusState = LOW;
    }
    digitalWrite(statusLed, statusState);
  }

  // trafik ışığı: her ışık için bir case içeren switch (light)
  // yeşil 2 s, sarı 1 s, kırmızı 2 s, ardından tekrar yeşil
}
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