在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减去一个整数,但是由于lastMillis
是unsigned long
,结果就成了lastMillis - 0
,也就是一个很大的值,所以,逻辑不会改变,只不过在即将溢出的时候这里会导致时间稍微提前一些。
如果你的程序中没有严格要求的时间间隔,这里提前就提前了吧,不用管,如果有严格时间间隔要求怎么办呢?看下面的解决方案吧。
millils溢出问题
参考: