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.
Görev
Orta13. 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
}
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