所以我有一个蓝牙模块,我已经为它创建了一些代码,所以当我按下按钮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);
}
}
}发布于 2017-05-19 06:25:22
您需要将主循环更改为:
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不包含任何数据。
发布于 2017-05-19 21:10:08
将闪烁的代码放入if (Serial.available()> 0)块中,这意味着只有在发送'3'时才能运行。你需要继续发送'3'来保持发光二极管闪烁。
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;
}
}https://stackoverflow.com/questions/44062513
复制相似问题