创造声明:本文档由北溪入江流与砂砾共同协作完成
一:选题理由
1.1 市场分析
随着经济的发展,人们的生活水平提高,人们对家庭居住的环境,安全性和智能性需求越来越高,越来越多的人开始关注智能家居系统。智能家居是在互联网影响之下物联化的体现。智能家居通过物联网技术将家中的各种设备连接到一起。给用户更舒适的生活体验。衣食住行最基本的需求,而在住这一需求中,人类日常除了在公司工作外,与家庭是接触最多的,所以智能家居有极大的市场前景和用户需求。
二:题目要求
以提高家居生活的安全性、舒适度、人性化为目的,设计智能家居监控系统。
- 设计必须实现家居温度、煤气泄漏、外人闯入、火灾(烟雾)的全部检测;
- 各检测节点可通过无线方式连接到主机,检测到危险信号后,主机采用声光报警或远程报警;
- 系统具有检测灵敏、报警及时、性价比高等特点;
三:可行性分析
为实现温度检测功能,需要采用热敏传感器;为了实现煤气和烟雾等气体检测,需要采用气体检测传感器;为了实现监控外人闯入,需要采用磁控开关传感器,将磁控开关安装在门窗处,避免家里无人时外人闯入。当相关传感器触发报警信息时,需要报警系统即使响应,采用声光报警或远程报警等操作。在本系统中,主要设计热敏传感器、气体检测传感器、磁控开关传感器、报警系统等几个模块,各个传感器之间相互独立,由报警系统统一获取传感器信息进行处理,从技术角度和现实成本角度上可行性较高。
四:需求分析
无线传感器网络技术的迅速兴起与蓬勃发展,其稳定、安全、高效、经济等优点十分突出,所以其应用也十分广泛。无线传感器网络已经无处不在、与我们生活息息相关,并且渗透到生活的方方面面,如空调、VCD机、手机、微波炉、自动洗衣机及汽车电子设备等。的特点是体积较小,也就是其集成特性,其内部结构是普通计算机系统的简化,增加一些外围电路,就能够组成一个完整的小系统,无线传感器网络具有很强的可扩展性。它具有和普通计算机类似的、强大的数据处理功能,通过使用一些科学的算法,可以获得很强的数据处理能力。所以无线传感器网络在工业应用中,可以极大地提高工业设备的智能化、数据处理能力和处理效率,而且无线传感器网络无需占用很大的空间。
智能家居是在互联网影响之下物联化的体现。智能家居通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务器、影柜系统、网络家电等)连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、网络通信、信息家电、设备自动化,提供全方位的信息交互功能,甚至为各种能源费用节约资金。
智能家居是在互联网影响之下物联化的体现。智能家居最初的发展主要以灯光遥控控制、电器远程控制和电动窗帘控制为主,随着行业的发展,智能控制的功能越来越多,控制的对象不断扩展,控制的联动场景要求更高,其不断延伸到家庭安防报警、背景音乐、可视对讲、门禁指纹控制等领域,可以说智能家居几乎可以涵盖所有传统的弱电行业,市场发展前景诱人,因此和其产业相关的各路品牌不约而同加大力度争夺智能家居业务,市场渐成春秋争霸之势。
智能家居通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统)连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、网络通信、信息家电、设备自动化,提供全方位的信息交互功能,甚至为各种能源费用节约资金。可以说智能家居几乎可以涵盖所有传统的弱电行业,市场发展前景巨大。
五:概要设计
5.1 总体模块设计
5.2 系统流程图设计
5.3 数据库设计
5.3.1 数据库变量设计
智能家居监控系统数据库 | ||
---|---|---|
名称 | 类型 | 功能 |
sTempInteger | unsigned char | 温度的整数值 |
sTempDecimal | unsigned char | 温度的小数值 |
sHumidityInteger | unsigned char | 湿度的整数值 |
sHumidityDecimal | unsigned char | 湿度的小数值 |
ADCValue | unsigned int | 气体数值 |
infraredValue | unsigned int | 红外检测 |
5.4 核心算法设计
5.4.1 主函数
int main() {
xtal_init();
led_init();
// 初始化温度传感器
dht11_io_init();
uart0_init(0x00, 0x00);
// 红外传感器
P0SEL &= ~0x20; //P0_5为普通io口
P0DIR &= ~0x20; //P0_5输入
while (1) {
// 处理温度数据
cal_dht11_data();
// 处理气体数据
cal_adc_data();
cal_infrared_data();
display();
}
}
5.4.2 读取温度传感器
int read_dht11_data() {
int flag = 1;
unsigned char dat1, dat2, dat3, dat4, dat5, ck;
//主机拉低18ms
COM_CLR;
halWait(18);
COM_SET;
flag = 0;
while (COM_R && ++flag);
if (flag == 0) return 0;
//总线由上拉电阻拉高 主机延时20us
//主机设为输入 判断从机响应信号
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
flag = 0;
while (!COM_R && ++flag);
if (flag == 0) return 0;
flag = 0;
while (COM_R && ++flag);
if (flag == 0) return 0;
dat1 = dht11_read_byte();
dat2 = dht11_read_byte();
dat3 = dht11_read_byte();
dat4 = dht11_read_byte();
dat5 = dht11_read_byte();
ck = dat1 + dat2 + dat3 + dat4;
if (ck == dat5) {
sHumidityInteger = dat1;
sHumidityDecimal = dat2;
sTempInteger = dat3;
sTempDecimal = dat4;
}
return 1;
}
六:详细设计
6.1 界面设计
首行显示Smart home monitoring system,即智能家居监控系统,第二行显示温度并输出当前环境温度,第三行显示湿度并输出当前环境湿度,第四行输出气体参数,第五行输出红外线判断结果判断当前是否有人员通过。
6.2 温度检测子模块设计
搭建热敏电阻测温电路,结合CC2530将采集的电压模拟量转换为数字量,通过无线传感器网络对测温公式实时处理,进而获取到温度值。热敏电阻灵敏度较高,其电阻温度系数要比金属大10~100倍以上,能检测出10-6C的温度变化;工作温度范围宽,并且由于体积小,可以检测狭小空间的温度,灵活性强,使用方便,成本低。本次设计采用此方案,利用热敏电阻实现获取环境温度。
6.3 气体传感器
MQ-2 型可燃气体/烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式 N 型半导体。当处于200~300°C 温度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒受到该烟雾的调制而变化,就会引起表而电导率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾浓度越大,电导率越大输出电阻越低。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。因此可通过读取可燃气体/烟雾传感器的输出信号,经 ADC 转换在串口显示。当检测到附近有可燃气体时,ADC 转换的值发生变化。以此实现判断是否有火灾,并传递相关信号到软件的目的。
6.4 红外线检测子模块设计
普通人体会发射10um 左右的特定波长红外线,用专门设计的传感器就可以针对性的检测这种 红外线的存在与否,当人体红外线照射到传感器上后,因热释电效应将向外释放电荷,后续电路经 检测处理后就能产生控制信号。,通过检测 IO 口值的变化来读取人体红外传感器的控制信号。当检测到有人体活 动时, 输入的 IO 值发生变化。当传感器模块检测到有人入侵时,会返回一个IO 口的控制信号,读取IO 口的状态判断是否有人体活动,在本系统中利用红外传感器获得是否有外人闯入的信号,并将信号存入变量中在软件部分控制报警装置,实现红外检测外人闯入的功能。
七:编码与测试
7.1 编码
#include <stdio.h>
#include <ioCC2530.h>
#include "dht11.h"
#include "sys_init.h"
#include "uart.h"
#include "hal_mcu.h"
#include "hal_assert.h"
#include "hal_board.h"
#include "hal_rf.h"
#include "basic_rf.h"
// 温度
unsigned char sTempInteger;
unsigned char sTempDecimal;
// 湿度
unsigned char sHumidityInteger;
unsigned char sHumidityDecimal;
// ADC
unsigned int ADCValue;
// 红外线
unsigned int infraredValue;
#define RF_CHANNEL 25 // 2.4 GHz RF channel
#define PAN_ID 0x1020
#define SEND_ADDR 0x2530
#define RECV_ADDR 0x2520
#define NODE_TYPE 0 //0:接收节点,1:发送节点
static basicRfCfg_t basicRfConfig;
// 向服务器发送数据
void send_data() {
// 发送的字符数组内容
uint8 pTxData[] = {'A', 'L', 'E', 'R', 'T', '\n'};
uint8 ret;
printf("send node start up...\r\n");
// Keep Receiver off when not needed to save power
// 关闭接收器以节省电源
basicRfReceiveOff();
// Main loop
while (TRUE) {
// 发送数据包——发送pTxData数据到RECV_ADDR
ret = basicRfSendPacket(RECV_ADDR, pTxData, sizeof pTxData);
if (ret == SUCCESS) {
// 发送成功
// P1_0灯亮
hal_led_on(1);
// 等待100ms
halMcuWaitMs(100);
// P1_0灯灭
hal_led_off(1);
// 等待900ms
halMcuWaitMs(900);
} else {
// 发送失败
// P1_0灯亮
hal_led_on(1);
// 等待1000ms
halMcuWaitMs(1000);
// P1_0灯灭
hal_led_off(1);
}
}
}
// 报警
void alarm() {
// 蜂鸣器响
// 向服务器发送数据
halMcuInit();
hal_led_init();
hal_uart_init();
if (FAILED == halRfInit()) {
HAL_ASSERT(FALSE);
}
// Config basicRF
basicRfConfig.panId = PAN_ID;
basicRfConfig.channel = RF_CHANNEL;
basicRfConfig.ackRequest = TRUE;
basicRfConfig.myAddr = SEND_ADDR;
if (basicRfInit(&basicRfConfig) == FAILED) {
HAL_ASSERT(FALSE);
}
send_data();
}
// 温度传感器
// 读取温度传感器
int read_dht11_data() {
int flag = 1;
unsigned char dat1, dat2, dat3, dat4, dat5, ck;
//主机拉低18ms
COM_CLR;
halWait(18);
COM_SET;
flag = 0;
while (COM_R && ++flag);
if (flag == 0) return 0;
//总线由上拉电阻拉高 主机延时20us
//主机设为输入 判断从机响应信号
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
flag = 0;
while (!COM_R && ++flag);
if (flag == 0) return 0;
flag = 0;
while (COM_R && ++flag);
if (flag == 0) return 0;
dat1 = dht11_read_byte();
dat2 = dht11_read_byte();
dat3 = dht11_read_byte();
dat4 = dht11_read_byte();
dat5 = dht11_read_byte();
ck = dat1 + dat2 + dat3 + dat4;
if (ck == dat5) {
sHumidityInteger = dat1;
sHumidityDecimal = dat2;
sTempInteger = dat3;
sTempDecimal = dat4;
}
return 1;
}
// 处理温度
int cal_dht11_data() {
int result = read_dht11_data();
if (result == 1) {
// 00101101B = 45D
char temp_flag = 0b00101101;
if (sTempInteger >= temp_flag) {
// 报警
alarm();
halWait(250); // 延时
D7 = !D7; // 标志发送状态
halWait(250);
halWait(250);
return 1;
}
} else {
halWait(250); // 延时
D7 = !D7; // 标志发送状态
halWait(250);
halWait(250);
return 0;
}
}
// 气体检测传感器
unsigned int getADC(void) {
unsigned int value;
P0SEL |= 0x02;
ADCCON3 = (0xB1); // 选择AVDD5为参考电压;12分辨率;P0_1 ADC
ADCCON1 |= 0x30; // 选择ADC的启动模式为手动
ADCCON1 |= 0x40; // 启动AD转化
while (!(ADCCON1 & 0x80)); // 等待ADC转化结束
value = ADCL >> 2;
value |= (ADCH << 6); // 取得最终转化结果,存入value中
return ((value) >> 2);
}
int cal_adc_data() {
unsigned int adc = getADC();
ADCValue = adc;
// 01000110B = 70D
char adc_flag = 0b01000110;
if (adc >= adc_flag) {
// 报警
alarm();
}
halWait(250); // 延时
D7 = !D7; // 标志发送状态
halWait(250);
halWait(250);
}
// 红外传感器
void cal_infrared_data() {
char Str[10];
int value;
value = P0_5;
infraredValue = value;
if (value == 1) {
alarm();
}
halWait(250); // 延时
D7 = !D7; // 标志发送状态
halWait(250);
halWait(250);
}
void display() {
printf("temperature:%c.%c", sTempInteger, sTempDecimal);
printf("humidity:%c.%c", sHumidityInteger, sHumidityDecimal);
printf("ADCValue:%u", ADCValue);
printf("infraredValue:%u", infraredValue);
}
int main() {
xtal_init();
led_init();
// 初始化温度传感器
dht11_io_init();
uart0_init(0x00, 0x00);
// 红外传感器
P0SEL &= ~0x20; //P0_5为普通io口
P0DIR &= ~0x20; //P0_5输入
while (1) {
// 处理温度数据
cal_dht11_data();
// 处理气体数据
cal_adc_data();
cal_infrared_data();
display();
}
}
7.2 测试
根据上述方案,基于软件搭建电路,对所设计的系统进行仿真。如图所示,环境温度为28.5度时,煤气浓度为51%,烟雾浓度为62%时,采集到的数据为温度25.0度,煤气浓度为47.8%,烟雾浓度为61.9%。此时,系统通过P2P模块进行数据的传输,并且系统检测到煤气浓度和烟雾浓度异常,开启报警系统。