简述
利用Arduino UNO板制作火灾报警器。三个按键代替烟感传感器,温感传感器和紫外线传感器。三个不同颜色的灯代表三个传感器的检测状态。如果检测到有烟,温度过高或紫外线过强,则灯亮。为了防止误判,只有当两个及以上的传感器检测到火灾状态时才报警。
期待结果
按下相应按键后相应灯亮,如果同时按下两个及以上,则相应灯亮且蜂鸣器报警。
代码
int smoke = 8;//烟感检测器
int temperature=9;//温感检测器
int uv=10;//紫外线检测器
int smokeLight=3;//烟感报警灯
int temperatureLight=4;//温感报警灯
int uvLight=5;//紫外线报警灯
int beep=2;//蜂鸣器
int counter=0;//计数已经检测到的探测器个数
int smokeLastState = 1;//烟感前次状态
int temperatureLastState=1;//温感前次状态
int uvLastState=1;//紫外线前次状态
int smokeState = 0;//烟感实时状态
int temperatureState=0;//温感实时状态
int uvState=0;//紫外线实时状态
void setup() {
// 把三个检测器的模式设为输入,拉上模式,实践检测出PULLUP时按钮的状态会是1
pinMode(smoke,INPUT_PULLUP);
pinMode(temperature,INPUT_PULLUP);
pinMode(uv,INPUT_PULLUP);
//三个灯 输出模式
pinMode(smokeLight, OUTPUT);
pinMode(temperatureLight,OUTPUT);
pinMode(uvLight,OUTPUT);
//蜂鸣器 输出模式
pinMode(beep,OUTPUT);
Serial.begin(9600);
}
void loop() {
//先把三个灯和蜂鸣器灭掉
digitalWrite(beep,LOW);
digitalWrite(smokeLight,LOW);
digitalWrite(temperatureLight,LOW);
digitalWrite(uvLight,LOW);
Serial.println("======Start,请按按钮======");
//给人反应时间的缓冲时间
delay(5000);
//读取三个按钮的状态
smokeState = digitalRead(8);
temperatureState=digitalRead(9);
uvState=digitalRead(10);
//分别比对三个检测器现在状态和前次状态。如果不同,串口监视器输出该灯的颜色,计数器加一
if(smokeState!=smokeLastState)
{
digitalWrite(smokeLight,HIGH);
counter+=1;
Serial.println("red");
}
if(temperatureState!=temperatureLastState)
{
digitalWrite(temperatureLight,HIGH);
counter+=1;
Serial.println("green");
}
if(uvState!=uvLastState)
{
digitalWrite(uvLight,HIGH);
counter+=1;
Serial.println("blue");
}
//判断计数器是否》=2,如果是,蜂鸣器报警,串口输出“报警!”
if(counter>=2)
{
digitalWrite(beep,HIGH);
Serial.println("报警!");
}
//如果计数器<2,蜂鸣器不报警,串口输出“不达到报警标准”
else
Serial.println("不达到报警标准");
//让实验效果呈现的缓冲时间
delay(3000);
//用于debug的
//Serial.println(smokeLastState);
//Serial.println(temperatureLastState);
// Serial.println(uvLastState);
//
// Serial.println(smokeState);
// Serial.println(temperatureState);
// Serial.println(uvState);
//将LastState恢复为1
//将counter的值还原为0
counter=0;
smokeLastState = 1;
temperatureLastState=1;
uvLastState=1;
//将三个灯灭掉
digitalWrite(‘smokeLight,LOW);
digitalWrite(temperatureLight,LOW);
digitalWrite(uvLight,LOW);
Serial.println("=====End=====");
}
参考文档
按键状态变化检测:https://www.yiboard.com/thread-594-1-1.html
按下点亮,再次按下熄灭:https://blog.csdn.net/u011303443/article/details/77415929
按下按键,LED灯点亮。放开按键,LED灯熄灭:https://www.china-scratch.com/news/1405