江洋小道 发表于 2016-8-22 17:55:11

Arduino无线烟雾报警系统

本帖最后由 江洋小道 于 2016-8-22 18:04 编辑

【1】功能

发送端将检测的空气中的温湿度和烟雾浓度显示到自身的LCD液晶屏上,并通过315M无线模块,将数据传输到接收端,显示在接收端的LCD屏上,同时可在发送端通过矩阵键盘设定报警阈值,当空气中烟雾浓度达到某个指标时可控制继电器工作,蜂鸣器警报。

【2】总接线图


【3】发送端

【3.1】原件清单
Arduino nano开发板*1
DHT11温湿度传感器*1
MQ-2烟雾传感器*1
继电器*1
1602LCD液晶屏*1
I2C转接口*1
315M发送模块*1
矩阵键盘*1
电阻*1
按键开关*1
供电(数据线、电池、DC电源插头等)

【3.2】接线图


【3.3】程序



#include <Wire.h>
#include <LiquidCrystal_I2C.h>    //LCD库文件
#include <RCSwitch.h>             //无线模块库文件
#include <dht11.h>                //DHT11库文件
#include <Keypad.h>               //矩阵键盘库文件


dht11 HT;   // 注意現在 HT 代表 DHT11 傳感器
const int pin = 12;// 把 DHT11 的 data pin 連到 arduino Pin 12
const int jidianqi = 13;//设置继电器的控制数字引脚
const int kai = 11;

LiquidCrystal_I2C lcd(0x27, 16, 2);   //屏幕设置
RCSwitch mySwitch = RCSwitch();    //发送模块设置

//矩阵键盘设置
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char hexaKeys =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins = {2,3,4,5}; //connect to the row pinouts of the keypad
byte colPins = {6,7,8,9}; //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

long key = 0;//记录键盘键入的值
long yuzhi = 1000;       //定义阈值,传输到接收端控制预警值


void setup() {

Serial.begin(9600);
pinMode(jidianqi,OUTPUT);       //设置继电器引脚为输出模式
pinMode(kai,INPUT);

//无线模块连接
mySwitch.enableTransmit(10);    //315M发送模块接到Pin #10

//初始化LCD屏
lcd.begin();                  // initialize the lcd
lcd.backlight();
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Welcome");

}

void loop() {
if(digitalRead(kai)==LOW)
{

      //矩阵键盘
      int customKey = int(customKeypad.getKey());
if(customKey ==48||customKey ==49||customKey ==50||customKey ==51||customKey ==52||customKey ==53||customKey ==54||customKey ==55||customKey ==56||customKey ==57)
      {
                key = key * 10 + long((customKey-48));
    }
      
if(customKey ==65)      //A的ASCII码为68
    {
                key = 1000;            //当A被按下时KEY为默认值1000   
    }
      
if(customKey ==68)      //D的ASCII码为68
    {
      Serial.println(key);       //当D被按下时输出输入的值
      lcd.clear();
      lcd.setCursor(5,0);
      lcd.print("yuzhi");//
                lcd.setCursor(5,1);
                lcd.print(key);//
                yuzhi = key;               //用阈值来记录(以免下面key将清零)
      key = 0;
    }
}

if(digitalRead(kai)==HIGH)
{
    int val;    //记录烟雾传感器的数值
    val=analogRead(0);   //烟雾传感器模拟口接A0
      
    HT.read(pin);// 读取 DHT11 传感器
   
      
      //数值读取,串口显示
    Serial.print(String("") + "Humidity = "+ HT.humidity + " %");
    Serial.println(String("")+", temperature = "+ HT.temperature +" °C");
    Serial.println(val,DEC);
    delay(1500);
      
      //数值显示
      lcd.setCursor(0,0);
      lcd.print(String("") + " H:"+ HT.humidity + " % ");//显示湿度
      
      lcd.setCursor(8,0);
      lcd.print(String("")+" T:"+ HT.temperature +" 'C");         //显示温度
      
      lcd.setCursor(0,1);
      lcd.print(String("") +"Q:"+ val+" ppm");         //显示烟雾浓度

      lcd.setCursor(10,1);
      lcd.print(String("") +"("+ yuzhi+ ")    ");         //
      
      //控制继电器
      if(val > yuzhi)    //为方便观察现象,设置的警戒值较低
                digitalWrite(jidianqi,HIGH);   //若超出警戒值,继电器控制的风扇或者水龙头工作(根据情况接常开还是常闭)
      else
                digitalWrite(jidianqi,LOW);
      
      //数值传输
                mySwitch.send(HT.humidity,24);      //湿度
                        delay(1000);
                mySwitch.send(HT.temperature,23);   //温度
                        delay(1000);
                mySwitch.send(val,22);                //烟雾浓度
                        delay(1000);
                mySwitch.send(yuzhi,21);   //传输预警值*************
                        delay(1000);
}
}


