📜  延迟millis arduino - C++ (1)

📅  最后修改于: 2023-12-03 15:39:28.970000             🧑  作者: Mango

延迟(millis) - Arduino

延迟函数是在控制Arduino板上的任务执行时非常常见的一种方法。Arduino的核心库库中包含了两个常用的延迟函数:delay()millis()

  • delay()函数是一种使Arduino停止执行程序一段时间的简单方法。
  • millis()函数用来获取当前时间。它的精度取决于Arduino的系统时钟,通常为1毫秒。

在本篇文章中,我们将会了解:

  1. 如何使用millis()函数。
  2. 如何在程序执行时,使用延迟函数,而不会阻止其他任务的执行。
延迟执行

millis()函数的作用是获取自Arduino板电源起始时间以来的毫秒数。我们可以使用millis()函数实现非阻塞延迟,即哪个任务需要延迟,就哪个任务被延迟,不会阻塞其他任务。

下面是一个示例程序,其中使用了millis()函数来非阻塞延迟。在这个程序中,当按下按钮时,LED会闪烁三次,每次亮1秒,并且每次闪烁之间间隔1秒。

const int BUTTON_PIN = 2;  //Button connected to digital pin 2
const int LED_PIN = 13;    //LED connected to digital pin 13

bool buttonPressed = false;
unsigned long lastButtonPress = 0;
int ledState = LOW;
unsigned long lastLedUpdate = 0;
const int BLINK_DELAY = 1000;   //How long to keep the LED on/off
const int PAUSE_DELAY = 1000;   //How long to wait between blinks

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP); //set button as input
  pinMode(LED_PIN, OUTPUT); //set LED as output
}

void loop() {
  //check if button is pressed
  if (digitalRead(BUTTON_PIN) == LOW && !buttonPressed) {
    buttonPressed = true;
    lastButtonPress = millis();
  } else if (digitalRead(BUTTON_PIN) == HIGH && buttonPressed) {
    buttonPressed = false;
    int blinkCount = 0;

    //do blink sequence 3 times
    while (blinkCount < 3){
      //Turn LED on
      if (millis() - lastLedUpdate >= BLINK_DELAY) {
        ledState = !ledState;
        digitalWrite(LED_PIN, ledState);
        lastLedUpdate = millis();
      }

      //delay for how long LED is on
      if (ledState == HIGH && millis() - lastLedUpdate >= BLINK_DELAY) {
        ledState = !ledState;
        digitalWrite(LED_PIN, ledState);
        lastLedUpdate = millis();
        blinkCount++;
        if (blinkCount < 3) {
          delay(PAUSE_DELAY);
        }
      }
    }
  }
}

在上述示例程序中,我们通过使用millis()函数来实现:

  • 在按下按钮时,记录当前时间。
  • 如果LED已亮1秒钟,则切换LED的状态。
  • 当LED变为灭的状态后,将LED的状态切回亮的状态,并增加闪烁次数的计数器。
  • 在每一次闪烁之间都等待1秒。(除了最后一次闪烁)

这个程序会不断检查当前时间是否超过与上次更新LED状态的时间相差1000毫秒,如果是则更新LED状态,否则不做任何事情。

总结

在本教程中,我们了解了一种使用millis()函数和非阻塞延迟的方法。这种方法可以在程序执行的同时使用延迟,不会阻塞其他任务。如果想要实现更高级的任务定时器,可以使用第三方库,例如TimerOneSimpleTimer