Мигните светодиодом 5 раз с помощью цикла for

Можно ли позволить светодиоду мигать, например, 5 раз с помощью Arduino? Должен ли я использовать цикл For?

Что-то подобное работает в цикле настройки, но оно будет непрерывно выполняться в цикле void. Так что мой светодиод продолжает мигать.

  for (int i = 0; i <= 5; i++) {
    led HIGH
    delay(500);
    led LOW
    delay(500);
  }

Кроме того, должна быть запущена последовательность мигания, а после ее завершения должен быть произведен сброс. Полный код слишком велик для совместного использования, но он работает примерно следующим образом:

Существует "Банковское значение", оно заполняется пользователем и возвращается к нулю. Если оно равно нулю, то моргните 5 раз. После мигания светодиоды гаснут. Скетч ожидает нового пользователя, который снова заполнит банковское значение, и светодиодная подсветка должна быть снова запущена.

, 👍0

Обсуждение

В вашем цикле for, который, кстати, не рекомендуется, вам потребуется секундная задержка, чтобы увидеть, что что-то мигает. Чудо, однако, - это ваш "новый пользователь, который заполнит банковское значение`. пожалуйста, поподробнее..., @DataFiddler

@jsotola, чтобы перефразировать вопрос: как я могу позволить светодиоду мигать пять раз? В свою защиту я добавил фрагмент кода, чтобы показать, что я пробовал., @Niles

@DataFiddler, я знаю, что задержка не рекомендуется, лучше использовать millis. Это был просто пример того, что я уже пробовал. Чтобы уточнить, программа предназначена для какой-то автомойки. Программа ожидает получения некоторых монет / Токенов / eMoney, которые хранятся в bankValue. Когда банка заполнена, пользователь может выбрать различные программы стирки. Реле активируются в соответствии с программой. Значение банка будет уменьшаться при использовании программы стирки, пока не станет равным нулю. Все реле отключатся. На этом этапе я хочу, чтобы мигающий светодиод сигнализировал о том, что банк пуст. Стирка закончена, и теперь ждем ввода новых денег, @Niles

@Niles код, как вы его представили, мигает 5 раз, но он выполняется повторно, потому что loop ()' повторяется десятки тысяч раз в секунду (если, конечно, нет задержек) .... чтобы запустить код только один раз, используйте флаг, такой как setup () {bool xyz = true;} ... затем вы проверяете состояние флага loop () { if (xyz) { мигать светодиодами; делать другие вещи; xyz = false; } } ... это будет выполняться только один раз, если только в loop ()` нет какого-либо кода, который снова устанавливает флаг, @jsotola


1 ответ


1

Очень сложно дать правильный ответ, если вы не покажете нам контекст, в котором используется цикл for . Но я постараюсь:

В методе void loop должна быть часть, в которой вы обнаруживаете, что "банковское значение" равно нулю. Например:

if (bankValue == 0) 
{ 

}

Сначала вы должны быть уверены, что цикл for вызывается внутри этого блока.

if (bankValue == 0) 
{ 
  // Я исправил цикл, чтобы он выполнялся ровно 5 раз (<= -> <)
  for (int i = 0; i < 5; i++) 
  {
    led HIGH
    delay(500);
    led LOW
    delay(500);
  }
}

Затем вам понадобится флаг int blinkingDone = 0;, чтобы указать, что цикл for выполнен. Этот флаг должен быть инициализирован ложным значением, установлен в значение trueish после завершения цикла и сброшен, если пользователь снова "заполняет" значение bankValue.

Затем вы могли бы использовать его в качестве защитного элемента для входа в цикл for. Например:

int blinkingDone = 0;
int bankValue = 0;

..... somewhere else

if ( coin inserted or so )
{
  // заполнить банковское значение
  blinkingDone = 0;
} 

..... somewhere else 

if (bankValue == 0 && ! blinkingDone) 
{ 
  // Я исправил цикл, чтобы он выполнялся ровно 5 раз (<= -> <)
  for (int i = 0; i < 5; i++) 
  {
    // светодиодный ВЫСОКИЙ
    delay(500);
    // НИЗКАЯ
    delay(500);
  }
  blinkingDone = 1;
}

Есть потенциально лучшие способы сделать это. Но я не знаю вашего кода. Так что это самый простой способ, который я могу себе представить.

,

Это действительно полезно. Я не ожидал совершенно готового ответа. Теперь я знаю, что мне нужно работать с флагом для blinkingDone. Сам код находится на нескольких вкладках в Arduino и в общей сложности составляет несколько 100 строк. Я полагаю, что здесь есть что добавить. Я не знаю, правильно ли я использовал вкладки, но это что-то для другого потока Опять же, это действительно полезно, @Niles

в строке if (банковское значение == ноль && ! Мигает) в чем смысл этого !, @Niles

Это оператор not. Это означает, что "моргание * не * выполнено". Ах, и строка содержит опечатку, ноль должен быть равен 0. Мне действительно следует подумать, прежде чем писать ;-), @Peter Paul Kiefer