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.
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, birswitchvemillis()kullan setup()içinde yeşil ışığı yak veshowLight()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);
}
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