Arduino LED 闪烁问题
Arduino LED blinking issue
所以我有一个蓝牙模块,我已经为它创建了一些代码,所以当我按下按钮 1 时,它会打开 LED,当我按下 2 时,它会关闭 LED,而 3 应该使led 不断闪烁。一切都很好,除了当我按 3 时,led 闪烁一次然后停止。我可以对代码做些什么,让它不断闪烁,直到我再次按下按钮 1 或 2?
char LED = 0;
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600); // Opens Serial port
}
void loop() {
if (Serial.available()> 0){
LED = Serial.read();
Serial.print(LED);
if (LED == '1')
digitalWrite(13, HIGH);
if (LED == '0')
digitalWrite(13, LOW);
if (LED == '3') {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
}
}
您需要将主循环更改为:
void loop() {
if (Serial.available()> 0){
LED = Serial.read();
Serial.print(LED);
}
if (LED == '3') {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
else if (LED == '1')
digitalWrite(13, HIGH);
else if (LED == '0')
digitalWrite(13, LOW);
}
在这种情况下,即使 Serial
不包含任何数据,LED == '3'
也会在每次循环迭代中起作用
你把闪烁的代码放到了if (Serial.available()> 0)
块中,这意味着当你发送一个'3'
时它只是运行。您需要继续发送 '3'
以保持 LED 闪烁。
Sergey 为您提供了一个可行的解决方案,但该代码不必要地一直将 LED 设置为打开或关闭,并且由于使用了 delay
.
,该代码在 LED 闪烁时无响应
要解决这些问题,您需要使用变量来保持状态(在 Sergey 的代码中,该角色占用了您现有的 LED
变量)并使用 millis()
而不是 delay()
闪烁,就像在 BlinkWithoutDelay 内置 Arduino IDE 示例中一样。
char LED = 0;
enum {
NONE,
BLINKING,
} state = NONE;
void setup() {
pinMode(BUILTIN_LED, OUTPUT);
Serial.begin(9600); // Opens Serial port
}
void loop() {
if (Serial.available() > 0){
LED = Serial.read();
Serial.print(LED);
switch (LED) {
case '1':
state = NONE;
digitalWrite(BUILTIN_LED, HIGH);
break;
case '2':
state = NONE;
digitalWrite(BUILTIN_LED, LOW);
break;
case '3':
state = BLINKING;
break;
}
}
switch (state) {
case NONE: break;
case BLINKING:
static unsigned long last_blink = 0;
if (millis() - last_blink > 1000)
{
digitalWrite(BUILTIN_LED, !digitalRead(BUILTIN_LED));
last_blink = millis();
}
break;
}
}
所以我有一个蓝牙模块,我已经为它创建了一些代码,所以当我按下按钮 1 时,它会打开 LED,当我按下 2 时,它会关闭 LED,而 3 应该使led 不断闪烁。一切都很好,除了当我按 3 时,led 闪烁一次然后停止。我可以对代码做些什么,让它不断闪烁,直到我再次按下按钮 1 或 2?
char LED = 0;
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600); // Opens Serial port
}
void loop() {
if (Serial.available()> 0){
LED = Serial.read();
Serial.print(LED);
if (LED == '1')
digitalWrite(13, HIGH);
if (LED == '0')
digitalWrite(13, LOW);
if (LED == '3') {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
}
}
您需要将主循环更改为:
void loop() {
if (Serial.available()> 0){
LED = Serial.read();
Serial.print(LED);
}
if (LED == '3') {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
else if (LED == '1')
digitalWrite(13, HIGH);
else if (LED == '0')
digitalWrite(13, LOW);
}
在这种情况下,即使 Serial
不包含任何数据,LED == '3'
也会在每次循环迭代中起作用
你把闪烁的代码放到了if (Serial.available()> 0)
块中,这意味着当你发送一个'3'
时它只是运行。您需要继续发送 '3'
以保持 LED 闪烁。
Sergey 为您提供了一个可行的解决方案,但该代码不必要地一直将 LED 设置为打开或关闭,并且由于使用了 delay
.
要解决这些问题,您需要使用变量来保持状态(在 Sergey 的代码中,该角色占用了您现有的 LED
变量)并使用 millis()
而不是 delay()
闪烁,就像在 BlinkWithoutDelay 内置 Arduino IDE 示例中一样。
char LED = 0;
enum {
NONE,
BLINKING,
} state = NONE;
void setup() {
pinMode(BUILTIN_LED, OUTPUT);
Serial.begin(9600); // Opens Serial port
}
void loop() {
if (Serial.available() > 0){
LED = Serial.read();
Serial.print(LED);
switch (LED) {
case '1':
state = NONE;
digitalWrite(BUILTIN_LED, HIGH);
break;
case '2':
state = NONE;
digitalWrite(BUILTIN_LED, LOW);
break;
case '3':
state = BLINKING;
break;
}
}
switch (state) {
case NONE: break;
case BLINKING:
static unsigned long last_blink = 0;
if (millis() - last_blink > 1000)
{
digitalWrite(BUILTIN_LED, !digitalRead(BUILTIN_LED));
last_blink = millis();
}
break;
}
}