使用 arduino R3开发板实现多线程的定时控制

多线程

        采用多线程可以实现多个任务同时执行,比如想让一个任务1执行15s,如果不采用多线程,后续任务(任务2)必须等待,任务一完成才能继续执行,多线程可以解决该问题。

定时器

         通过调用库函数,获取首次进入线程的时间,开始计时,经过xx时间后,执行后续任务

使用到的设备

arduino开发板

 Esp8266网络模块

 编码部分

需要引入库<SCoop.h>

可以参考这篇文章 线程库下载

代码

#include <SCoop.h>
#define LED2 3

unsigned long startTime;  //开始时间
unsigned long elapsedTime; //时间差值
unsigned long currentTime; //当前时间

String Str = "";
bool isTaskOneRunning = false; //线程1是否启用
bool first = false; //是否为第一次进入线程1

defineTask(TaskOne);		// 创建子线程1
void TaskOne::setup(){		// 线程1设定
 	pinMode(LED2,OUTPUT);
}
void TaskOne::loop(){		//线程1循环
  if(isTaskOneRunning == true && first == true)
  {
    startTime = millis(); 
    first = false;
  }
  if(isTaskOneRunning)
  {
    currentTime = millis();
    elapsedTime = currentTime - startTime; // 计算时间差
    if (elapsedTime < 15000) {
      digitalWrite(LED2,HIGH);
    } 
    else {     //超时自动停止
       isTaskOneRunning = false;
       digitalWrite(LED2,LOW);
    }
  }
  else
  {
     digitalWrite(LED2,LOW);
  }
}


void setup() {
  Serial.begin(9600);//打开串口波特率9600
	mySCoop.start();
}

void loop() {
   if(Serial.available()>0)
    {
      Str = Serial.readStringUntil('\n');
    
       if (Str == "Open") {
             isTaskOneRunning = true;
             first = true;
             Str = "NULL";
          }
      if (Str == "Close") {
             isTaskOneRunning = false;
            Str = "NULL";
         }
    }
    yield();
}

实现效果:

通过8266向开发板发送“Open”命令,可使 线程1 执行15S(将引脚3 连接小灯,小灯将亮15s),

在线程1 执行时,通过8266向开发板发送“Close”命令,可提前关闭线程1(将小灯关闭)

解释:

函数millis()获取当前系统运行的毫秒数。

1.为什么使用变量 isTaskOneRunning 

答:很直白的说,我没找到结束线程的函数,,,,通过将变量isTaskOneRunning 设为true,则启用线程,设为false,结束线程。

2.为什么使用变量 first

答:获取第一次进入线程的时间(startTime),然后开始计时,用currentTime 不断获取当前时间,与第一次进入线程时间相减的差值若大于15s,则结束线程。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值