在Arduino编程中,delay()函数用于在程序执行期间暂停执行一段时间。它可以将Arduino的执行暂停指定的毫秒数。如果我们需要在程序中实现多任务处理,delay()函数并不是一个好的选择。因为在使用delay()函数时,Arduino不会处理任何输入和输出,因此会导致无法及时响应其他事件。
millis()函数是一个内置的Arduino函数,它返回从程序启动到当前时间的毫秒数。与delay()函数相比,millis()函数可以实现更精确的延时控制。通过记录开始时间和延时时间,可以在延时期间执行其他代码,并使用millis()函数检查是否到达预定的延时时间。我们可以使用millis()函数实现类似delay()函数的延时效果,而不会阻塞程序的执行。
下面我们自定义一个函数,这里命名为 time_delay
unsigned long time_delay(unsigned long time_cont) {
unsigned long time_now = millis(); //记录当前时间
unsigned long time_target = time_now + time_cont; //定义目标时间
while (1)
{
time_now = millis(); //更新当前时间
/*
这里放入你要在延时中同时要进行的程序
*/
if (time_now >= time_target) //如果到达目标时间
break; //跳出循环
}
return 0;
}
time_cont :需要输入的变量,即为需要暂停的毫秒数。
time_now :被millis()函数赋值的变量,即为当前时刻的毫秒数。
time_target :当前时刻+要暂停的时间,即为暂停后的未来时刻。
将上面的代码放进arduino的程序中,我们就可以开始快乐的使用它了,使用方法跟delay()函数一模一样。下面举个例子,实现灯光的闪烁。
void setup() {
pinMode(13,1); //定义输出引脚(arudino uno/nano)
}
void loop() {
digitalWrite(13,1); //输出高电平
time_delay(1000); //延时
digitalWrite(13,0); //输出低电平
time_delay(1000); //延时
}
unsigned long time_delay(unsigned long time_cont) {
unsigned long time_now = millis(); //记录当前时间
unsigned long time_target = time_now + time_cont; //定义目标时间
while (1)
{
time_now = millis(); //更新当前时间
/*
这里放入你要在延时中同时要进行的程序
*/
if (time_now >= time_target) //如果到达目标时间
break; //跳出循环
}
return 0;
}
那么我们已经实现了使用millis()函数来代替delay()函数,如果我们需要更加精确的延时,也可以使用相同的思路,使用 micros() 函数实现相同的功能。micros()函数可以返回自 Arduino 开始运行以来的微秒数。它的精度是微秒级别,每微秒增加1。我们将上面程序中的millis()函数替换成micros()函数,可以实现微秒级的延时。
unsigned long time_delay(unsigned long time_cont) {
unsigned long time_now = micros(); //记录当前时间
unsigned long time_target = time_now + time_cont; //定义目标时间
while (1)
{
time_now = micros(); //更新当前时间
/*
这里放入你要在延时中同时要进行的程序
*/
if (time_now >= time_target) //如果到达目标时间
break; //跳出循环
}
return 0;
}
第一次写文章,写的不好还请见谅,如果你发现有什么问题,欢迎指正。
如果这篇文章对你有帮助,还请点一个赞支持一下,十分感谢。