Miganie bez opóźnienia
Część sekcji Odmierzanie czasu bez delay() ścieżki Arduino w Coddy. Lekcja 3 z 18.
delay() zatrzymuje cały szkic. Gdy dioda czeka 500 ms na mignięcie, nic innego w loop() się nie wykonuje: naciśnięcie przycisku w tym czasie nie zostanie zauważone, dopóki oczekiwanie się nie skończy.
Rozwiązaniem jest całkowite zrezygnowanie z oczekiwania. Pozwól, by loop() uruchamiało się w kółko, bardzo szybko, i za każdym razem porównuj zegar z momentem, w którym dioda LED zmieniła stan po raz ostatni. Dopóki nie upłynie 500 ms, nic nie rób. Następnie zmień stan diody LED i zapisz nowy moment:
const unsigned long interval = 500;
unsigned long previousMillis = 0; // kiedy ostatnio zmienił się stan diody LED
void loop() {
unsigned long now = millis();
if (now - previousMillis >= interval) {
previousMillis = now; // zapamiętaj ten moment
// zmień tutaj stan diody LED
}
// wszystko inne w tym miejscu wykonuje się tysiące razy na sekundę
}now - previousMillis to czas, który upłynął od ostatniej zmiany. Aby przełączać diodę LED, przechowuj jej stan w zmiennej, int redState = LOW;, zmieniaj go za pomocą if/else i ustawiaj go za pomocą digitalWrite(redLed, redState);.
Jeśli zapomnisz zaktualizować previousMillis, warunek pozostanie prawdziwy po upływie pierwszych 500 ms, więc dioda LED będzie zmieniać stan w każdej pętli i będzie wyglądać, jakby świeciła z połową jasności.
Wyzwanie
ŚredniŻółta dioda LED powinna reagować na przycisk, ale reaguje z opóźnieniem, ponieważ wywołania delay() czerwonej diody LED zatrzymują pętlę. Przepisz miganie czerwonej diody, używając millis():
- pozostaw część dotyczącą przycisku bez zmian
- co 500 ms przełączaj czerwoną diodę LED podłączoną do pinu 13
- nigdzie nie używaj
delay()
Naciśnij Run, przytrzymaj przycisk i obserwuj obie diody LED, a następnie naciśnij Check.
Spróbuj swoich sił
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() {
// Żółta dioda LED reaguje na przycisk. Zachowaj tę część.
if (digitalRead(buttonPin) == LOW) {
digitalWrite(yellowLed, HIGH);
} else {
digitalWrite(yellowLed, LOW);
}
// Czerwona dioda LED miga, ale każde wywołanie delay() wstrzymuje wykonywanie powyższych instrukcji
// na pół sekundy. Przepisz tę część, używając millis().
digitalWrite(redLed, HIGH);
delay(500);
digitalWrite(redLed, LOW);
delay(500);
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Odmierzanie czasu bez delay()
1millis()
Zegar millis()Czas w typie unsigned longMiganie bez opóźnieniaDwie diody LED, dwa tempaMiganie podczas przełączania przyciskiemŚwiatło na czas4Precyzyjne odmierzanie czasu
Pomiar za pomocą micros()Gdy licznik millis() się przepełniaStoper z przyciskiemPoćwicz samodzielnie: Edytor online Arduino