最近用Arduino做了一个简单的多个传感器组合的实验,比较简单,设想的应用场景是火灾检测。如下图所示:

在这里插入图片描述

一、实验材料

MQ-2烟雾传感器、5路火焰传感器、CO一氧化碳传感器,无源蜂鸣器、LED灯、arduino mega开发板、面包板以及杜邦线若干。

二、功能说明

设想在一个火灾场景中,当检测到火焰时,火焰触感器检测并触发蜂鸣器报警和LED警示灯亮,当一氧化碳浓度超标或检测到烟雾,蜂鸣器响。我用LED代替了电推杆,设想是电推杆触动灭火装置。

三、程序设计

/*
  多传感器 MQ-2烟雾、CO一氧化碳、火焰传感器、警报器、电推杆的使用  
*/
#include <Arduino.h>

#define smogSensor_AO A0   //烟雾传感器引脚
#define smogSensor_DO A3   
#define COSensor_AO 30     //一氧化碳CO传感器引脚
#define COSensor_DO 31

int pinBuzzer_led = 12;  //报警器引脚
int fire_sensor1 = 2;    //5个火焰传感器引脚
int fire_sensor2 = 3;
int fire_sensor3 = 4;
int fire_sensor4 = 5;
int fire_sensor5 = 6;
int outPusher    = A2;   //电推杆输出引脚
unsigned int smogsensorValue = 0;  //烟雾传感器值
unsigned int cosensorValue = 0;    //CO传感器值

void setup()
{
  pinMode(smogSensor_DO, INPUT);
  pinMode(smogSensor_AO, INPUT);
  pinMode(COSensor_DO, INPUT);
  pinMode(COSensor_AO, INPUT);
  
  //火焰传感器5个引脚+电推杆+警报器
  pinMode(fire_sensor1,INPUT);  
  pinMode(fire_sensor2,INPUT); 
  pinMode(fire_sensor3,INPUT); 
  pinMode(fire_sensor4,INPUT); 
  pinMode(fire_sensor5,INPUT); 
  pinMode(outPusher,OUTPUT); 
  pinMode(pinBuzzer_led,OUTPUT);
  Serial.begin(9600);
}

void loop()
{   
  //MQ-2烟雾传感器,检测值大于10,触发后警报器响
  smogsensorValue = analogRead(smogSensor_AO);
  Serial.print("MQ-2烟雾传感器smogSensor_AO Value = ");
  Serial.println(smogsensorValue);
  delay(2000);
  if(smogsensorValue>10)   
    { 
      Serial.print("检测危险!MQ-2烟雾传感器smogSensor_AO Value = ");
      Serial.println(smogsensorValue);
      onAlarm();
     }

  //CO一氧化碳传感器,检测值大于350,触发后警报器响灯闪,阈值可更改  
  cosensorValue = analogRead(COSensor_AO);
  Serial.print("CO一氧化碳传感器COSensor_AO Value = ");
  Serial.println(cosensorValue);
  delay(2000);
  if(cosensorValue>350)   
    { 
      Serial.print("检测危险!CO一氧化碳传感器COSensor_AO Value = ");
      Serial.println(cosensorValue);
      onAlarm();
    }

  //火焰传感器,检测到火焰,触发后警报器响灯闪+电推杆打开
  if (digitalRead(fire_sensor1)) {onAlarm();ePusher();}
  else if(digitalRead(fire_sensor2)) {onAlarm();ePusher();}
  else if(digitalRead(fire_sensor3)) {onAlarm();ePusher();}
  else if(digitalRead(fire_sensor4)) {onAlarm();ePusher();}
  else if(digitalRead(fire_sensor5)) {onAlarm();ePusher();}
}

//触发报警器/无源蜂鸣器的函数
void onAlarm()
{
  long frequency=200;
  tone(pinBuzzer_led,frequency);
  delay(1000);
  noTone(pinBuzzer_led);
  delay(1000);
  Serial.print("警报响!");
}

//触发电推杆的函数,只用在火焰传感器
void ePusher()
{
    digitalWrite(A2,HIGH);
    delay(2000);
}