常用时间函数:
unsigned long micros(); //返回当前系统时间(us)
unsigned long millis(); //返回当前系统时间(ms)
void delay(uint32_t); //设置延时(ms)
void delayMicroseconds(uint32_t us); //设置延时(us)
返回当前系统时间即系统当前已运行时间
测试:
一种运用思路:
//该程序用于每一秒或以上时间打印输出一次时间
unsigned long previousMillis = 0; //毫秒时间记录
const long interval = 1000; //时间间隔
void setup()
{
Serial.begin(115200);
Serial.println();
}
void loop()
{
unsigned long currentMillis = millis(); //读取当前时间
if (currentMillis - previousMillis >= interval) //如果和前次时间大于等于时间间隔
{
previousMillis = currentMillis; //更新时间记录
Serial.println(millis()); //打印当前时间
}
}
定时任务调度器Ticker:
相较于上述延时方法,ticker能定时循环运行预定程序,且延时更加精准
需要引用头文件#include <Ticker.h>
并创建Ticker对象
void attach(float seconds, callback_t callback) void attach(float
seconds, void (*callback)(TArg), TArg arg)
设置调度任务,该任务会反复执行,输入参数分别为时间间隔(秒)、回调函数、不大于四字节的数据; void attach_ms(uint32_t
milliseconds, callback_t callback) void attach_ms(uint32_t
milliseconds, void (*callback)(TArg), TArg arg)
设置调度任务,该任务会反复执行,输入参数分别为时间间隔(毫秒)、回调函数、不大于四字节的数据; void once(float
seconds, callback_t callback) void once(float seconds, void
(*callback)(TArg), TArg arg)
设置调度任务,该任务只执行一次,输入参数分别为时间间隔(秒)、回调函数、不大于四字节的数据; void once_ms(uint32_t
milliseconds, callback_t callback) void once_ms(uint32_t milliseconds,
void (*callback)(TArg), TArg arg)
设置调度任务,该任务只执行一次,输入参数分别为时间间隔(毫秒)、回调函数、不大于四字节的数据; void detach() 停止任务调度;
原文链接:https://blog.csdn.net/Naisu_kun/article/details/86764221
例程:
#include <Ticker.h> //调用Ticker.h库
Ticker ticker1; //声明Ticker对象
Ticker ticker2; //声明Ticker对象
void callback1() //回调函数1
{
Serial.print(millis());
Serial.println(" 回调函数1已启用");
}
void callback2() //回调函数2
{
Serial.print(millis());
Serial.println(" 回调函数2已启用");
}
void setup()
{
Serial.begin(115200);
Serial.println();
ticker1.attach(0.5, callback1); //每0.5秒调用callback1
ticker2.once_ms(2000, callback2); //2000毫秒后调用一次callback2
}
void loop()
{
}
匿名回调函数,传递参数
#include <Ticker.h> //调用Ticker.h库
Ticker ticker1; //声明Ticker对象
Ticker ticker2; //声明Ticker对象
void callback2(int data) //回调函数
{
Serial.print(millis());
Serial.print(" 回调函数2:");
Serial.println(data);
}
void setup()
{
Serial.begin(115200);
Serial.println();
ticker1.attach_ms(500, [](){Serial.printf("%d: callback1 triggered!\r\n", millis());}); //匿名函数方式
ticker2.once(2, callback2, 2333333); //2秒后调用一次callback2
}
void loop()
{
}
ticker停止与重置
#include <Ticker.h> //调用Ticker.h库
Ticker ticker1; //声明Ticker对象
Ticker ticker2; //声明Ticker对象
Ticker ticker3; //声明Ticker对象
void callback1() //回调函数
{
Serial.print(millis());
Serial.println(": callback1 triggered!");
}
void callback2() //回调函数
{
Serial.print(millis());
Serial.println(": callback2 triggered!");
ticker1.detach(); //停止ticker1
}
void callback3() //回调函数
{
Serial.print(millis());
Serial.println(": callback3 triggered!");
ticker1.attach(0.5, callback1); //重新设置ticker1
}
void setup()
{
Serial.begin(115200);
Serial.println();
ticker1.attach(0.5, callback1);
ticker2.once(2, callback2);
ticker3.once(4, callback3);
}
void loop()
{
}
注:
ticker1里面调用ticker2,编译不会报错,但ticker2不会运行
以下,测试代码:
void callback1() //回调函数1
{
Serial.print(millis());
Serial.println(" 回调函数1");
ticker2.once(2, callback2);
}
void callback2() //回调函数2
{
Serial.print(millis());
Serial.println(" 回调函数2");
ticker1.detach(); //停止ticker1
Serial.println("回调函数1已停止");
ticker3.once(4, callback3);
}
void callback3() //回调函数3
{
Serial.print(millis());
Serial.println(" 回调函数3");
ticker1.attach(0.5, callback1); //重新设置ticker1
Serial.println("回调函数1已启用");
}
void setup()
{
Serial.begin(115200);
Serial.println();
ticker1.attach(0.5, callback1);
}
该问题留待解决,欢迎评论区留言