Затухание нескольких светодиодов с помощью Arduino

StackOverflow https://stackoverflow.com/questions/676133

  •  21-08-2019
  •  | 
  •  

Вопрос

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

Один из способов использования задержки для нескольких задач — заставить каждую задачу работать за время, прошедшее с момента последнего цикла, и настроить задержку в конце цикла в соответствии со временем, которое занимают задачи.Если ваш цикл выглядит примерно так:

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)

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top