ESP8266--Arduino开发(Ticker库软件定时器)

本文详细介绍了ESP8266 Arduino IDE中Ticker库的使用方法,包括一次性启动与周期性定时器的功能,以及LED闪烁示例。重点讲解了周期性定时器的attach和once函数,以及如何检查定时器状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

Ticker库是ESP8266在ArduinoIDE上自带的软件定时器库,我们可以使用他来实现软件定时器功能。

功能函数说明
一次性启动once_ms(time, timer_cb)time: 定时时间; timer_cb: 定时器回调函数
once(time, timer_cb)单位为s
周期性启动attach_ms(time, timer_cb, gpioID)gpioID为传入回调函数的形参
attach(time, timer_cb, gpioID)单位为s
停止detach()
判断定时器是否工作active()

二、周期性定时器的使用

/*
 * Ticker库的基本使用
 * 
 * 每个Ticker需要建立一个回调函数,当定时时间到了后,回调函数将被调用;
 * 理论上可以新建足够多的Ticker对象,但这会受到内存容量的限制
 *
 * 使用Ticker实现LED闪烁,并查询定时器存活状态。
*/

#include <Ticker.h>                       // 使用Ticker库,需要包含头文件

Ticker timer1;                            // 创建一个定时器对象

void setup() {
  Serial.begin(115200);                   // 初始化串口
  
  pinMode(LED_BUILTIN, OUTPUT);           // 设置LED引脚为输出引脚
  digitalWrite(LED_BUILTIN, LOW);         // 设置引脚为低电平,点亮LED

  /* 设置周期性定时0.5s,即500ms,回调函数为timer1_cb,参数为LED引脚号,并启动定时器 */
  timer1.attach(0.5, timer1_cb, LED_BUILTIN);
}

void loop() {
  /* 检测定时器是否为存活状态 */
  if(timer1.active()){
    Serial.println("timer1 is active.");
  }
  else{
    Serial.println("timer1 is not active!");
  }
  delay(100);
}

void timer1_cb(int led_pin) 
{
  int state = digitalRead(led_pin);  // 获取当前led引脚状态
  digitalWrite(led_pin, !state);     // 翻转LED引脚电平
}

三、一次性定时器的使用

/*
 * Ticker库的基本使用
 * 
 * 每个Ticker需要建立一个回调函数,当定时时间到了后,回调函数将被调用;
 * 理论上可以新建足够多的Ticker对象,但这会受到内存容量的限制
 *
 * 使用Ticker实现LED闪烁,并查询定时器存活状态。
*/

#include <Ticker.h>                       // 使用Ticker库,需要包含头文件

Ticker timer1;                            // 创建一个定时器对象
Ticker timer2;                            // 创建定时器用于开启timer1
Ticker timer3;                            // 创建定时器用于关闭timer2

void setup() {
  Serial.begin(9600);                     // 初始化串口
  
  pinMode(LED_BUILTIN, OUTPUT);           // 设置LED引脚为输出引脚
  digitalWrite(LED_BUILTIN, LOW);         // 设置引脚为低电平,点亮LED

  /* 设置timer2和timer分别为1s和3s,用于启动和关闭timer1 */
  timer2.once_ms(1000, timer2_cb);        // 1000ms即1后开启timer1
  timer3.once(3, timer3_cb);              // 3s后关闭timer1
}

void loop() {
  /* 检测定时器是否为存活状态 */
  if(timer1.active()){
    Serial.println("timer1 is active.");
  }
  else{
    Serial.println("timer1 is not active!");
  }
  delay(200);
}

void timer1_cb(int led_pin) 
{
  int state = digitalRead(led_pin);  // 获取当前led引脚状态
  digitalWrite(led_pin, !state);     // 翻转LED引脚电平
}

void timer2_cb()
{
  /* 启动定时器1, 设置周期性定时0.5s,即500ms,回调函数为timer1_cb,参数为LED引脚号 */
  timer1.attach(0.5, timer1_cb, LED_BUILTIN);  
}

