Итак, я только недавно погрузился в программирование Arduino. В настоящее время у меня есть базовая функция blink вместе со светодиодной программой RGB, которая меняет светодиод на синий, зеленый и красный цвета. У меня есть 2 светодиода простой и простой желтый светодиод, который должен функционировать как индикатор для «рабочего состояния». И светодиод, который является RGB. Теперь я хочу, чтобы RGB проходил через его цвета, хотя я хочу, чтобы желтый светодиод постоянно мигал. Как я могу сделать свой код так, чтобы два процесса могли работать одновременно?C++ Arduino, одновременно запуская две петли?
ответ
Что-то вроде:
int timekeeper=0;
while (1)
{
do_fade(timekeeper);
if (timekeeper%100==0) {
do_blink_off();
}
if (timekeeper%100==50) {
do_blink_on();
}
delay(10);
timekeeper++;
}
Это сделано из памяти, поэтому пробег может варьироваться. Я прошел хронометрист для do_fade(), так что вы можете понять, насколько далеко вы находитесь вдоль выцветания. do_fade() обновит fade, а затем немедленно вернется. do_blink_on() и do_blink_off() будут похожи - измените то, что вам нужно изменить, а затем вернитесь. В этом примере do_fade() вызывается каждые 10 миллисекунд, do_blink_off() один раз в секунду, с do_blink_on() 1/2 через секунду после (так далее, 1/2 секунды, выкл., 1/2 секунды, вкл., 1/2 секунды ...)
Ответ AMADANON будет работать, однако имейте в виду, что предпочтительный способ выполнения нескольких задач, подобных этому, заключается в прерываниях таймера. Например, если вы хотите, чтобы ваш код делал что-то еще после его затухания, синхронизация этих других функций будет мешать вашему светодиоду мигать. Чтобы решить эту проблему, вы используете таймеры, встроенные в Arduino.
В фоновом режиме таймер подсчитывает, и когда он достигает определенного значения, он сбрасывает свой счетчик и запускает процедуру обслуживания прерываний, в которой вы включаете/выключаете светодиод.
Вот учебник на мигающий светодиод с таймером прерывания: http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/
Выглядит хорошо. Единственное, что я добавил бы, это то, что вы не ограничены использованием одного счетчика, если ваши тайминги не связаны друг с другом - вы можете управлять несколькими счетами независимо. Вам также не нужно делать modulo, если вы моргаете на 50 и сбрасываете до нуля при 100, когда вы моргаете. – paddy
Если бы у меня были независимые часы, я бы сделал статику в каждой функции (и объединил do_blink_on/off в один). Я действительно счел это ответом, но я подумал, что, вероятно, будет слишком продвинутым для тех, кто должен задать вышеупомянутый вопрос. –