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;
    }
}