Arduino 不支持线程。但是,您可以做次优的事情,并围绕以交错运行的状态机构建代码。
虽然有很多方法可以将任务实现为状态机,但我推荐这个库 (https://github.com/Elidio/StateMachine)。这个库抽象了大部分过程。
你可以像这样创建一个状态机:
#include "StateMachine.h"
class STATEMACHINE(Blink) {
private:
int port;
int waitTime;
CREATE_STATE(low);
CREATE_STATE(high);
void low() {
digitalWrite(port, LOW);
*this << &STATE(high)<< waitTime;
}
void high() {
digitalWrite(port, HIGH);
*this << &STATE(low)<< waitTime;
}
public:
Blink(int port = 0, int waitTime = 0) :
port(port),
waitTime(waitTime),
INIT_STATE(low),
INIT_STATE(high)
{
pinMode(port, OUTPUT);
*this << &STATE(low);
}
};
宏STATEMACHINE()抽象类继承,宏CREATE_STATE()抽象状态包装器创建,宏INIT_STATE()抽象方法包装,宏STATE()抽象状态机类中的状态包装器引用。
状态转换由状态机类和状态之间的<< 运算符抽象,如果您想要延迟状态转换,您所要做的就是将该运算符与一个整数一起使用,其中整数是延迟以毫秒为单位。
要使用状态机,首先你必须实例化它。在设置函数上使用new 实例化它时在全局空间中声明对类的引用可能会解决问题
Blink *led1, *led2, *led3;
void setup() {
led1 = new Blink(12, 300);
led2 = new Blink(11, 500);
led3 = new Blink(10, 700);
}
然后你在循环中运行状态。
void loop() {
(*led2)();
(*led1)();
(*led3)();
}