//konieczne było utworzenie zmiennych przechowujących poprzednie momenty kiedy stan diody oraz przycisku zmieniał się, w celu odniesienia się do nich w cyklach następujących
unsigned long lastTimeButtonStateChanged = 0;
unsigned long lastTimeLedStateChanged = 0;
//interwał, z jakim ma migać dioda
unsigned long interval = 500;
//zmienna, które na przestrzeni programu pozostaną przy swoich inicjalnych wartościach
//czas jaki musi minąć (w ms) między następnymi kliknięciami przycisku - stosowane w celu minimalizacji wpływu stanu nieustalonego przycisku
const long debounceDuration = 200;
void setup() {
//deklaracja odpowiednich pinów jako wyjścia (diody) oraz wejście (przycisk)
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(A1, INPUT_PULLUP);
}
//uzależnienie działań w loopie od funkcji millis() zmiast delay(ms) umożliwia zastosowanie dwóch instrukcji działających niemal równolegle
void loop() {
//zmiana stanu przycisku została dodatkowo obudowana w pętlę zapobiegającą występowaniu drgań styków
//kliknięcie przycisku nie przyniesie skutku, o ile między nim, a poprzednim, które przyniosło skutek nie minął ustalony czas
if (millis() - lastTimeButtonStateChanged > debounceDuration) {
if (digitalRead(A1) == LOW) {
lastTimeButtonStateChanged = millis();
//w tym przykładzie kliknięcie przycisku powoduje dekrementację odstępu między mignięciami diod o 500 ms
interval+=500;
//w wypadku, gdy interwał osiągnie wartość 0 -> z powrotem jest przywracany do watości 2s
if (interval >= 2000) {
interval = 0;
}
}
}
//część programu odpowiadająca za ciągłe miganie diod
//instrukcja warunkowa wykonywana jeśli różnica między obecną wartością funkcji millis(), a tą zapisaną podczas poprzedniego wykonania instrukcji jest większa lub równa interwałowi ustalonemu na początku programu
if (millis() - lastTimeLedStateChanged >= interval) {
//przypisanie aktualnej wartości funkcji millis(), w celu porównywania do niej podczas następnych cykli pętli loop
lastTimeLedStateChanged = millis();
//jeśli warunek zostaje spełniony, diody zmieniają swój stan na przeciwny
digitalWrite(10, !digitalRead(10));
digitalWrite(11, !digitalRead(11));
digitalWrite(12, !digitalRead(12));
digitalWrite(13, !digitalRead(13));
}
}