首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino LED闪烁问题

Arduino LED闪烁问题
EN

Stack Overflow用户
提问于 2017-05-19 06:03:42
回答 2查看 642关注 0票数 1

所以我有一个蓝牙模块,我已经为它创建了一些代码,所以当我按下按钮1,它打开了led,当我按2,它关闭了led,3应该使led不断闪烁。一切都工作得很好,除了当我推动3 led闪烁一次,然后停止。我能对代码做什么,使它一直闪烁,直到我再次按下按钮1或2?

代码语言:javascript
复制
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);
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-19 06:25:22

您需要将主循环更改为:

代码语言:javascript
复制
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不包含任何数据。

票数 6
EN

Stack Overflow用户

发布于 2017-05-19 21:10:08

将闪烁的代码放入if (Serial.available()> 0)块中,这意味着只有在发送'3'时才能运行。你需要继续发送'3'来保持发光二极管闪烁。

Sergey给了您一个可行的解决方案,但是该代码不必要地一直打开或关闭LED,而且由于使用了delay,当LED闪烁时,代码没有响应性。

要解决这些问题,您需要使用一个变量来保持状态(在Sergey的代码中,该角色接受了现有的LED变量),并使用millis()而不是delay()闪烁,就像在BlinkWithoutDelay内置的Arduino IDE示例中一样。

代码语言:javascript
复制
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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44062513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档