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库(多任务处理)相关推荐

  1. 【arduino】nodemcu(ESP8266)发送邮件库测试笔记,SMTP email

    前一阵子看到群里有人问arduino发送邮件的相关问题,正好我也有搞这块的计划,于是便简单试了几个项目,(虽然就整出来一个)这里简单总结一下(防止日后忘了),如果你恰好也需要用这块,这篇文章可能会帮你 ...

  2. 【ESP32_8266_WiFi (十四)】ESP8266多任务处理 – Ticker库使用说明

    文章目录 ESP8266多任务处理 – Ticker库使用说明 1 Ticker库基本操作 2 停止定时执行函数 3 向定时调用函数传递参数 4 利用多个Ticker对象让ESP8266处理多任务 5 ...

  3. PlatformIO使用Arduino[Ticker]库(ESP8266)

    在<PlatformIO如何编译Arduino程序(ESP8266)>一文中,我们是使用delay()函数来延时,让LED灯闪烁,但因为delay()函数的使用会阻塞主程序的执行,所以,一 ...

  4. ESP8266多任务处理---Ticker库

    ESP8266多任务处理-Ticker库 ESP8266在运行过程中,只能一条线式的依次执行任务.但是我们在开发物联网项目时,可能需要ESP8266在执行某一任务的过程中,还能处理其它任务.比如,我们 ...

  5. arduino开发ESP8266配置方法,入门必看,esp8266开发板库离线安装包package2.7.1

    公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 群里经常有朋友问arduino开发ESP8266的配置方法,今天在之前的文章基础上, ...

  6. 200528更新arduino开发ESP8266配置方法,入门必看,esp8266开发板库离线安装包package2.7.1...

    公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 群里经常有朋友问arduino开发ESP8266的配置方法,今天(200528)在之 ...

  7. ESP8266 web配网微信小程序配网 全平台配网库 arduino 傻瓜式通用库

    wifi_link_tool esp8266通用配网库 (arduino) 库地址:点击进入GitHub 这是一个为esp8266设计的通用配网库 该库免费提供 使用请注明出处 允许毕业设计使用本库 ...

  8. Arduino ESP8266 +0.96“Oled屏幕基于U8g2库实现充电和wifi图标动态显示

    Arduino ESP8266 +0.96"Oled屏幕基于U8g2库实现充电和wifi图标动态显示 这种效果(基于U8g2函数构建实现的,区别于图片取模的方式.) 屏幕采用的是0.96&q ...

  9. Arduino ESP8266 SPI-FFS存储区域

    Arduino ESP8266 SPI-FFS存储区域 首先请原谅我分开来写,文章老是不过审核. 前言 在前面博文关于ESP8266WiFiWebServer的例程中,大家可以发现,博主基本上都是手动 ...

最新文章

  1. iOS 11开发教程(十五)iOS11应用视图的位置和大小
  2. [转]利用ASP.NET 2.0创建自定义Web控件(1)
  3. 关于MVC项目目录结构调整的想法
  4. 计算机中的补码和反码都是二进制吗,计算机中数值型数据二进制形式存储过程中的原码,反码与补码...
  5. python—auto-py-to-exe—.py文件打包成.exe文件最全最详细(用不同的类别做教程)
  6. clickhouse 小结1
  7. 脸部识别算法_面部识别技术是种族主义者吗? 先进算法的解释
  8. [CSCCTF 2019 Qual]FlaskLight
  9. php后端技术 有哪些,web后端开发技术有哪些 ?
  10. 浪曦_Struts2应用开发系列_第1讲.Struts2入门与配置--出现的问题笔记
  11. html table相同值合并单元格,ElementUI表格列相同值自动合并单元格( 单列 )
  12. 电脑上传,如何查看电脑上传速度
  13. windows7如何安装python_windows7系统下如何安装python
  14. Linux系统通过console口连接交换机
  15. 关于计算机高中英语作文,关于电脑的高中英语作文:Computers
  16. Java迷宫小游戏,老程序员花一天时间完成,你可以吗?
  17. GHOSTXP_SP3 09 绿茶纯净装机版V12.2 【雪豹】
  18. Linux工作笔记01
  19. java 音乐识别_使用java获取歌曲的属性
  20. 盘点:当今十大备份应用软件

热门文章

  1. (原创)微信公众号开发的简单模板及配置流程简介
  2. 如何写出好文案,不妨看看这篇(上)
  3. 为何要开办《微积分阅览室》?
  4. Dubbo的基本使用
  5. c++对8位灰度图进行二值化处理
  6. GCC自带的一些builtin内建函数
  7. 教你用Python爬取妹子图APP
  8. 爬mei紫图最后代码2015-2019-1-14全部
  9. IE不能上网浏览的原因和解决办法
  10. 图卷积在语义分割上的应用(论文集)