ESP系列定时器Arduino库使用

// 引入定时器库
#include <Ticker.h>

// 实例化定时器对象
Ticker time1;
Ticker time2;
Ticker time3;
Ticker time4;

void time1_callback() {
    Serial.println("时间到,执行我,我是定时器回调函数");
}

void setup() {
    // 为定时器配置触发时执行的回调函数
    // 每 60 秒执行一次 time1_callback
    time1.attach(60, time1_callback);
    // 每 1000 ms 执行一次 time1_callback
    time2.attach_ms(1000, time1_callback);
    // 倒计时 1 个小时,时间到执行一次 time1_callback
    time3.once(60 * 60, time1_callback);
    // 倒计时 1 分钟,时间到执行一次 time1_callback
    time3.once_ms(1000, time1_callback);
}

注意:attach 函数的另一个重载函数,void attach(float seconds, void (*callback)(TArg), TArg arg);,要求回调函数的形参 arg 必须小于 4 字节。

attach() callback argument size must be <= 4 bytes

举一反三

  • once_ms()类似 JavaScript 中的setTimeout(time1_callback, 1000)
  • attach_ms()类似 JavaScript 中的setInterval(time1_callback, 1000)

回调函数传参

定时器对象的定时方法的重载方法,还支持第 3 个参数,用来传递给回调函数。

void time1_callback(int state) {
    // 收到参数:88
    Serial.println("收到参数:%s", state);
}

time1.attach(60, time1_callback, 88);

移除定时器

// 移除定时器
time1.detach();

举一反三

  • 类似Javascript中移除定时器window.clearInterval(time1)window.clearTimeout(time1)

可以看出,JavaScript 不同的定时器,使用不同的清除函数。

判断定时器是否存在

if (time1.active()) {
    // 定时器还存话
}
posted @ 2022-07-30 22:00  沙里  阅读(916)  评论(0)    收藏  举报