Затухание нескольких светодиодов с помощью Arduino
Вопрос
Мне нужно выяснить, как постепенно включать и выключать несколько светодиодов в функции с помощью Arduino.Невозможно использовать задержку(), потому что другие вещи должны работать, пока свет гаснет.Это то, что есть до сих пор, но не работает.
int value = 0; // variable to keep the actual value
int ledpin = 9; // light connected to digital pin 9
int p1 = 0;
void setup()
{
// nothing for setup
Serial.begin(9600);
}
void loop()
{
inout(50, 30, 9, 0, 0);
//inout(20, 20, 10);
}
void inout(int inDelay, int outDelay, int ledpin, long previousmil, int done)
{
if(millis() - previousmil>inDelay){
if (value <=255){
analogWrite(ledpin, value); // sets the value (range from 0 to 255)
value+=5;
}
previousmil=millis();
}
if(value = 260)
done = 1;
if(millis() - previousmil>outDelay && done == 1){
if (value >0){
analogWrite(ledpin, value); // sets the value (range from 0 to 255)
value-=5;
}
previousmil=millis();
}
}
Решение
Единственное, что очевидно, это то, что у вас есть флаг состояния, определяющий способ увеличения значения, но вы не тестируете его в первом if.Было бы лучше структурировать ваш код немного лучше.Вы также можете отслеживать более одного значения, если у вас более одного контакта, если только они все не должны исчезать и появляться одновременно.В этом случае вам лучше всего использовать массив struct
s с параметрами для каждой сосны.
Один из способов использования задержки для нескольких задач — заставить каждую задачу работать за время, прошедшее с момента последнего цикла, и настроить задержку в конце цикла в соответствии со временем, которое занимают задачи.Если ваш цикл выглядит примерно так:
static unsigned long last_time = 0; // set to millis() in setup
static unsigned long refresh_period = 20; // 50Hz
void loop()
{
unsigned long time = millis();
unsigned long delta = time - last_time;
doTask1( delta );
doTask2( delta );
doTask3( delta );
doTask4( delta );
// as tasks may have taken some millis, adjust delay
unsigned long post_time = millis();
if ( post_time - last_time < refresh_period )
delay( refresh_period - ( post_time - last_time ) );
last_time = time;
}
Затем каждая задача будет запускаться примерно раз в 20 мс и будет передаваться примерно 20 миллисекунд, в течение которых необходимо обновить свое состояние.Таким образом, вы получаете некоторую задержку, но все имеет возможность обновиться.
Другие советы
Предполагаю, но это кажется неправильным:
if(value=260)
Если вы хотите решить проблему аппаратно, вы можете подключить светодиоды к внешнему чипу контроллера, например TI TLC5940.Они позволяют программировать уровень яркости для каждого светодиода и обрабатывать выход ШИМ на светодиоды отдельно от процессора ATMega в Arduino.Перепрограммировать чип TLC нужно только тогда, когда вы хотите изменить уровень яркости.Есть хороший Доступна библиотека TLC для управления связью с чипом. в Google Code.