本帖最后由 江洋小道 于 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]
|