Arduino:使用 ESP32 的定时器(10)

@[toc]

目的

利用定时器,使 LED 灯进行闪烁

主要函数

void once(float seconds, callback_t callback)
在 seconds 秒时执行命令,该命令只执行一次

void once_ms(uint32_t milliseconds, callback_t callback) 在 milliseconds 毫秒时执行命令,该命令只执行一次

void attach(float seconds, void (*callback)(TArg), TArg arg) 在每 seconds 秒后执行命令,命令带参数

void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg) 在每 milliseconds 毫秒后执行命令,命令带参数

void Ticker::attach(float seconds, callback_t callback) 在每 seconds 秒后执行命令,命令不带参数

void attach_ms(uint32_t milliseconds, callback_t callback) 在每 milliseconds 毫秒后执行命令,命令不带参数

示例代码

带参数

#include <Arduino.h>
#include <Ticker.h>


#define LED_PIN 18

Ticker tickerSetHigh;
Ticker tickerSetLow;

void setPin(int state) {
  digitalWrite(LED_PIN, state);
}

void setup() {
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(1, LOW);
  
  // 每 25 ms 执行setPin(0)
  tickerSetLow.attach_ms(25, setPin, 0);
  
  // 每 25 ms 执行setPin(1)
  tickerSetHigh.attach_ms(26, setPin, 1);
}

void loop() {

}

不带参数

#include <Arduino.h>
#include <Ticker.h>

#define LED_PIN 18

Ticker blinker;
Ticker toggler;
Ticker changer;
float blinkerPace = 0.1;  //seconds
const float togglePeriod = 5; //seconds

void change() {
  blinkerPace = 0.5;
}

void blink() {
  digitalWrite(LED_PIN, !digitalRead(LED_PIN));
}

void toggle() {
  static bool isBlinking = false;
  if (isBlinking) {
    blinker.detach();
    isBlinking = false;
  }
  else {
    blinker.attach(blinkerPace, blink);
    isBlinking = true;
  }
  digitalWrite(LED_PIN, LOW);  //确保闪烁后 LED 是灭
}
void setup() {
  pinMode(LED_PIN, OUTPUT);
  toggler.attach(togglePeriod, toggle);   // 每 5 秒执行一次
  changer.once(30, change);    // 30 秒后执行一次就不再执行
}

void loop() {
  
}

总结

用定时器进行其他操作都跟操作 LED 差不多,都是到一定时刻执行一定的命令。在库函数中,分别有带参数和不带参数的函数,这样可以在不同特定需求的场合下可以使用

资料来源

ticker 库

bpibit 板子