我只需要使 LED 闪烁 100 毫秒,而循环中的延迟函数使我的代码非常无响应。
if (readString.indexOf("?23") >0){
digitalWrite(23, LOW);
delay(100);
digitalWrite(23, HIGH);
}
有没有一种简单的方法可以将 delay
替换为 millis
以仅闪烁一次?这个我试过了,但是不行
unsigned long interval1=1000; // the time we need to wait
unsigned long previousMillis1=0; // millis() returns an unsigned long.
if (readString.indexOf("?22") >0){
if ((unsigned long)(millis() - previousMillis1) >= interval1) {
previousMillis1 = millis();
digitalWrite(22, LOW);
}
digitalWrite(22, HIGH);
你们能帮帮我吗?我想不通。
最佳答案
我假设,当字符串变量 readString
包含定义的文字字符串时,您正在尝试打开 LED 100 毫秒,然后将其关闭。
我认为您的代码中缺少 else
,因为如果没有它,关闭 LED 的 digitalWrite(22, LOW)
将直接跟在 digitalWrite(22, HIGH)
,这将再次打开 LED。通过执行 previousMillis1 = millis()
,您可以让 LED 连续闪烁,而不仅仅是一次。
尝试这样的事情:
unsigned long interval1=100; // the time we need to wait
unsigned long previousMillis1=0; // millis() returns an unsigned long.
boolean led_blinking = false;
void loop(){
if (readString.indexOf("?22") >0 && !led_blinking){
led_blinking = true;
previousMillis1 = millis();
}
if (led_blinking && millis() - previousMillis1 <= interval1) {
digitalWrite(22, HIGH);
} else {
digitalWrite(22, LOW);
led_blinking = false;
readString = ""; /* resetting the string variable to prevent
further blinking, until the variable is set
by another part of the code */
}
// Do other task of the main loop
}
请注意,根据执行其余主循环所需的时间,此处的时间并不准确。但是,如果您只想看到您的状况的视觉标志,这就足够了。 如果你不想重置字符串变量,你可以使用另一个 bool 变量,你可以在设置字符串变量时设置它。但不要忘记重置它而不是字符串变量。
关于c++ - 用毫秒替换延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43832180/