millis()和MsTimer2库的使用方法

本文介绍了如何在Arduino的ESP8266中使用MsTimer2库和millis()函数实现多任务处理。MsTimer2库允许以指定间隔执行多个任务,而millis()函数则用于控制LED的闪烁。示例代码展示了如何同时处理两个不同的任务,通过定时器间隔触发不同的函数来实现功能。
摘要由CSDN通过智能技术生成

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]
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值