位置导航: 首页 / 物联网教程 / 第3章 – 用C/C++开发物联网 / ESP8266应用技巧 / 本页
ESP8266在运行过程中,只能一条线式的依次执行任务。但是我们在开发物联网项目时,可能需要ESP8266在执行某一任务的过程中,还能处理其它任务。比如,我们使用ESP8266来控制电机运行的同时,还需要定时检查某一个引脚上连接按钮有没有被用户按下。
为了解决以上问题,我们可以使用Ticker库来解决这一问题。下面我们来通过一系列示例程序向您讲解Ticker库的使用方法。
示例1. Ticker库基本操作
利用Ticker库,我们可以让ESP8266定时调用某一个函数。通过以下示例程序我们可以看到,ESP8266将会每隔一秒钟通过串口监视器输出一次信息。我们是通过语句ticker.attach(1, sayHi)
来实现这一操作的。
该语句中的attach函数有两个参数。第一个参数可控制调用函数的时间间隔,单位是秒。这里的数字1说明ESP8266将会每隔一秒钟调用一次函数。那么具体调用哪一个函数呢?这个函数名称正是是通过第二个参数来限定的。也就是名称为sayHi的函数。该函数将会让ESP8266定时通过串口监视器输出一次信息。信息内容是“Hi”后面跟一个数值。这个数值是为了标注sayHi函数被调用了多少次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
/********************************************************************** 项目名称/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/ ----------------------------------------------------------------------- 其它说明 / 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函数一次,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对象停止调用函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
/********************************************************************** 项目名称/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. 向定时调用函数传递参数
我们可以向Ticker库定时调用的函数来传递参数。不过要注意的是,传递参数的数量只能时一个。如下示例程序所示,语句ticker.attach(1, sayHi, 8)
有3个参数。其中第三个参数就是向定时调用的sayHi函数所传递的参数。
请注意:attach函数所能传递的参数最多只有一个。另外该参数仅能是以下类型中的一种:char, short, int, float, void*, char*。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : c_parameter 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20200703 程序目的/Purpose : 本程序旨在演示如何向Ticker库定时调用函数来传递参数。 请注意:attach函数所能传递的参数最多只有一个。 另外该参数仅能是这些类型中的一种:char, short, int, float, void*, char* 如需了解本程序的详细说明,请参考以下函数: 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; 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对象。
接下来我们使用buttonTicker.attach_ms(100, buttonCheck)
来实现第二个Ticker对象的任务处理。这里我们使用了attach_ms函数,该函数与attach函数功能相似,唯一区别是。attach函数的时间单位是秒,而attach_ms的时间单位是毫秒。也就是说,这条语句将会让ESP8266每隔100毫秒执行一次buttonCheck函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : d_multi_ms 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20200703 程序目的/Purpose : 本程序旨在演示如何使用多个Ticker对象来让ESP8266处理多个任务。 如需了解本程序的详细说明,请参考以下函数: 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 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库时,定时调用函数必须要很快的执行完毕。否则会产生难以预料的问题。
这就产生了一个问题。假如我们需要ESP8266定时执行的操作较为复杂,这该如何是好呢?
假设我们让ESP8266定时向example.com网站服务器发送一个http请求,并且将服务器响应通过串口监视器显示出来。(如您对这一操作尚不了解,请参考《零基础入门学用物联网教程》第3-4-1节中的示例1。)
这个问题的答案就在以下示例程序中。在这段示例程序里,我们建立了一个计数变量count。在程序的第55到第59行中,Ticker定时调用的函数tickerCount仅仅对count变量进行自加。
当计数变量count达到我们需要的数值后,则让ESP8266执行较为复杂的函数。这一点是通过程序的第49到52行逻辑判断语句所实现的。
请注意,在每一次执行完操作后,我们都需要对count变量进行清零。否则程序将无法定时通过互联网向服务器发送请求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
/********************************************************************** 项目名称/Project : 零基础入门学用物联网 程序名称/Program name : e_timer_http 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : CYNO朔 日期/Date(YYYYMMDD) : 20200703 程序目的/Purpose : 本程序旨在演示如何使用计数器来控制ESP8266定时执行较复杂的函数。Ticker定时调用的函数必须要“短小精悍”。 而不能是复杂且占用时间较长的函数。对于较为复杂的函数,我们可以使用计数器的方法来实现。 本程序将会定时让ESP8266向example网络服务器发送请求,并且将服务器响应信息显示在屏幕中。 如需了解本程序的详细说明,请参考以下函数: 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> #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!"); } |