极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13519|回复: 1

Arduino无线烟雾报警系统

[复制链接]
发表于 2016-8-22 17:55:11 | 显示全部楼层 |阅读模式
本帖最后由 江洋小道 于 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】程序

[pre lang="arduino" line="1" file="发送端"]

#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[ROWS][COLS] =
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {2,3,4,5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {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);  
}
}[/code]



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


【4.2】接线图


【4.3】程序
[pre lang="arduino" line="1" file="接收端"]

#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();
  }
}[/code]


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-8-23 09:51:27 | 显示全部楼层
不错的设计,要是能把315模块换成蓝牙或2.4G就更好了(加大传输距离)。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 01:24 , Processed in 0.039294 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表