0 前言
使用这两个函数主要是为了多任务处理,可是在ESP8266使用MsTimer2库时会出错。
1 MsTimer2使用方法
使用MsTimer2库函数做多件任务
/// 利用 MsTimer2 定时做三件事
#include <MsTimer2.h>
const int intA = 250; //每 250 ms 做一次 myJobOne
const int intB = 250; // 每 250 ms 做一次 myJobTwo
int int38 = 1000; // 每 1 秒做一次 myJob666; 没规定说必须用 const : -)
int led2 = 8; // pin 8
int led3 = 7; // pin 7
const int INTERVAL = 1; // 0.001 秒 = 1ms
void ggyy( ) {
static unsigned int gy = 0;
++gy;
if( gy % intA == 0) myJobOne( );
if( gy % intB == 0) myJobTwo( );
if( gy % int38 == 0) myJob666( );
}
void setup( ) {
pinMode(13, OUTPUT);
pinMode(led2, OUTPUT); pinMode(led3, OUTPUT);
MsTimer2::set(INTERVAL, ggyy); // INTERVAL ms
MsTimer2::start( );
}
void loop( ) {
// 这次 loop( ) 内故意甚么都不写
}
void myJobOne( ) {
static int gy = 0;
gy = 1- gy; // toggle 0, 1
digitalWrite(13, gy); // pin 13 LED
}
void myJobTwo( ) {
static int gy = 1; // 故意与 myJobOne 内gy不同 !
gy = 1- gy; // toggle 0, 1
digitalWrite(led2, gy); // pin 8 LED
}
void myJob666( ) {
static int gy = 0;
gy = 1- gy; // toggle 0, 1
digitalWrite(led3, gy); // pin 7 LED
}
2 millis()使用方法
经典例程:使用millis()函数控制Arduino开发板内置LED的点亮和熄灭。
unsigned long previousBlinkTime;
int blinkInterval = 1000; //LED闪烁时间间隔
bool toggle;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
unsigned long currentMillis = millis(); // 获取当前时间
millisBlink(currentMillis);
}
void millisBlink(unsigned long currentTime) {
//检查是否到达时间间隔
if (currentTime - previousBlinkTime >= blinkInterval) { //如果时间间隔达到了
toggle = (toggle == 1) ? 0 : 1;
digitalWrite(LED_BUILTIN, toggle); //执行闪烁LED操作
previousBlinkTime = currentTime; // 将检查时间复位
Serial.print(F("toggle = "));Serial.println(toggle);
} else if (currentTime - previousBlinkTime <= 0) { // 如果millis时间溢出
previousBlinkTime = currentTime;
}
}
同时做两件事,例程
//Super Simple Timer, 2 jobs
const long aaEvery = 543; // 事件1的间隔时间
const long bbEvery = 1357; // 事件2的间隔时间
unsigned long aaUp; // 最后刚做过 myJobOne( ) 的时间
unsigned long bbUp;
//...
void setup( ) {
//...
aaUp = millis( ); myJobOne( );
bbUp = millis( ); myJobTwo( );
//...
}
void loop( ) {
tryAA( ); // 事件1
tryBB( ); // 事件2
//... 其他事
//...
}
void tryAA( ) {
if(millis( ) - aaUp < aaEvery) return; // 时间1未到
aaUp = millis( ) ;
myJobOne( ); // 时间到
}
void myJobOne( ) {
//时间到后应执行的函数
}
void tryBB( ) {
if(millis( ) - bbUp < bbEvery) return; //时间2未到
bbUp = millis( );
myJobTwo( );
}
void myJobTwo( ) {
//... your Job 2
}[/mw_shl_code]