我需要弄清楚如何在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毫秒左右的时间通过更新其状态的毫秒数.所以你得到一些延迟,但一切都有机会更新.
唯一显而易见的事情是你有一个状态标志,用于增加值的方式,但是你没有在第一个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毫秒左右的时间通过更新其状态的毫秒数.所以你得到一些延迟,但一切都有机会更新.