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.
Görev
OrtaSarı 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);
}
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
1millis()
millis() Saatiunsigned long ile Zaman DeğerleriGecikmesiz Yanıp Sönmeİki LED, İki HızDüğmeyle Açıp Kapatırken Yanıp SönmeZamanlayıcıyla Yanan IşıkKendi başına pratik yap: Arduino playground