@fancarver
инженер-радиотехник

Как обойтись без delay в скетче для Ардуино?

Помогите обойти проблему с delay в else. В этом виде всё работает, но delay мешает обрабатывать состояние кнопки. Как-то можно мигать красным светодиодом по-другому?
int BuzzPin = 9;   // выход на динамик
int UccBF = 12;   // питание р/с
int Button = 5;   // вход кнопки
int GreenLed = 10;    // выход на зелёный светодиод 
int RedLed = 9;   // выход на красный светодиод 

void setup()
{
pinMode(BuzzPin, OUTPUT);   // устанавливает режим работы - выход
pinMode(UccBF, OUTPUT);   // устанавливает режим работы - выход
pinMode(GreenLed, OUTPUT);    // устанавливает режим работы - выход
pinMode(Button, INPUT);   // устанавливает режим работы - вход
digitalWrite(BuzzPin, HIGH);   // выключает динамик
digitalWrite(UccBF, HIGH);   // выключает питание р/с
digitalWrite(GreenLed, LOW);   // выключает зелёный светодиод
digitalWrite(Button, HIGH);   // включаем подтягивающий резистор
}

void loop() 
{
  if (digitalRead(Button) == LOW) {   // считываем состояние кнопки
    digitalWrite(BuzzPin, LOW); delay(500);   // Включаем звук на 0,5 секунд.
    digitalWrite(BuzzPin, HIGH); delay(5000);   // Выключаем звук на 5 секунд. 
    digitalWrite(UccBF, LOW);   // включаем питание р/с:
    digitalWrite(GreenLed, HIGH);    // зажигаем зелёный светодиод:
    for (int i=0; i <= 5; i++) {
      digitalWrite(BuzzPin, LOW); delay(500);   // Включаем звук на 0,5 секунд
      digitalWrite(BuzzPin, HIGH); delay(500);   // Выключаем звук на 0,5 секунд
    }
    digitalWrite(BuzzPin, LOW); delay(1000);   // Включаем звук на 1 секунду
    digitalWrite(BuzzPin, HIGH);   // выключаем звук
    digitalWrite(UccBF, HIGH);   // выключаем питание р/с
    digitalWrite(GreenLed, LOW);   // выключаем зелёный светодиод
  }
  else {
    // мигаем красным светодиодом
    digitalWrite(RedLed, HIGH); delay(100);
    digitalWrite(RedLed, LOW);  delay(900);
  }
}
  • Вопрос задан
  • 363 просмотра
Решения вопроса 1
@vanyamba-electronics
В таком коротком посте столь длинный ответ разместить довольно сложно. Могу порекомендовать почитать мою статью на эту тему Arduino. Как мигать светодиодом без delay.
Либо использовать библиотеку LEDseq, с помощью которой можно задавать последовательности миганий. Например сделать так, чтобы по нажатию кнопки светодиод три раза мигнул.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Уроки Alexgyver, там и библиотека по работе спкнопками и примеры на millis
Ответ написан
Комментировать
anthtml
@anthtml
Системный администратор программист радиолюбитель
Вариант 1 - Заменить функцию delay на нее исходник с millis
Вариант 2 - перевесить кнопку на 2-3 пин и обрабатывать через прерывания
Ответ написан
Комментировать
nava2002
@nava2002
Инженер
Вообще правила хорошего тона рекомендуют работать БЕЗ delay().
Вариант
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы