ESP8266多任务处理 – Ticker库使用说明

ESP8266在运行过程中,只能一条线式的依次执行任务。但是我们在开发物联网项目时,可能需要ESP8266在执行某一任务的过程中,还能处理其它任务。比如,我们使用ESP8266来控制电机运行的同时,还需要定时检查某一个引脚上连接按钮有没有被用户按下。

为了解决以上问题,我们可以使用Ticker库来解决这一问题。下面我们来通过一系列示例程序向您讲解Ticker库的使用方法。

示例1. Ticker库基本操作

利用Ticker库,我们可以让ESP8266定时调用某一个函数。通过以下示例程序我们可以看到,ESP8266将会每隔一秒钟通过串口监视器输出一次信息。我们是通过语句ticker.attach(1, sayHi)来实现这一操作的。

该语句中的attach函数有两个参数。第一个参数可控制调用函数的时间间隔,单位是秒。这里的数字1说明ESP8266将会每隔一秒钟调用一次函数。那么具体调用哪一个函数呢?这个函数名称正是是通过第二个参数来限定的。也就是名称为sayHi的函数。该函数将会让ESP8266定时通过串口监视器输出一次信息。信息内容是“Hi”后面跟一个数值。这个数值是为了标注sayHi函数被调用了多少次。

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

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

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

我们可以向Ticker库定时调用的函数来传递参数。不过要注意的是,传递参数的数量只能时一个。如下示例程序所示,语句ticker.attach(1, sayHi, 8)有3个参数。其中第三个参数就是向定时调用的sayHi函数所传递的参数。

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

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

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

接下来我们使用buttonTicker.attach_ms(100, buttonCheck)来实现第二个Ticker对象的任务处理。这里我们使用了attach_ms函数,该函数与attach函数功能相似,唯一区别是。attach函数的时间单位是秒,而attach_ms的时间单位是毫秒。也就是说,这条语句将会让ESP8266每隔100毫秒执行一次buttonCheck函数。

示例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变量进行清零。否则程序将无法定时通过互联网向服务器发送请求。