宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

一、millis()函数的原理

在使用Arduino进行开发时,我们经常会使用到millis()函数。这个函数的作用是返回程序运行时间(以毫秒为单位)。这个函数的实现原理是基于计算机系统中的定时器中断。

当你调用millis()函数时,它会返回自外部中断0引脚上次触发的时间(以毫秒为单位)。如果你记录了当前时刻,你可以将两个时刻的差值转换成你需要的时间单位,以实现时间测量、定时和延时等操作。

每个定时器中断的时间间隔为1毫秒(或4毫秒),也就是说,如果你运行了一段时间,你可能会在外部中断0引脚上看到一条稳定的PWM波形。

    unsigned long lastTime = 0;
    unsigned long currentTime = millis();
    unsigned long timeInterval = currentTime - lastTime; // 计算时间间隔
    lastTime = currentTime; // 更新上一次时间戳

二、millis()函数的优势

在嵌入式系统中,对于延时和时间间隔的测量是非常基础、常用也容易出错的操作。在以前,我们通常会使用delay函数或者外部计时器的计数器进行测量。

但是,这两种方法都不能很好地适应多任务和异步操作的需求。使用delay函数会阻塞整个系统,而使用计数器会强制你手动调用计数器和计时器中断的计数。在复杂的系统中,这些操作会占用大量的CPU时间,导致系统响应缓慢甚至崩溃。

与这些方法相比,使用millis()函数具有一些优势:

  • millis()函数不会阻塞整个系统,因为它只是返回计时器中断的时间戳。
  • millis()函数非常准确,因为它使用系统硬件定时器。
  • millis()函数非常容易使用,因为它只需要一个简单的函数调用。

三、millis()函数的应用

在使用millis()函数进行时间测量和延时时,你需要知道当前时间戳和上一次时间戳之间的差值。通常情况下,你需要定义一个全局变量来存储上一次时间戳。

在Arduino中,我们可以使用millis()来实现很多应用。比如:

  • 时间控制,定时器、计数器和闹钟系统的实现。
  • 按键消抖(当按键按下时,等待一段时间以消抖,以确定按键是否真正按下)。
  • 物品测距,当超声波发生器和接收器之间没有障碍物时,通过测量信号发出和返回的时间来计算距离。
  • 太阳能利用,使用光敏传感器来测量光线强度,并根据测量结果来调整太阳能板的朝向。

四、代码示例

下面是一个使用millis()函数实现闪烁LED的简单代码示例:

    void setup() {
      pinMode(LED_BUILTIN, OUTPUT);
    }
    
    void loop() {
      unsigned long currentTime = millis();
      static unsigned long lastTime = 0;
      unsigned long interval = 1000; // 闪烁间隔
      if (currentTime - lastTime >= interval) {
        lastTime = currentTime;
        digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // 翻转LED状态
      }
    }

这个程序会使内置LED在1秒钟内翻转一次。在每次循环中,它会检查当前时间戳和上一次时间戳之间的时间间隔。如果时间间隔超过了闪烁间隔,就会翻转LED状态。

五、总结

通过这篇文章的阐述,我们更深入的理解了Arduino中的millis()函数。我们了解了它的优点和原理,并了解了它的一些应用场景。在实际的应用中,我们可以根据具体的需求来使用这个函数,从而达到更高效的开发结果。