多线程
采用多线程可以实现多个任务同时执行,比如想让一个任务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,则结束线程。