【4】接收端
【4.1】原件清单
Arduino nano开发板*1
1602LCD液晶屏*1
I2C转接口*1
315M接收模块*1
蜂鸣器*1
LED小灯*3
供电(数据线、电池、DC电源插头等)


【4.2】接线图


【4.3】程序


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RCSwitch.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);       //设置LCD屏的显示格式
RCSwitch mySwitch = RCSwitch();
int GLED = 10;   //绿灯指示数值正常
int YLED = 8;   //黄灯指示烟雾浓度过大
int RLED = 6;    //红灯指示温度过高
int buzzer=4;    //设置控制蜂鸣器的数字IO脚
long yuzhi = 1000;   //用来记录报警的阈值(默认值为1000)

int T = 1;       //用来记录温度状态,等于1时表示正常,等于0时表示超标
int Q = 1;       //用来记录烟雾浓度状态,等于1时表示正常,等于0时表示超标

void setup()
{
      Serial.begin(9600);
      mySwitch.enableReceive(0);//无线传输模块 Receiver on interrupt 0 => that is pin #2 接2号数字口
   
    //初始化LCD屏
    lcd.begin();                  // initialize the lcd
    lcd.backlight();
    lcd.clear();
    lcd.setCursor(5,0);
    lcd.print("Welcome");
      
      //设置数字IO脚模式,均为输出
      pinMode(buzzer,OUTPUT);
      pinMode(GLED, OUTPUT);
      pinMode(YLED, OUTPUT);
      pinMode(RLED, OUTPUT);
}

void loop() {
    if (mySwitch.available()) {
   
    int value = mySwitch.getReceivedValue();
   
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
                //串口显示
      Serial.print("Received ");
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );
      
          //获取值***********************************************************
          //获取空气湿度
          if(mySwitch.getReceivedBitlength() == 24)
          {
                lcd.setCursor(0,0);
                lcd.print(String("") + " H:"+ value + " % ");
          }
         
          //获取空气温度
          if(mySwitch.getReceivedBitlength() == 23)
          {
                lcd.setCursor(8,0);
                lcd.print(String("")+" T:"+ value +" 'C");
                if(value>50)
                        T = 0;
                else T = 1;         //记录温度状态
          }
         
          //获取烟雾浓度
          if(mySwitch.getReceivedBitlength() == 22)
          {
                lcd.setCursor(0,1);
                lcd.print(String("") +"Q:"+ value+" ppm");
                if(value>yuzhi)
                        Q = 0;
                else Q = 1;         //记录烟雾浓度状态
          }
         
          //获取阈值
          if(mySwitch.getReceivedBitlength() == 21)
          {
                  lcd.setCursor(10,1);
                        lcd.print(String("") +"("+ value+ ")    ");      //
                        yuzhi = value;
          }
         
          //*************************************************
         
          //预警*********************************************
          if(T == 1&&Q == 1)//正常时亮绿灯
          {
                digitalWrite(GLED,HIGH);
                digitalWrite(YLED,LOW);
                digitalWrite(RLED,LOW);
          }
         
          if(T == 0&&Q == 1)//温度过高时亮红灯,
          {
                digitalWrite(GLED,LOW);
                digitalWrite(YLED,LOW);
                digitalWrite(RLED,HIGH);
          }
         
          if(Q == 0&&T == 1)//烟雾浓度过高亮黄灯蜂鸣器发出警报
          {
                digitalWrite(GLED,LOW);
                digitalWrite(YLED,HIGH);
                digitalWrite(RLED,LOW);
               
             //蜂鸣器输出一个周期为100ms,频率为10HZ的声音   可自己设置频率

                        digitalWrite(buzzer,HIGH);//发声音
                        delay(50);//延时50ms
                        digitalWrite(buzzer,LOW);//不发声音
                        delay(50);//延时50ms
          }
         
          if(Q == 0&&T == 0)//烟雾浓度过高亮黄灯蜂鸣器发出警报
          {
                digitalWrite(GLED,LOW);
                digitalWrite(YLED,HIGH);
                digitalWrite(RLED,HIGH);
            

                        digitalWrite(buzzer,HIGH);//发声音
                        delay(50);
                        digitalWrite(buzzer,LOW);//不发声音
                        delay(50);
          }
      //********************************************************
         
    }
    mySwitch.resetAvailable();
}
}


asdfcgdc 发表于 2016-8-23 09:51:27

不错的设计,要是能把315模块换成蓝牙或2.4G就更好了(加大传输距离)。:):)
页: [1]
查看完整版本: Arduino无线烟雾报警系统