Arduino的millis()函数如何解决溢出问题

在Arduino中实现延时功能常用delay(time),但是delay函数会阻塞当前程序,直到延时时间到达,这样可能会导致一些网络通信库和按钮事件无法相应。相应的,Arduino中有另外的实现延时功能的方法,如下:

...... //省略
unsigned long lastMillis = 0;
......//省略
if ( millis() - lastMillis > 60000 ) //这里是60000毫秒,对应60秒
    {
        lastMillis = millis();
        client.publish( "/hello", "world" );
    }

millis()函数用于返回Arduino板开始运行当前程序时的毫秒数。这个数字在大约50天后溢出,即回到零。

上面简单的实现了一个延时60 Second的程序,这个程序就是反复把当前值赋予给lastMillis,看到这肯定有同学会问,unsigned long如果溢出怎么办,溢出后会不会影响程序逻辑。下面简单分析一下。

millis溢出后会回归到0,此时lastMillis处于溢出前的一个很大值状态(即将溢出),这样就成了0减去一个整数,但是由于lastMillisunsigned long,结果就成了lastMillis - 0,也就是一个很大的值,所以,逻辑不会改变,只不过在即将溢出的时候这里会导致时间稍微提前一些。

如果你的程序中没有严格要求的时间间隔,这里提前就提前了吧,不用管,如果有严格时间间隔要求怎么办呢?看下面的解决方案吧。
millils溢出问题

参考:

  • millis()指令溢出的时候怎么处理? - chenlife - 博客园

你可能感兴趣的:(Arduino的millis()函数如何解决溢出问题)