Мигните светодиодом 5 раз с помощью цикла for
Можно ли позволить светодиоду мигать, например, 5 раз с помощью Arduino? Должен ли я использовать цикл For?
Что-то подобное работает в цикле настройки, но оно будет непрерывно выполняться в цикле void. Так что мой светодиод продолжает мигать.
for (int i = 0; i <= 5; i++) {
led HIGH
delay(500);
led LOW
delay(500);
}
Кроме того, должна быть запущена последовательность мигания, а после ее завершения должен быть произведен сброс. Полный код слишком велик для совместного использования, но он работает примерно следующим образом:
Существует "Банковское значение", оно заполняется пользователем и возвращается к нулю. Если оно равно нулю, то моргните 5 раз. После мигания светодиоды гаснут. Скетч ожидает нового пользователя, который снова заполнит банковское значение, и светодиодная подсветка должна быть снова запущена.
@Niles, 👍0
Обсуждение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
- Как использовать SPI на Arduino?
- Как создать несколько запущенных потоков?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
В вашем цикле for, который, кстати, не рекомендуется, вам потребуется секундная задержка, чтобы увидеть, что что-то мигает. Чудо, однако, - это ваш "новый пользователь, который заполнит банковское значение`. пожалуйста, поподробнее..., @DataFiddler
@jsotola, чтобы перефразировать вопрос: как я могу позволить светодиоду мигать пять раз? В свою защиту я добавил фрагмент кода, чтобы показать, что я пробовал., @Niles
@DataFiddler, я знаю, что задержка не рекомендуется, лучше использовать millis. Это был просто пример того, что я уже пробовал. Чтобы уточнить, программа предназначена для какой-то автомойки. Программа ожидает получения некоторых монет / Токенов / eMoney, которые хранятся в bankValue. Когда банка заполнена, пользователь может выбрать различные программы стирки. Реле активируются в соответствии с программой. Значение банка будет уменьшаться при использовании программы стирки, пока не станет равным нулю. Все реле отключатся. На этом этапе я хочу, чтобы мигающий светодиод сигнализировал о том, что банк пуст. Стирка закончена, и теперь ждем ввода новых денег, @Niles
@Niles код, как вы его представили, мигает 5 раз, но он выполняется повторно, потому что
loop ()' повторяется десятки тысяч раз в секунду (если, конечно, нет задержек) .... чтобы запустить код только один раз, используйте флаг, такой как
setup () {bool xyz = true;}... затем вы проверяете состояние флага
loop () { if (xyz) { мигать светодиодами; делать другие вещи; xyz = false; } }... это будет выполняться только один раз, если только в
loop ()` нет какого-либо кода, который снова устанавливает флаг, @jsotola