如何在Arduino循环中调整interval_led1毫秒值实现LED灯效变化
解决Arduino循环中动态修改LED间隔时间的问题
首先,你遇到的核心问题是只执行了加法运算但没有把结果赋值回变量。你写的interval_led1 + int(3000);只是计算出了一个临时值,并没有改变interval_led1本身的存储内容。正确的写法应该使用赋值运算符,把计算结果重新赋给变量:
interval_led1 += 300; // 等价于 interval_led1 = interval_led1 + 300;
不过要注意,如果你每次LED闪烁都增加间隔,最终会导致间隔越来越大,你可以根据需求添加限制逻辑(比如加到某个阈值后重置)。
另外,你的代码里还有几个可以优化的细节,比如按钮的边缘检测逻辑存在问题,重复代码也可以简化,下面是修改后的完整可运行代码:
const int led1 = 13; const int led2 = 8; const int led3 = 5; const int button = 10; int ledState_led1 = LOW; int ledState_led2 = LOW; int ledState_led3 = LOW; unsigned long previousMillis_led1 = 0; unsigned long previousMillis_led2 = 0; unsigned long previousMillis_led3 = 0; long interval_led1 = 500; long interval_led2 = 600; long interval_led3 = 700; boolean buttonstate = false; bool prev_buttonstate = false; // 移到loop外部,保存上一次按钮状态 void setup() { pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(button, INPUT); } void loop() { unsigned long currentMillis = millis(); // 只需一个变量存储当前时间 bool current_state = digitalRead(button); // 修复按钮边缘检测:只有当按钮状态从LOW变HIGH时才切换 if(current_state == HIGH && current_state != prev_buttonstate) { buttonstate = !buttonstate; } prev_buttonstate = current_state; if(buttonstate == true) { // LED1逻辑,包含动态修改间隔 if (currentMillis - previousMillis_led1 >= interval_led1) { previousMillis_led1 = currentMillis; ledState_led1 = !ledState_led1; // 简化状态切换 digitalWrite(led1, ledState_led1); // 每次闪烁后增加300毫秒间隔 interval_led1 += 300; // 可选:防止间隔过大,超过3000毫秒就重置回初始值 // if(interval_led1 > 3000) interval_led1 = 500; } // LED2逻辑 if (currentMillis - previousMillis_led2 >= interval_led2) { previousMillis_led2 = currentMillis; ledState_led2 = !ledState_led2; digitalWrite(led2, ledState_led2); } // LED3逻辑 if (currentMillis - previousMillis_led3 >= interval_led3) { previousMillis_led3 = currentMillis; ledState_led3 = !ledState_led3; digitalWrite(led3, ledState_led3); } } }
关键修改点说明:
- 修复间隔更新问题:用
interval_led1 += 300;替代单纯的加法运算,确保变量被实际修改。 - 修复按钮检测逻辑:将
prev_buttonstate移到loop函数外部,这样才能正确检测按钮的按下边缘(之前每次循环都会重置为false,导致无法触发状态切换)。 - 简化代码结构:合并重复的
if(buttonstate==true)条件块,减少冗余;用ledState = !ledState简化LED状态切换;只使用一个currentMillis变量,因为millis()返回的是当前时间,所有LED都可以共用。 - 可选的间隔限制:如果不想让间隔无限增大,可以添加判断逻辑,当超过阈值时重置回初始值。
内容的提问来源于stack exchange,提问作者Grasmat
相关产品推荐
相关产品推荐

