Menu
CoddyTech

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.

challenge icon

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);
}
quiz iconSprawdź się

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()

Poćwicz samodzielnie: Edytor online Arduino