NodeMcu arduino ESP8266 使用Ticker库(多任务处理)
NodeMcu arduino ESP8266
本文章学习借鉴于太极创客团队,以表感谢。官网http://www.taichi-maker.com/
ESP8266 使用Ticker库(多任务处理)
文章目录
- NodeMcu arduino ESP8266
- 一、Ticker库是什么?
- 根据功能可以把方法分为两大类:
- 定时器管理方法
- 定时器启用方法;
- 常用方法示例如下
- 示例程序如下
- 示例1、如何使用Ticker库来定时执行操作
- 示例2、停止定时执行函数
- 示例3、 向定时调用函数传递参数
- 示例4、利用多个Ticker对象让ESP8266处理多任务
- 示例5、使用”计数器”来控制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);//连接WiFiconnectWifi();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(){//开始连接wifiWiFi.begin(ssid, password);//等待WiFi连接,连接成功打印IPwhile (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对象的任务处理。
NodeMcu arduino ESP8266 使用Ticker库(多任务处理)相关推荐
- 【arduino】nodemcu(ESP8266)发送邮件库测试笔记,SMTP email
前一阵子看到群里有人问arduino发送邮件的相关问题,正好我也有搞这块的计划,于是便简单试了几个项目,(虽然就整出来一个)这里简单总结一下(防止日后忘了),如果你恰好也需要用这块,这篇文章可能会帮你 ...
- 【ESP32_8266_WiFi (十四)】ESP8266多任务处理 – Ticker库使用说明
文章目录 ESP8266多任务处理 – Ticker库使用说明 1 Ticker库基本操作 2 停止定时执行函数 3 向定时调用函数传递参数 4 利用多个Ticker对象让ESP8266处理多任务 5 ...
- PlatformIO使用Arduino[Ticker]库(ESP8266)
在<PlatformIO如何编译Arduino程序(ESP8266)>一文中,我们是使用delay()函数来延时,让LED灯闪烁,但因为delay()函数的使用会阻塞主程序的执行,所以,一 ...
- ESP8266多任务处理---Ticker库
ESP8266多任务处理-Ticker库 ESP8266在运行过程中,只能一条线式的依次执行任务.但是我们在开发物联网项目时,可能需要ESP8266在执行某一任务的过程中,还能处理其它任务.比如,我们 ...
- arduino开发ESP8266配置方法,入门必看,esp8266开发板库离线安装包package2.7.1
公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 群里经常有朋友问arduino开发ESP8266的配置方法,今天在之前的文章基础上, ...
- 200528更新arduino开发ESP8266配置方法,入门必看,esp8266开发板库离线安装包package2.7.1...
公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 群里经常有朋友问arduino开发ESP8266的配置方法,今天(200528)在之 ...
- ESP8266 web配网微信小程序配网 全平台配网库 arduino 傻瓜式通用库
wifi_link_tool esp8266通用配网库 (arduino) 库地址:点击进入GitHub 这是一个为esp8266设计的通用配网库 该库免费提供 使用请注明出处 允许毕业设计使用本库 ...
- Arduino ESP8266 +0.96“Oled屏幕基于U8g2库实现充电和wifi图标动态显示
Arduino ESP8266 +0.96"Oled屏幕基于U8g2库实现充电和wifi图标动态显示 这种效果(基于U8g2函数构建实现的,区别于图片取模的方式.) 屏幕采用的是0.96&q ...
- Arduino ESP8266 SPI-FFS存储区域
Arduino ESP8266 SPI-FFS存储区域 首先请原谅我分开来写,文章老是不过审核. 前言 在前面博文关于ESP8266WiFiWebServer的例程中,大家可以发现,博主基本上都是手动 ...
最新文章
- iOS 11开发教程(十五)iOS11应用视图的位置和大小
- [转]利用ASP.NET 2.0创建自定义Web控件(1)
- 关于MVC项目目录结构调整的想法
- 计算机中的补码和反码都是二进制吗,计算机中数值型数据二进制形式存储过程中的原码,反码与补码...
- python—auto-py-to-exe—.py文件打包成.exe文件最全最详细(用不同的类别做教程)
- clickhouse 小结1
- 脸部识别算法_面部识别技术是种族主义者吗? 先进算法的解释
- [CSCCTF 2019 Qual]FlaskLight
- php后端技术 有哪些,web后端开发技术有哪些 ?
- 浪曦_Struts2应用开发系列_第1讲.Struts2入门与配置--出现的问题笔记
- html table相同值合并单元格,ElementUI表格列相同值自动合并单元格( 单列 )
- 电脑上传,如何查看电脑上传速度
- windows7如何安装python_windows7系统下如何安装python
- Linux系统通过console口连接交换机
- 关于计算机高中英语作文,关于电脑的高中英语作文:Computers
- Java迷宫小游戏,老程序员花一天时间完成,你可以吗?
- GHOSTXP_SP3 09 绿茶纯净装机版V12.2 【雪豹】
- Linux工作笔记01
- java 音乐识别_使用java获取歌曲的属性
- 盘点:当今十大备份应用软件