使用Arduino开发ESP32(07):系统时间和定时任务调度器Ticker
Posted Naisu Xu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Arduino开发ESP32(07):系统时间和定时任务调度器Ticker相关的知识,希望对你有一定的参考价值。
文章目录
目的
开发中经常会用到时间相关操作,主要就是用到系统时间、延时操作、定时任务调度等,本文介绍Arduino core for the ESP32中相关的一些功能。
系统时间及应用
系统时间相关方法如下:
unsigned long micros(); //返回微秒为单位系统时间
unsigned long millis(); //返回毫秒为单位系统时间
void delay(uint32_t); //设置毫秒级延时
void delayMicroseconds(uint32_t us); //设置微秒级延时
上图中微秒时间差稍大于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()); //打印当前时间
定时任务调度器Ticker
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()
停止任务调度;
使用事例
事例一
#include <Ticker.h> //调用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()
事例二
#include <Ticker.h> //调用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!\\r\\n", millis());); //匿名函数方式
ticker2.once(2, callback2, 1234567890); //2秒后调用一次callback2
// ticker2.once(4, callback2, std::bind(callback2, millis())); //使用绑定方式...用不了-.-!
void loop()
事例三
#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()
总结
上面两块主要用来为程序设计提供便利性,在多任务应用开发中协调各项任务运行,更多内容可以参考如下:
https://github.com/espressif/arduino-esp32/tree/master/libraries/Ticker
以上是关于使用Arduino开发ESP32(07):系统时间和定时任务调度器Ticker的主要内容,如果未能解决你的问题,请参考以下文章
基于ubuntu环境,搭建Arduino+ESP32+MPU6050验证系统,并利用Processing仿真
Arduino方式开发ESP32笔记:使用Preferences保存数据
ESP32上手笔记 | 02 - ESP32-Arduino开发环境搭建