文章目录

  • 目的
  • 系统时间及应用
  • 定时任务调度器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相关推荐

  1. 使用Arduino开发ESP32(11):IO口与相关外设说明与记录

    文章目录 目的 数字IO口 基本使用 外部中断 使用示例 参考链接 LEDC(PWM) 常用方法 使用示例 参考链接 SigmaDelta 参考链接 ADC 常用方法 使用示例 参考链接 存在的问题 ...

  2. 【嵌入式开发】开发板设置系统时间

    开发板设置系统时间 环境 查看系统时间 查看硬件时间 设置系统时间 设置RTC时间 其他问题 时钟包括硬件时钟和系统时钟,系统时钟就是linux系统显示的时间,用命令 date可以显示当前系统时间:硬 ...

  3. 使用Arduino开发ESP32(八):ESP32的EPROM的写入读取

    写入EPROM /* 该代码向EEPROM写入4096字节数据 */ #include <EEPROM.h>void setup() {Serial.begin(115200);Seria ...

  4. 使用Arduino开发ESP32(13):SD卡的使用

    文章目录 目的 SDMMC方式 常用方法 使用示例 SPI方式 常用方法 使用示例 注意事项 总结 目的 对于嵌入式设备来说SD卡也是个比较好用的功能,比如用来存放设备的配置文件.日志文件.执行脚本. ...

  5. 使用Arduino开发ESP32(21):蓝牙基础说明与作为服务器使用

    文章目录 目的 蓝牙基础说明 测试工具 作为服务器使用 创建蓝牙设备并广播 创建Server 创建Service并启动 创建Characteristic 读写Characteristic中的Value ...

  6. 使用Arduino开发ESP32(16):DeepSleep和RTC Memory的使用

    文章目录 目的 基础说明 DeepSleep RTC Memory 使用示例 部分方法说明 总结 目的 ESP32在工作时功耗蛮大的,所以我们可以在不需要时进行休眠,这也是蛮常用的功能. 基础说明 D ...

  7. 使用Arduino开发ESP32:wifi基本功能使用

    1.建立网络(AP) 2.连接网络(STA) 3.扫描网络 1.建立网络(AP) 只需两步:1.引用WiFi库include<WiFi.h> 2.启动AP网络WiFi.softAP(ssi ...

  8. 使用Arduino开发ESP32(06):Ethernet的使用(基于LAN8720)

    文章目录 目的 基本说明 接线定义 使用步骤 常用方法说明 使用演示 数据通讯 事件响应 其他说明 PHY地址 时钟 通讯应用 总结 目的 ESP32除了可以使用无线网络外还可以通过外接PHY模块来使 ...

  9. 使用Arduino开发ESP32:关于esp32 wifi连接不上的解决办法

    今天在学习MQTT订阅的过程中 发现esp32时钟连接不上wifi 主体代码如下: while(WiFi.status()!=WL_CONNECTED){delay(200);Serial.print ...

最新文章

  1. 散列表(也叫哈希表),
  2. 使用SQLyog无法连接到MySQL,error code 2013
  3. PAT甲级题目翻译+答案 AcWing(排序)
  4. 模版引擎总结之综合分析模版引擎
  5. ffmpeg添加到环境变量_Windows + MSVC环境编译ffmpeg
  6. linux ps 命令使用
  7. 学fpga(在线verilog编程)
  8. jenkins 插件安装
  9. 列出场景对象Lightmap属性
  10. python启动方法_python启动服务
  11. 目标跟踪CVPR,ICCV,ECCV文章及代码实时更新
  12. 软体机器人空间感知技术综述
  13. Python TODO说明
  14. 2022年G1工业锅炉司炉考试试题及答案
  15. 用计算机怎么求反三角函数图像及性质,反三角函数图像及性质
  16. 从零开始详解应用内支付——商品创建及测试上架
  17. 漫步者蓝牙只有一边有声音_为什么我蓝牙耳机只有一边有声音?
  18. snprintf的使用
  19. 微型计算机逻辑元件有哪些,目前普遍使用的微型计算机所采用的逻辑元件有哪些...
  20. 初探JavaBean

热门文章

  1. sql server 2008 导入导出数据大全
  2. 设置el-from输入框el-input、el-select、日期el-date-editor固定宽度
  3. 【Arduino】LCD 1602 转接板 的默认接线
  4. x230黑苹果的一点经验
  5. weka mysql 汉字_Weka访问MySQL数据库
  6. 基于ACE的服务定位器(图失效)
  7. 【Pandas】数据结构Series 基本用法总结
  8. laravel-admin使添加、编辑按钮支持附带参数
  9. 资讯汇总230212
  10. PostgreSQL数据库触发器实验