使用Arduino开发ESP32(07):系统时间和定时任务调度器Ticker
文章目录
- 目的
- 系统时间及应用
- 定时任务调度器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秒调用callback1ticker2.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相关推荐
- 使用Arduino开发ESP32(11):IO口与相关外设说明与记录
文章目录 目的 数字IO口 基本使用 外部中断 使用示例 参考链接 LEDC(PWM) 常用方法 使用示例 参考链接 SigmaDelta 参考链接 ADC 常用方法 使用示例 参考链接 存在的问题 ...
- 【嵌入式开发】开发板设置系统时间
开发板设置系统时间 环境 查看系统时间 查看硬件时间 设置系统时间 设置RTC时间 其他问题 时钟包括硬件时钟和系统时钟,系统时钟就是linux系统显示的时间,用命令 date可以显示当前系统时间:硬 ...
- 使用Arduino开发ESP32(八):ESP32的EPROM的写入读取
写入EPROM /* 该代码向EEPROM写入4096字节数据 */ #include <EEPROM.h>void setup() {Serial.begin(115200);Seria ...
- 使用Arduino开发ESP32(13):SD卡的使用
文章目录 目的 SDMMC方式 常用方法 使用示例 SPI方式 常用方法 使用示例 注意事项 总结 目的 对于嵌入式设备来说SD卡也是个比较好用的功能,比如用来存放设备的配置文件.日志文件.执行脚本. ...
- 使用Arduino开发ESP32(21):蓝牙基础说明与作为服务器使用
文章目录 目的 蓝牙基础说明 测试工具 作为服务器使用 创建蓝牙设备并广播 创建Server 创建Service并启动 创建Characteristic 读写Characteristic中的Value ...
- 使用Arduino开发ESP32(16):DeepSleep和RTC Memory的使用
文章目录 目的 基础说明 DeepSleep RTC Memory 使用示例 部分方法说明 总结 目的 ESP32在工作时功耗蛮大的,所以我们可以在不需要时进行休眠,这也是蛮常用的功能. 基础说明 D ...
- 使用Arduino开发ESP32:wifi基本功能使用
1.建立网络(AP) 2.连接网络(STA) 3.扫描网络 1.建立网络(AP) 只需两步:1.引用WiFi库include<WiFi.h> 2.启动AP网络WiFi.softAP(ssi ...
- 使用Arduino开发ESP32(06):Ethernet的使用(基于LAN8720)
文章目录 目的 基本说明 接线定义 使用步骤 常用方法说明 使用演示 数据通讯 事件响应 其他说明 PHY地址 时钟 通讯应用 总结 目的 ESP32除了可以使用无线网络外还可以通过外接PHY模块来使 ...
- 使用Arduino开发ESP32:关于esp32 wifi连接不上的解决办法
今天在学习MQTT订阅的过程中 发现esp32时钟连接不上wifi 主体代码如下: while(WiFi.status()!=WL_CONNECTED){delay(200);Serial.print ...
最新文章
- 散列表(也叫哈希表),
- 使用SQLyog无法连接到MySQL,error code 2013
- PAT甲级题目翻译+答案 AcWing(排序)
- 模版引擎总结之综合分析模版引擎
- ffmpeg添加到环境变量_Windows + MSVC环境编译ffmpeg
- linux ps 命令使用
- 学fpga(在线verilog编程)
- jenkins 插件安装
- 列出场景对象Lightmap属性
- python启动方法_python启动服务
- 目标跟踪CVPR,ICCV,ECCV文章及代码实时更新
- 软体机器人空间感知技术综述
- Python TODO说明
- 2022年G1工业锅炉司炉考试试题及答案
- 用计算机怎么求反三角函数图像及性质,反三角函数图像及性质
- 从零开始详解应用内支付——商品创建及测试上架
- 漫步者蓝牙只有一边有声音_为什么我蓝牙耳机只有一边有声音?
- snprintf的使用
- 微型计算机逻辑元件有哪些,目前普遍使用的微型计算机所采用的逻辑元件有哪些...
- 初探JavaBean