c++ - 用毫秒替换延迟

标签 c++ arduino

我只需要使 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/

相关文章:

c++ - 理解 C++ 函数指针在 HIP 中通过引用传递

c++ - C 关于选角的问题

c - 制作arduino备用功能

c++ - 使编译在模板类的特定实例化时失败

c++ - 获取数组中最小的列表数

arduino - 如何以不同的速率更新传感器值

c - 我怎样才能有执行两项任务的条件语句?第一个然后循环中的另一个

c - 使用 UART 时 BREAK 的实际含义是什么?

arduino - 使用 arduino 模拟输入

C++类——数组中出现频率最高的对象