/*
Пример использования delay, который можно прерывать
Функция
byte delayWithStop(unsigned long ms)
написана на осове кода обычного delay(unsigned long ms) - код есть в конце скетча
*/
#define LED1 A1 // Светодиоды
#define LED2 A2
#define LED3 A3
#define LED4 A4
#define BUT_SS 2 // Клавиша Старт Стоп
#define DELAY1 1000
#define DELAY2 1000
#define DELAY3 1000
#define DELAY4 1000
bool flagWork;
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(BUT_SS, INPUT_PULLUP);
}
void loop() {
// Ждем нажатие и отпускание кнопки и переключаем режим
// задержки для игнорирования возможного дребезга контактов кнопки
if (digitalRead(BUT_SS) == LOW) {
delay(20);
while (digitalRead(BUT_SS) == LOW) {};
delay(20);
flagWork = !flagWork;
}
if (flagWork) {
byte ret;
digitalWrite(LED1, HIGH);
ret = delayWithStop(DELAY1);
digitalWrite(LED1, LOW);
if (ret != 0)
return;
digitalWrite(LED2, HIGH);
ret = delayWithStop(DELAY2);
digitalWrite(LED2, LOW);
if (ret != 0)
return;
digitalWrite(LED3, HIGH);
ret = delayWithStop(DELAY3);
digitalWrite(LED3, LOW);
if (ret != 0)
return;
digitalWrite(LED4, HIGH);
ret = delayWithStop(DELAY4);
digitalWrite(LED4, LOW);
if (ret != 0)
return;
}
}
// yieldResult вызывается из delayWithStop
// и должна быть разумно короткой по времени выполнения.
// Пояснение: Оригинальная yield - не имеет возвращаемого значения
byte yieldResult(void) {
if (digitalRead(BUT_SS) == LOW)
return 1;
else
return 0;
}
// Возвращает 0 если задержка не перервалась раньше времени
// Возвращает не 0 если задержка прервалась.
byte delayWithStop(unsigned long ms)
{
uint32_t start = micros();
while (ms > 0) {
if (auto tmp = (yieldResult() != 0))
return tmp;
while ( ms > 0 && (micros() - start) >= 1000) {
ms--;
start += 1000;
}
}
return 0;
}
/* Оригинальный delay не может быть остановлен,
поэтому сделаны версии delay и yield с возможностью остановки
void delay(unsigned long ms)
{
uint32_t start = micros();
while (ms > 0) {
yield();
while ( ms > 0 && (micros() - start) >= 1000) {
ms--;
start += 1000;
}
}
}
*/
WOKWI