使用Arduino开发ESP32(九):系统时间方法函数与Ticker回调函数

常用时间函数:

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);
}

该问题留待解决,欢迎评论区留言

参考,及感谢使用Arduino开发ESP32(07):系统时间和定时任务调度器Ticker

  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
引用\[1\]中的代码片段展示了如何使用SSD1306驱动库和QRcode库来控制OLED显示屏和生成二维码。这段代码中,首先包含了所需的库文件,然后初始化了OLED显示屏和二维码生成器。在setup函数中,创建了一个字符串并将其转换为二维码,然后在loop函数中没有任何操作。这段代码的作用是在OLED显示屏上显示一个带有"hello world!"文本的二维码。 引用\[2\]中的代码片段展示了如何使用base64库来对字符串进行编码。这段代码中,首先包含了所需的库文件,然后在setup函数中将一个测试字符串进行base64编码,并将结果打印出来。在loop函数中没有任何操作。这段代码的作用是将一个字符串进行base64编码并打印出编码结果。 至于引用\[3\]中的OTA更新,它是一种通过WiFi连接而不是串行端口将固件加载到ESP模块的方法。在Arduino IDE中,可以使用OTA功能来进行固件烧写。通过Web浏览器手动提供应用程序更新,或者使用HTTP服务器自动提供应用程序更新。这种方法可以方便地对ESP32进行固件更新,而无需使用串行端口进行烧写。 综上所述,引用\[1\]中的代码片段展示了如何使用SSD1306驱动库和QRcode库来控制OLED显示屏和生成二维码,引用\[2\]中的代码片段展示了如何使用base64库对字符串进行编码,而引用\[3\]中的OTA更新是一种通过WiFi连接进行固件加载的方法。 #### 引用[.reference_title] - *1* *2* *3* [玩转 ESP32 + Arduino (七) Ticker定时库,base64转换,OTA, SSD1306显示QRcode二维码](https://blog.csdn.net/finedayforu/article/details/108464929)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值