void timer3_cb()
{
  /* 关闭定时器1 */
  timer1.detach();  
}
<think>好的,我现在要回答用户关于如何在ESP8266上使用Arduino实现定时器功能的问题。首先,我需要回忆一下用户提供的参考资料,看看里面有没有相关的示例代码或者方法。根据引用[1],用户提到了使用定时器中断控制LED闪烁的Arduino ESP8266示例程序,但具体代码可能没有完整展示。引用[2]和[3]则分别涉及了delay函数和ESP32的定时器中断,但用户需要的是ESP8266Arduino实现。 接下来,我需要确认ESP8266Arduino环境下是否支持硬件定时器。根据我所知,ESP8266Arduino核心提供了Ticker,可以用于软件定时器,而硬件定时器可能需要使用其他,比如ESP8266Timer。不过,用户提供的引用中没有提到具体的,可能需要进一步确认。 首先,用户可能需要使用Ticker来创建定时器Ticker允许设置周期性的回调函数,这可以用来实现定时器功能。例如,设置一个每秒钟触发的定时器来控制LED的闪烁。 然后,我需要检查示例代码的正确性。确保包含正确的头文件,比如#include <Ticker.h>,并正确初始化和使用定时器对象。例如,定义一个Ticker实例,使用attach方法设置间隔和回调函数。 另外,要注意ESP8266定时器中断可能有一些限制,比如在中断服务例程(ISR)中不能使用延迟函数或执行复杂操作。因此,在回调函数中应尽量保持简短,避免阻塞。 还需要考虑用户可能的硬件连接,比如LED的连接方式。例如,LED应连接到某个GPIO引脚,比如D4,并通过上拉电阻连接,因为ESP8266的某些引脚在启动时有特定状态,需要避免冲突。 最后,综合以上信息,整理出步骤清晰的说明,包括的安装、代码结构、函数使用和注意事项。确保代码示例正确无误,并解释每一部分的作用,帮助用户理解如何实现定时器功能。</think>以下是ESP8266Arduino环境下实现定时器功能的详细指南: ### 一、ESP8266定时器实现方法 ESP8266Arduino环境下可通过两种方式实现定时器: 1. **软件定时器**:使用$Ticker$实现非阻塞定时操作 2. **硬件定时器**:使用$ESP8266Timer$实现精确中断(需额外安装) ### 二、Ticker使用示例(软件定时器) ```cpp #include <Ticker.h> #define LED_PIN D4 // 对应NodeMCU开发板的板载LED Ticker timer; bool ledState = false; void toggleLED() { ledState = !ledState; digitalWrite(LED_PIN, ledState); } void setup() { pinMode(LED_PIN, OUTPUT); timer.attach(0.5, toggleLED); // 每500ms触发一次 } void loop() { // 主程序可执行其他任务 delay(100); // 非阻塞延时示例 } ``` *代码说明:* - 使用$attach()$方法设置定时器间隔(秒为单位) - 回调函数$toggleLED$将周期性改变LED状态 - 相比$delay()$不会阻塞主程序执行[^1] ### 三、硬件定时器实现(需安装) 1. 安装:通过管理器搜索安装$ESP8266Timer$ 2. 示例代码: ```cpp #include <ESP8266Timer.h> ESP8266Timer timer; #define LED_PIN D4 void ICACHE_RAM_ATTR onTimer() { digitalWrite(LED_PIN, !digitalRead(LED_PIN)); } void setup() { pinMode(LED_PIN, OUTPUT); timer.setInterval(500000, onTimer); // 500ms间隔(单位:微秒) } void loop() { // 主循环保持空置 } ``` *注意事项:* - 硬件定时器精度可达微秒级 - 中断服务程序需添加$ICACHE_RAM_ATTR$属性 - 避免在ISR中使用复杂操作[^3] ### 四、性能对比 | 类型 | 精度 | 资源占用 | 适用场景 | |------------|---------|----------|--------------------| | 软件定时器 | 毫秒级 | 低 | 多任务简单定时 | | 硬件定时器 | 微秒级 | 高 | 高精度时间敏感操作 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值