#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// 引脚定义
#define FLAME_SENSOR A0
#define TEMP_SENSOR 2
#define SERVO_PIN 9
#define FAN_EN 10
#define FAN_IN1 11
#define FAN_IN2 12
#define BUZZER 8
#define LED 13
// 阈值定义
#define TEMP_THRESHOLD 50 // 温度阈值(℃)
#define FLAME_THRESHOLD 500 // 火焰阈值
Servo myServo;
OneWire oneWire(TEMP_SENSOR);
DallasTemperature tempSensor(&oneWire);
int currentAngle = 90; // 舵机初始位置
bool fireDetected = false;
void setup() {
pinMode(FLAME_SENSOR, INPUT);
pinMode(FAN_EN, OUTPUT);
pinMode(FAN_IN1, OUTPUT);
pinMode(FAN_IN2, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(LED, OUTPUT);
myServo.attach(SERVO_PIN);
myServo.write(currentAngle);
tempSensor.begin();
Serial.begin(9600);
}
void loop() {
// 读取温度
tempSensor.requestTemperatures();
float tempC = tempSensor.getTempCByIndex(0);
// 温度超过阈值时开始扫描火焰
if(tempC > TEMP_THRESHOLD) {
scanForFire();
} else {
if(fireDetected) {
stopFireFighting();
}
delay(1000);
}
}
void scanForFire() {
int maxFlameValue = 0;
int maxFlameAngle = currentAngle;
// 扫描-90度到+90度范围
for(int angle = 0; angle <= 180; angle += 10) {
myServo.write(angle);
delay(300);
int flameValue = analogRead(FLAME_SENSOR);
Serial.print("Angle: ");
Serial.print(angle);
Serial.print(", Flame: ");
Serial.println(flameValue);
if(flameValue > maxFlameValue) {
maxFlameValue = flameValue;
maxFlameAngle = angle;
}
}
// 如果检测到火焰
if(maxFlameValue > FLAME_THRESHOLD) {
myServo.write(maxFlameAngle);
startFireFighting();
fireDetected = true;
} else if(fireDetected) {
stopFireFighting();
}
}
void startFireFighting() {
// 启动风扇
digitalWrite(FAN_IN1, HIGH);
digitalWrite(FAN_IN2, LOW);
analogWrite(FAN_EN, 255);
// 启动报警
digitalWrite(LED, HIGH);
tone(BUZZER, 1000);
Serial.println("Fire detected! Starting fire fighting!");
}
void stopFireFighting() {
// 关闭风扇
digitalWrite(FAN_IN1, LOW);
digitalWrite(FAN_IN2, LOW);
analogWrite(FAN_EN, 0);
// 关闭报警
digitalWrite(LED, LOW);
noTone(BUZZER);
fireDetected = false;
Serial.println("Fire extinguished.");
}
}