精确到毫秒的时间类型_ESP32 Arduino:系统时间和定时任务调度器Ticker

开发中经常会用到时间相关操作,主要就是用到系统时间、延时操作、定时任务调度等,本文介绍Arduino core for the ESP32中相关的一些功能。

系统时间及应用

系统时间相关方法如下:

unsigned long micros(); //返回微秒为单位系统时间unsigned long millis(); //返回毫秒为单位系统时间void delay(uint32_t); //设置毫秒级延时void delayMicroseconds(uint32_t us); //设置微秒级延时
63f3ce1c5f4cd0fa51f2fbb30cddc848.gif

上图中微秒时间差稍大于1000us,因为读取时间及串口操作本身有一定耗时;系统时间还可以像下面那样使用:

//该程序用于每一秒或以上时间打印输出一次时间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()); //打印当前时间 }}
1c8f8fc28961921bf9816f533d3998f8.gif

定时任务调度器Ticker

Ticker可以让你设置以固定时间间隔反复执行某个任务,相比上面的方法,使用Ticker时间上会更加精确,并且代码编写维护也更加方便;

使用步骤

引入头文件#include ;

建立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()

停止任务调度;

实例一

#include  //调用Ticker.h库Ticker ticker1; //声明Ticker对象Ticker ticker2; //声明Ticker对象void callback1() //回调函数{ Serial.print(millis()); Serial.println(": callback1 triggered!");}void callback2() //回调函数{ Serial.print(millis()); Serial.println(": callback2 triggered!");}void setup(){ Serial.begin(115200); Serial.println(); ticker1.attach(0.5, callback1); //每0.5秒调用callback1 ticker2.once_ms(2000, callback2); //2000毫秒后调用一次callback2}void loop(){}
7643e865132d789585e8e3e368bb2829.gif

实例二

#include  //调用Ticker.h库Ticker ticker1; //声明Ticker对象Ticker ticker2; //声明Ticker对象void callback2(int data) //回调函数{ Serial.print(millis()); Serial.print(": callback2 data is "); Serial.println(data);}void setup(){ Serial.begin(115200); Serial.println(); ticker1.attach_ms(500, [](){Serial.printf("%d: callback1 triggered!
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值