Menu
CoddyTech

millis() ile Trafik Işığı

Coddy'nin Arduino Journey'sinin Projeler bölümünün bir parçası. Ders 2 / 24.

Her delay(3000) sırasında kart başka hiçbir şey yapmaz; bu yüzden sonraki adımda eklenecek yaya geçidi düğmesini fark edemez. Zamanlama millis() kullanılarak yapılır.

Işık bir durum makinesidir: her zaman tek bir durumdadır (yeşil, sarı veya kırmızı) ve bu durum yeterince uzun sürdüğünde bir sonrakine geçer. Durumları adlandırmak için bir enum, geçerli durumu tutmak için bir değişken ve ne zaman başladığını tutmak için başka bir değişken kullanılır:

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;

İlk durum yeşildir; bu yüzden setup() içinde yeşil ışığı yak. loop()'un her geçişinde bir switch, geçerli durumun yeterince uzun sürüp sürmediğini denetler ve ancak o zaman sonraki duruma geçip ışıkları değiştirir:

case GREEN:
  if (millis() - lightStart >= 3000) {
    light = YELLOW;
    lightStart = millis();
    showLight(yellowPin);
  }
  break;

Hiçbir şey beklemez; böylece loop() başka işler için serbest kalır. Bunu bir durum ışığıyla kanıtla: kartın kendi LED'ini, 13 numaralı pini, her 500 ms'de bir yakıp söndür.

challenge icon

Görev

Orta

zamanlamayı delay() kullanmadan yeniden yaz:

  • yeşil ışığı 3000 ms, sarı ışığı 1000 ms, kırmızı ışığı 3000 ms açık tut
  • üç durum için bir enum, bir switch ve millis() kullan
  • setup() içinde yeşil ışığı yak ve showLight() işlevini yalnızca durum değiştiğinde çağır
  • 13 numaralı pini her 500 ms'de bir (500 ms açık, 500 ms kapalı) sürekli olarak yanıp söndür

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

Kendin dene

// Araba ışıkları
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;

// Bir ışığı yak ve diğer ikisini söndür.
void showLight(int pin) {
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, LOW);
  digitalWrite(greenPin, LOW);
  digitalWrite(pin, HIGH);
}

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
}

void loop() {
  showLight(greenPin);
  delay(3000);
  showLight(yellowPin);
  delay(1000);
  showLight(redPin);
  delay(3000);
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Projeler bölümündeki tüm dersler

Kendi başına pratik yap: Arduino playground