【问题标题】:Fade in multiple LEDs with Arduino使用 Arduino 淡入多个 LED
【发布时间】:2010-10-15 03:18:06
【问题描述】:

我需要弄清楚如何使用 Arduino 在一个函数中淡入和淡出多个 LED。不能使用 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();
  }

}

【问题讨论】:

    标签: function delay arduino


    【解决方案1】:

    唯一明显的事情是,您有一个状态标志,用于说明增加值的方式,但您并没有在第一次 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 左右的毫秒数来更新它们的状态。所以你会有一些延迟,但一切都有机会更新。

    【讨论】:

      【解决方案2】:

      如果您想用硬件解决问题,可以将 LED 连接到外部控制器芯片,例如 TI TLC5940。这些使您可以对每个 LED 的亮度级别进行编程,并与 Arduino 中的 ATMega CPU 分开处理 LED 的 PWM 输出。当您想要改变亮度级别时,您只需要重新编程 TLC 芯片。 Google Code 上有一个不错的 TLC library available to handle communication with the chip

      【讨论】:

        【解决方案3】:

        推测,但这似乎是错误的:

        if(value=260)
        

        (reminding me of the worlds last mistake in C)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-17
          • 1970-01-01
          • 1970-01-01
          • 2013-07-20
          相关资源
          最近更新 更多