首页 文章

Arduino LED闪烁问题

提问于
浏览
1

所以我有一个蓝牙模块,我已经创建了一些代码,所以当我按下按钮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);
        }
    }
}

2 回答

  • 6

    您需要将主循环更改为:

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

    在这种情况下 LED == '3' 将在每次循环迭代时起作用,即使 Serial 不包含任何数据

  • 0

    您将闪烁的代码放入 if (Serial.available()> 0) 块,这意味着它仅在您发送 '3' 时运行 . 您需要继续发送 '3' 以保持LED闪烁 .

    谢尔盖为您提供了一个可行的解决方案,但该代码不必要地保持LED的开启或关闭,并且由于使用了 delay ,因此LED闪烁时代码无响应 .

    要修复这些问题,你需要使用一个变量来保持一个状态(在Sergey的代码中,该角色占用你现有的 LED 变量)并使用 millis() 而不是 delay() 进行闪烁,就像内置的Arduino IDE中的BlinkWithoutDelay一样 .

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

相关问题