当前位置:  开发笔记 > 开发工具 > 正文

使用Arduino淡入多个LED

如何解决《使用Arduino淡入多个LED》经验,为你挑选了1个好方法。

我需要弄清楚如何在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();
  }

}

Pete Kirkham.. 6

唯一显而易见的事情是你有一个状态标志,用于增加值的方式,但是你没有在第一个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;
} 

然后每个任务将每20ms运行一次,并且将以20毫秒左右的时间通过更新其状态的毫秒数.所以你得到一些延迟,但一切都有机会更新.



1> Pete Kirkham..:

唯一显而易见的事情是你有一个状态标志,用于增加值的方式,但是你没有在第一个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;
} 

然后每个任务将每20ms运行一次,并且将以20毫秒左右的时间通过更新其状态的毫秒数.所以你得到一些延迟,但一切都有机会更新.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有