arduino通过thread库构建带保护机制的风扇控制项目 近场控制:电位器调风扇转速 远场控制:红外遥控器调控风扇转速(三档和暂停) 急停保护:超声波测距关闭风扇 把风扇转速分3档位(低中高)的代码
时间: 2024-02-07 18:03:11 浏览: 32
以下是使用 Thread 库在 Arduino 中实现带保护机制的风扇控制项目的代码,包括近场控制、远场控制和急停保护。此外,该代码还实现了将风扇转速分为三档位(低、中、高)的功能。
```C++
#include <Thread.h>
const int fanPin = 9;
const int potPin = A0;
const int irPin = 11;
const int trigPin = 3;
const int echoPin = 2;
const int safetyDistance = 30;
int fanSpeed = 0;
bool isStopped = false;
int fanState = 1;
void controlFanNear() {
while (true) {
int newSpeed = analogRead(potPin);
fanSpeed = map(newSpeed, 0, 1023, 0, 255);
delay(10); // 避免频繁刷新
}
}
void controlFanFar() {
while (true) {
long irCode = 0;
if (irrecv.decode(&results)) {
irCode = results.value;
irrecv.resume();
}
switch (irCode) {
case 0xFF629D: // "1"键,低速档
fanState = 1;
break;
case 0xFFE21D: // "2"键,中速档
fanState = 2;
break;
case 0xFF22DD: // "3"键,高速档
fanState = 3;
break;
case 0xFF02FD: // "0"键,暂停
fanState = 0;
break;
}
delay(10); // 避免频繁刷新
}
}
void ultrasonicSafety() {
while (true) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
int distance = duration * 0.034 / 2;
if (distance > safetyDistance) {
isStopped = true;
} else {
isStopped = false;
}
delay(10); // 避免频繁刷新
}
}
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(fanPin, OUTPUT);
Thread nearThread = Thread(controlFanNear);
Thread farThread = Thread(controlFanFar);
Thread ultrasonicThread = Thread(ultrasonicSafety);
nearThread.onRun();
farThread.onRun();
ultrasonicThread.onRun();
irrecv.enableIRIn();
}
void loop() {
switch (fanState) {
case 0:
analogWrite(fanPin, 0);
break;
case 1:
analogWrite(fanPin, fanSpeed / 3);
break;
case 2:
analogWrite(fanPin, fanSpeed * 2 / 3);
break;
case 3:
analogWrite(fanPin, fanSpeed);
break;
}
if (isStopped) {
analogWrite(fanPin, 0);
}
}
```
该代码中,近场控制使用电位器读取风扇转速,并将其映射到 0-255 的 PWM 值上。远场控制使用红外遥控器读取命令,并根据命令将风扇转速设置为低速、中速、高速或暂停。急停保护使用超声波传感器检测到距离超出安全范围时,将关闭风扇。
在主循环中,根据当前的风扇状态将 PWM 值设置为相应的值。如果急停保护触发,则将 PWM 值设置为零以关闭风扇。