当前位置: 首页 > 工具软件 > ticker > 使用案例 >

ESP8266多任务处理:Ticker库

司徒耀
2023-12-01

ESP8266多任务处理—Ticker库


✨在Arduino ESP8266平台上,ticker库是基于硬件定时器Timer来实现的。ESP8266 SoC芯片共有两个硬件定时器:Timer0和Timer1。一般情况下,Timer0通常被用于WiFi协议栈实现,因此如果需要使用定时器来进行周期性的任务调度,就需要使用Timer1。

  • ⚡同作者推荐ESP以及RP2040主板的推荐使用TickTwo库。(https://github.com/sstaub/TickTwo

  • 鱗与之相似的还有Simpletimer库。

  • 在使用ticker库时,可以通过create函数来创建一个基于硬件定时器的软件定时器,attach_ms函数就是基于Timer1定时器实现的,它会在后台启动一个软件定时器来周期性地调用指定的中断服务函数。通过这种方式,可以方便地实现任务调度、数据采集等功能。

示例1



#include <Ticker.h>
 
Ticker ticker;// 建立Ticker用于实现定时功能
int count;    // 计数用变量
 
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
 
  // 每隔一秒钟调用Task函数一次,attach函数的第一个参数
  // 是控制定时间隔的变量。该参数的单位为秒。第二个参数是
  // 定时执行的函数名称。
  ticker.attach(1, Task);
}
 
void loop() {
  // 用LED呼吸灯效果来演示在Tinker对象控制下,ESP8266可以定时
  // 执行其它任务
  for (int fadeValue = 0 ; fadeValue <= 1023; fadeValue += 5) {
    analogWrite(LED_BUILTIN, fadeValue);
    delay(10);
  }
 
  for (int fadeValue = 1023 ; fadeValue >= 0; fadeValue -= 5) {
    analogWrite(LED_BUILTIN, fadeValue);
    delay(10);
  }
  delay(3000);
}
 
// 在Tinker对象控制下,此函数将会定时执行。
void Task(){
  count++;
  Serial.print("Task. ");
  Serial.println(count);
}

示例代码2



#include <Ticker.h>
 
Ticker ticker;// 建立Ticker用于实现定时功能
int count;    // 计数用变量
 
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  
  // 每隔一秒钟调用sayHi函数一次
  ticker.attach(1, Task);
}
 
void loop() {
  // 用LED呼吸灯效果来演示在Tinker对象控制下,ESP8266可以定时
  // 执行其它任务  
  for (int fadeValue = 0 ; fadeValue <= 1023; fadeValue += 5) {
    analogWrite(LED_BUILTIN, fadeValue);
    delay(10);
  }
 
  for (int fadeValue = 1023 ; fadeValue >= 0; fadeValue -= 5) {
    analogWrite(LED_BUILTIN, fadeValue);
    delay(10);
  }
  delay(3000);
}
 
// 在Tinker对象控制下,此函数将会定时执行。
void Task(){
  count++;
  Serial.print("Hi ");
  Serial.println(count);
 
  // 当定时调用了6次后,停止定时调用函数
  if (count >= 6) {
    ticker.detach();  // 使用detach来停止ticker对象定时调用函数
    Serial.print("ticker.detach()");
  }
}

示例代码3



#include <Ticker.h>
 
Ticker ticker;
 
int count;
 
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  
  ticker.attach(1, Task, 8);
}
 
void loop() {
  for (int fadeValue = 0 ; fadeValue <= 1023; fadeValue += 5) {
    analogWrite(LED_BUILTIN, fadeValue);
    delay(10);
  }
 
  for (int fadeValue = 1023 ; fadeValue >= 0; fadeValue -= 5) {
    analogWrite(LED_BUILTIN, fadeValue);
    delay(10);
  }
  delay(3000);
}
 
void Task(int times){
  count++;
  Serial.print("Task1 ");
  Serial.println(count);
 
  if (count >= times) {
    ticker.detach();
    Serial.print("ticker.detach();");
  }
}

示例代码4



#include <Ticker.h>
 
Ticker ticker;
Ticker buttonTicker;
 
int count;
 
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(D3, INPUT_PULLUP);
  
  ticker.attach(1, sayHi, 60);
  buttonTicker.attach_ms(100, buttonCheck);
}
 
void loop() {
  for (int fadeValue = 0 ; fadeValue <= 1023; fadeValue += 5) {
    analogWrite(LED_BUILTIN, fadeValue);
    delay(10);
  }
 
  for (int fadeValue = 1023 ; fadeValue >= 0; fadeValue -= 5) {
    analogWrite(LED_BUILTIN, fadeValue);
    delay(10);
  }
  delay(3000);
}
 
void sayHi(int Times){
  count++;
  Serial.print("Task1");
  Serial.println(count);
 
  if (count >= Times) {
    ticker.detach();
    Serial.print("ticker.detach();");
  }
}
 
void buttonCheck(){
  if (digitalRead(D3) == LOW){
    Serial.println("D3 Button Pushed...");
  }
}

示例代码5



#include <Ticker.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
 
#define URL "http://www.example.com"
 
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "taichimaker";
const char* password = "12345678";
 
Ticker ticker;
 
int count;
 
void setup() {
  Serial.begin(9600);
 
  //设置ESP8266工作模式为无线终端模式
  WiFi.mode(WIFI_STA);
  
  //连接WiFi
  connectWifi();
 
  ticker.attach(1, tickerCount);
}
 
void loop() {  
  if (count >= 5){   
    httpRequest();
    count = 0;
  }
}
 
void tickerCount(){
  count++;
  Serial.print("count = ");
  Serial.println(count);
}
 
// 发送HTTP请求并且将服务器响应通过串口输出
void httpRequest(){
  HTTPClient httpClient;
 
  httpClient.begin(URL); 
  Serial.print("URL: "); Serial.println(URL);
 
  int httpCode = httpClient.GET();
  Serial.print("Send GET request to URL: ");
  Serial.println(URL);
  
  if (httpCode == HTTP_CODE_OK) {
    // 使用getString函数获取服务器响应体内容
    String responsePayload = httpClient.getString();
    Serial.println("Server Response Payload: ");
    Serial.println(responsePayload);
  } else {
    Serial.println("Server Respose Code:");
    Serial.println(httpCode);
  }
  httpClient.end();
}
 
void connectWifi(){
//开始连接wifi
  WiFi.begin(ssid, password);
 
  //等待WiFi连接,连接成功打印IP
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi Connected!");   
}
 
 类似资料: