2013-06-28 2 views
0

Итак, я только недавно погрузился в программирование Arduino. В настоящее время у меня есть базовая функция blink вместе со светодиодной программой RGB, которая меняет светодиод на синий, зеленый и красный цвета. У меня есть 2 светодиода простой и простой желтый светодиод, который должен функционировать как индикатор для «рабочего состояния». И светодиод, который является RGB. Теперь я хочу, чтобы RGB проходил через его цвета, хотя я хочу, чтобы желтый светодиод постоянно мигал. Как я могу сделать свой код так, чтобы два процесса могли работать одновременно?C++ Arduino, одновременно запуская две петли?

ответ

2

Что-то вроде:

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 секунды ...)

+0

Выглядит хорошо. Единственное, что я добавил бы, это то, что вы не ограничены использованием одного счетчика, если ваши тайминги не связаны друг с другом - вы можете управлять несколькими счетами независимо. Вам также не нужно делать modulo, если вы моргаете на 50 и сбрасываете до нуля при 100, когда вы моргаете. – paddy

+0

Если бы у меня были независимые часы, я бы сделал статику в каждой функции (и объединил do_blink_on/off в один). Я действительно счел это ответом, но я подумал, что, вероятно, будет слишком продвинутым для тех, кто должен задать вышеупомянутый вопрос. –

1

Ответ AMADANON будет работать, однако имейте в виду, что предпочтительный способ выполнения нескольких задач, подобных этому, заключается в прерываниях таймера. Например, если вы хотите, чтобы ваш код делал что-то еще после его затухания, синхронизация этих других функций будет мешать вашему светодиоду мигать. Чтобы решить эту проблему, вы используете таймеры, встроенные в Arduino.

В фоновом режиме таймер подсчитывает, и когда он достигает определенного значения, он сбрасывает свой счетчик и запускает процедуру обслуживания прерываний, в которой вы включаете/выключаете светодиод.

Вот учебник на мигающий светодиод с таймером прерывания: http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/