Исчезать в несколько светодиодов с Arduino - PullRequest
4 голосов
/ 24 марта 2009

Мне нужно выяснить, как постепенно увеличивать и уменьшать свет из нескольких светодиодов в Arduino. Невозможно использовать delay (), потому что другие вещи должны работать, пока свет исчезает. Это то, что у него есть, но оно не работает.

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();
  }

}

Ответы [ 3 ]

6 голосов
/ 27 марта 2009

Единственная очевидная вещь - это то, что у вас есть флаг состояния, для которого нужно увеличивать значение, но вы не проверяете его в своем первом 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 миллисекунд, для которых необходимо обновить их состояние. Таким образом, вы получаете некоторую задержку, но у всего есть шанс обновить.

1 голос
/ 13 октября 2009

Предположим, но это кажется неправильным:

if(value=260)

( напоминает мне о последней ошибке в мире в C )

0 голосов
/ 08 апреля 2009

Если вы хотите бросить аппаратное обеспечение в проблему, вы можете подключить свои светодиоды к внешнему контроллеру, например, TI TLC5940. Они позволяют программировать уровень яркости для каждого светодиода и обрабатывать выход ШИМ на светодиодах отдельно от процессора ATMega в Arduino. Вам нужно перепрограммировать микросхему TLC только тогда, когда вы хотите изменить уровень яркости. В Google Code есть замечательная библиотека TLC для связи с чипом .

...