NodeMcu arduino ESP8266 使用Ticker库(多任务处理)

NodeMcu arduino ESP8266

本文章学习借鉴于太极创客团队,以表感谢。官网http://www.taichi-maker.com/

ESP8266 使用Ticker库(多任务处理)



一、Ticker库是什么?

Ticker是ESP32 arduino的自带库,可以设置以固定时间间隔反复执行某个任务,特别适合以固定频率从传感器收集数据。
计时器本质上是一个计数器。让我们举一个简单的例子。如果给你一个可以从0到10计数的计数器,并且每次到达计数结束或溢出时都会给你一个中断,那么,只需调整计数的频率,你就可以得到准确的时间间隔。
ESP8266内置的定时器库–Ticker库,Ticker的功能非常简单,就是规定时间后调用函数。

在这里插入图片描述

根据功能可以把方法分为两大类:

定时器管理方法

定时器启用方法;

常用方法示例如下

seconds 秒数
callback 回调函数
arg 是回调函数的参数

void once(float seconds, callback_function_t callback); xx秒后只执行一次——-不带参数
void once(float seconds, callback_function_t callback,TArg arg); xx秒后只执行一次——-带参数

void once_ms(float seconds, callback_function_t callback) xx毫秒后只执行一次

void once_ms(float seconds, callback_function_t callback,TArg arg) xx毫秒后只执行一次

void attach(float seconds, callback_function_t callback); 每隔xx秒周期性执行

void attach(float seconds, callback_function_t callback,TArg arg); 每隔xx秒周期性执行

void attach_ms(float seconds, callback_function_t callback); 每隔xx毫秒周期性执行

void attach_ms(float seconds, callback_function_t callback,TArg arg); 每隔xx毫秒周期性执行


示例程序如下

示例1、如何使用Ticker库来定时执行操作

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : a_basic_tinker
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 20200703
程序目的/Purpose          : 
本程序旨在演示如何使用Ticker库来定时执行操作。
如需了解本程序的详细说明,请参考以下函数:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-tips/ticker/
                 
***********************************************************************/
#include <Ticker.h>
 
Ticker ticker;// 建立Ticker用于实现定时功能
int count;    // 计数用变量
 
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
 
  // 每隔一秒钟调用sayHi函数一次,attach函数的第一个参数
  // 是控制定时间隔的变量。该参数的单位为秒。第二个参数是
  // 定时执行的函数名称。
  ticker.attach(1, sayHi);
}
 
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 sayHi(){
  count++;
  Serial.print("Hi ");
  Serial.println(count);
}

示例2、停止定时执行函数

当Ticker定时调用某一函数执行到一定次数后,我们可以使用detach函数来停止定时调用函数。以下示例程序中的语句ticker.detach()将会让ticker对象停止调用函数。

/**********************************************************************
项目名称/Project          : 零基础入门学用物联网
程序名称/Program name     : b_detach
团队/Team                : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author              : CYNO朔
日期/Date(YYYYMMDD)     : 20200703
程序目的/Purpose          : 
本程序旨在演示如何停止Ticker库定时调用函数。
如需了解本程序的详细说明,请参考以下函数:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-tips/tinker/
-----------------------------------------------------------------------
其它说明 / Other Description:
本程序为太极创客团队制作的免费视频教程《零基础入门学用物联网 》中一部分。该教程系统的
向您讲述ESP8266的物联网应用相关的软件和硬件知识。以下是该教程目录页:
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/                    
***********************************************************************/
#include <Ticker.h>
 
Ticker ticker;// 建立Ticker用于实现定时功能
int count;    // 计数用变量
 
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  
  // 每隔一秒钟调用sayHi函数一次
  ticker.attach(1, sayHi);
}
 
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 sayHi(){
  count++;
  Serial.print("Hi ");
  Serial.println(count);
 
  // 当定时调用了6次后,停止定时调用函数
  if (count >= 6) {
    ticker.detach();  // 使用detach来停止ticker对象定时调用函数
    Serial.print("ticker.detach()");
  }
}

示例3、 向定时调用函数传递参数

请注意:attach函数所能传递的参数最多只有一个。另外该参数仅能是以下类型中的一种:char, short, int, float, void*, char*。

#include <Ticker.h>
 
Ticker ticker;
 
int count;
 
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  
  ticker.attach(1, sayHi, 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 sayHi(int hiTimes){
  count++;
  Serial.print("Hi ");
  Serial.println(count);
 
  if (count >= hiTimes) {
    ticker.detach();
    Serial.print("ticker.detach();");
  }
}

示例4、利用多个Ticker对象让ESP8266处理多任务

建立多个Ticker对象。让多个Ticker对象来实现ESP8266的多任务处理。如下实例程序所示,我们通过语句Ticker buttonTicker;来建立第二个Ticker对象。

#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 hiTimes){
  count++;
  Serial.print("Hi ");
  Serial.println(count);
 
  if (count >= hiTimes) {
    ticker.detach();
    Serial.print("ticker.detach();");
  }
}
 
void buttonCheck(){
  if (digitalRead(D3) == LOW){
    Serial.println("D3 Button Pushed...");
  }
}

示例5、使用”计数器”来控制ESP8266定时执行较复杂的函数

Ticker定时调用的函数必须要“短小精悍”。比如以上一系列的示例程序中,我们仅仅让Ticker定时调用函数执行简单的串口数据输出,以及很基本的运算。事实上,在使用Ticker库时,定时调用函数必须要很快的执行完毕。否则会产生难以预料的问题。

在这段示例程序里,我们建立了一个计数变量count。在程序的第55到第59行中,Ticker定时调用的函数tickerCount仅仅对count变量进行自加。

当计数变量count达到我们需要的数值后,则让ESP8266执行较为复杂的函数。这一点是通过程序的第49到52行逻辑判断语句所实现的。

请注意,在每一次执行完操作后,我们都需要对count变量进行清零。否则程序将无法定时通过互联网向服务器发送请求。

//使用定时器计数,设置周期性发送请求
#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!");   
}

例6、

总结

掌握下面Ticker 库中常用的函数以及用途和方法。

	Ticker ticker;// 建立Ticker用于实现定时功能
	Ticker buttonTicker;//建立多个Ticker用于实现定时功能
	// 每隔一秒钟调用sayHi函数一次,attach函数的第一个参数
	// 是控制定时间隔的变量。该参数的单位为秒。第二个参数是
	// 定时执行的函数名称。
	ticker.attach(1, sayHi);
	ticker.detach();  // 使用detach来停止ticker对象定时调用函数
	ticker.attach(1, sayHi, 8)3个参数。其中第三个参数就是向定时调用的sayHi函数所传递的参数
	sayHi(8); //接受过来的参数
	buttonTicker.attach_ms(100, buttonCheck)来实现第二个Ticker对象的任务处理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

闰土小蒋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值