下面的代码是一个更大项目的一部分。其目的是闪烁一个发光二极管与一个可变的时间,重置的时间和累计的总“开”的时间。每次经过“开启”时段时,都会更改开启时间。
下面的代码似乎在每个“打开”时间段结束时成功地更改了“打开”时间,但不会累积总时间。
我希望ledtime在第一次通过时等于LED灯亮(例如1000),然后在第二次通过时等于前一次ledtime+LED灯亮(例如1000+2538=3528)。
相反,ledtime总是等于当前LED灯亮,所以每次通过时ledtime似乎总是设置为零,这我不明白。
我是arduino/C编程的新手,我怀疑我遗漏了一些非常简单/明显的东西,但是已经玩了一段时间,没有解决问题(包括将ledtime=etc语句移动到blink例程中的不同区域)。
long ledtime;
const int LED_PIN = 13;
const int grnled = 11;
unsigned long LED_ON = 800; //milliseconds
int LED_OFF = 2000;
int redled = 10;
int yellowled = 12;
unsigned long ms; //time from millis()
unsigned long msLast;
unsigned long mslast2;//last time the LED changed state
boolean ledState; //current LED state
void setup(void)
{
pinMode(grnled, OUTPUT);
pinMode(redled,OUTPUT);
pinMode(yellowled,OUTPUT);
Serial.begin(9600);
}
void loop(void)
{
while(millis()<5000) {
digitalWrite(redled,HIGH);
digitalWrite(yellowled,LOW);
}
while (millis() >(5000) && millis()< 20000){
ms = millis();
blinkLED();
}
if (millis() > 20000 && millis() < 30000) {
digitalWrite(redled,HIGH);
}
if (millis() > 30000) {
digitalWrite(yellowled,HIGH);
digitalWrite(redled, LOW);
}
}
void blinkLED(void)
{
if (ms - msLast > (ledState ? LED_ON : LED_OFF)) {
digitalWrite(grnled, ledState = !ledState);
msLast = ms;
long ledtime = ledtime + LED_ON; //this does not work
Serial.println("ledtime = ");
Serial.println(ledtime);
if (ms-mslast2> LED_ON) {
LED_ON = random(500,5000); //this works
LED_OFF = 2000;
mslast2 = ms;
Serial.println("LED_ON = ");
Serial.println(LED_ON);
}
}
}
最佳答案
我不太清楚你想做什么,但是用你的注释行,你创建了一个局部变量ledtime,它与你的全局变量同名。因为它是函数的局部,所以在函数结束时会被删除。
所以首先在ledtime的声明中初始化ledtime为0,
然后尝试用
ledtime += LED_ON;