Menu
CoddyTech

Gecikmesiz Yanıp Sönme

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

delay() tüm çizimi durdurur. Bir yanıp sönme 500 ms boyunca beklerken loop() içindeki başka hiçbir şey çalışmaz: bu süre içinde basılan bir düğme, bekleme bitene kadar algılanmaz.

Çözüm hiç beklememektir. loop() tekrar tekrar, çok hızlı çalışsın ve her seferinde saati LED'in en son değiştiği anla karşılaştırsın. 500 ms geçene kadar hiçbir şey yapma. Sonra LED'i değiştir ve yeni anı kaydet:

const unsigned long interval = 500;
unsigned long previousMillis = 0;   // LED'in en son değiştiği zaman

void loop() {
  unsigned long now = millis();
  if (now - previousMillis >= interval) {
    previousMillis = now;           // bu anı hatırla
    // LED'i burada açıp kapat
  }
  // buradaki diğer her şey saniyede binlerce kez çalışır
}

now - previousMillis, son değişiklikten bu yana geçen süredir. LED'i değiştirmek için durumunu bir değişkende tut: int redState = LOW;, if/else ile tersine çevir ve digitalWrite(redLed, redState); ile yaz.

previousMillis değerini güncellemeyi unutursan, ilk 500 ms'den sonra koşul doğru kalır; böylece LED her döngüde değişir ve yarı yanıyormuş gibi görünür.

challenge icon

Görev

Orta

Sarı LED düğmeyi takip etmeli, ancak kırmızı LED'in delay() çağrıları döngüyü durdurduğu için geç tepki veriyor. Kırmızı LED'in yanıp sönmesini millis() kullanarak yeniden yaz:

  • düğme kısmını olduğu gibi bırak
  • her 500 ms'de 13 numaralı pindeki kırmızı LED'i açıp kapat
  • hiçbir yerde delay() kullanma

Run'a bas, düğmeyi basılı tut ve her iki LED'i izle, ardından Check'e bas.

Kendin dene

const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;

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

void loop() {
  // Sarı LED düğmenin durumunu takip eder. Bu kısmı koruyun.
  if (digitalRead(buttonPin) == LOW) {
    digitalWrite(yellowLed, HIGH);
  } else {
    digitalWrite(yellowLed, LOW);
  }

  // Kırmızı LED yanıp söner, ancak her delay() yukarıdaki satırları
  // yarım saniyeliğine durdurur. Bu kısmı millis() ile yeniden yazın.
  digitalWrite(redLed, HIGH);
  delay(500);
  digitalWrite(redLed, LOW);
  delay(500);
}
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