1、 课 程 设 计 课程名称: 嵌入式设计 设计题目: 智能家居监控系统 班 级: 20122111 学 号: 2012211127 姓 名: 指导教师:
2、 完成时间: 2015/12/9 哈尔滨工程大学教务处 制 嵌入式设计报告 智能家居监控系统 班级: 教师评语: 教师签名: 2015年12月 课程设计题目 智能家居监控系统 目的和背景 智能家居又称智能住宅,正朝着具备无线远程控制、多媒体控制、高速数据传输等功能 的方向发展,其关键技术为兼容性强的家庭控制器和满足信息传输需要的家庭网络。目前, 传输
3、网络多采用综合布线技术,限制了系统应用场所,而且费用较高,采用无线方式构建灵 活便捷的智能家居安全监控系统,成为当前的主流趋势。 目前,应用于智能家居的无线通信技术主要包括 Ir-DA 红外线技术、蓝牙技术和 Zigbee 技术等,Ir-DA 属于短距离、点对点的半双工通信方式,使用不便且失误率高,不适用于家 庭的组网方式;蓝牙技术则因为网络容量有限,成本较高,不适于节点较多的家庭网络应用。 本项目通过采用传输范围适中、安全可靠、网络容量大的 Zigbee 技术,设计智能家居 远程监控系统。 主要内容 1) 信息显示。 2) 照明控制。 3) 家电控制。 4) 入侵监测。 5)
4、 烟感监测。 6) 温度、 湿度监测。 7) 远程监控, 数据透传。 8) 选项设置。 采用的工具方法 硬件环境 1: NEUEBD-ARM 开发套件 硬件环境 2: CC2530 开发套件 软件环境: 1. UCOS2.5.1,提供 UCOS 内核构建 2. ADS1.2、 IAR7.51,提供集成开发环境 进度安排 1-2天:完成项目要求书、模块计划书、系统设计书、RTM 3-4天:完成模块概要设计、模块概要设计书、模块接口定义书、模块间 EVENT 流和数据流系统图 5-7天:完成模块详细设计 模块详细设计书 8-13天:完成模块代码 模块代码 14-16天
5、完成项目报告 参考资料 1 目的和背景 智能家居又称智能住宅,正朝着具备无线远程控制、多媒体控制、高速数据传输等功能 的方向发展,其关键技术为兼容性强的家庭控制器和满足信息传输需要的家庭网络。目前, 传输网络多采用综合布线技术,限制了系统应用场所,而且费用较高,采用无线方式构建灵 活便捷的智能家居安全监控系统,成为当前的主流趋势。 目前,应用于智能家居的无线通信技术主要包括 Ir-DA 红外线技术、蓝牙技术和 Zigbee 技术等,Ir-DA 属于短距离、点对点的半双工通信方式,使用不便且失误率高,不适用于家 庭的组网方式;蓝牙技术则因为网络容量有限,成本较高,不适于
6、节点较多的家庭网络应用。 本项目通过采用传输范围适中、安全可靠、网络容量大的 Zigbee 技术,设计智能家居 远程监控系统。 2 功能描述和模块设计 图1:智能家居监控平台示意图 1) LCD 主菜单显示 显示当前时间日期,电器开关状态,是否闹钟开启。显示用户操作菜单。显示设置菜单。 2) 照明控制 使用 LED、 AD( 1 个) 硬件资源。使用 LED 可模仿家中主要房间的照明。通过照明控制子菜单控制灯亮灭。如果开启了自动光控功能,通过 AD 采集的光照参数可实现照明的自动开关。另外可通过小键盘模拟电灯开关。 3) 家电控制 使用 LED 硬件资源。通过家电控制
7、子菜单对家中电器进行开关控制。相应家电开关信息以及闹钟是否开启都在 LCD 主菜单中有显示。通过设置菜单传递的信息可定时开关电器以及实现闹钟功能。定时时间到 LCD 屏会自动弹出提示框并且家电状态发生改变。 4) 入侵报警控制 使用红外传感器硬件资源。使用红外传感器或接近开关采集数据,判断有无人员进入室内。报警参数有默认值,也可由用户设置, 可通过设置功能完成。如遇报警,报警信息在屏幕上显示,同时发出触发蜂鸣器报警。 5) 温湿度控制 使用温湿度传感器硬件资源。使用温湿度传感器采集温湿度数据,将监测数据显示在 LCD 上。报警参数有默认值,也可由用户设置, 可通过设置功能完成。如遇
8、报警, 触发蜂鸣器动作,同时开启空调。 6) 远程监控。 终端系统将发生的事件数据定期通过 Zigbee 传输到服务器,服务器可根据实际情况进行家电设备的远端控制。 7) 设置功能 完成以下内容的设置:哪些房间采用自动控制功能。 3 系统结构 图2 系统结构图 图3 通信协议框架 图4 设计参考框架 4 代码实现 4.1模块的实现 4.1.1账户登录模块 函数名称 函数类型 概要说明 lineEditTextChanged(QString s) 模块内部函数 判断文本是否发生改变的槽函数 zeroClicked()~nineClic
9、ked() 模块内部函数 0~9的数字输入键盘 loginBtnClicked() 模块外部函数 登陆按键,进入主页面 forgrtPasswordClicked() 模块外部函数 忘记密码按键,进入密码修改页面 4.1.2主界面模块 函数名称 函数类型 概要说明 mainWidget2smartHomeAppliances() 模块外部函数 点击按钮进入智能家电模块。 mainWidget2securityWidget() 模块外部函数 点击按钮进入安防系统模块。 mainWidget2toolWidget() 模块外部函数 点击按钮进入工具
10、娱乐模块。 Back_clicked 模块外部函数 返回登陆界面。 4.1.3智能家电模块 函数名称 函数类型 概要说明 smartHomeAppliances2lightWidget() 模块外部函数 点击按钮进入灯控界面。 smartHomeAppliances2waterHeaterWidget() 模块外部函数 点击按钮进入热水器控制界面。 smartHomeAppliances2temperatureWidget() 模块外部函数 点击按钮进入空调控制界面。 smartHomeAppliances2humidityWidget() 模块外部函数
11、点击按钮进入加湿器控制界面。 smartHomeAppliances2curtainWidget() 模块外部函数 点击按钮进入窗帘控制界面。 smartHomeAppliances2televisionWidget() 模块外部函数 点击按钮进入电视控制界面 Back_clicked 模块外部函数 返回上一界面 4.1.3.1灯控模块 函数名称 函数类型 概要说明 lightTurnOn() 模块外部函数 点击按钮打开灯。 lightTurnOff() 模块外部函数 点击按钮关闭灯 Back_clicked 模块外部函数 返回上一界面
12、 4.1.3.2温度模块 函数名称 函数类型 概要说明 changeSwitch(int a) 模块内部函数 显示空调的开光状态。 addTemClicked() 模块内部函数 显示空调的温度。 addTemClicked() 模块外部函数 点击按钮发送温度加信息。 subTemClicked(); 模块外部函数 点击按钮发送温度减信息。 Back_clicked 模块外部函数 返回上一界面 4.1.3.3湿度模块 函数名称 函数类型 概要说明 showRh(int rh) 模块内部函数 显示当前湿度。 change
13、Switch(int a) 模块内部函数 显示当前开关状态。 changeOnClicked() 模块外部函数 点击按钮发送开状态。 changeOffClicked() 模块外部函数 点击按钮发送关状态。 addBtnClicked(); 模块外部函数 点击按钮发送湿度加状态。 subBtnClicked(); 模块外部函数 点击按钮发送湿度减状态。 Back_clicked 模块外部函数 返回上一界面 4.1.3.4热水器模块 函数名称 函数类型 概要说明 showTem(int tem); 模块内部函数 显示当前温度。 cha
14、ngeSwitch(int a) 模块内部函数 显示开关状态。 changeOnClicked() 模块外部函数 点击按钮发送开状态。 changeOffClicked() 模块外部函数 点击按钮发送关状态。 addBtnClicked(); 模块外部函数 点击按钮发送升高水温状态。 subBtnClicked(); 模块外部函数 点击按钮发送降低水温状态。 Back_clicked 模块外部函数 返回上一界面 4.1.3.5窗帘模块 函数名称 函数类型 概要说明 showSlider( int ti ); 模块内部函数 显示窗帘的位
15、置。 sliderValue(int a); 模块内部函数 读取窗帘的当前位置。 Back_clicked 模块外部函数 返回上一界面 4.1.3.6电视模块 函数名称 函数类型 概要说明 openTvClicked(); 模块外部函数 点击按钮发送电视开的信号。 closeTvClicked(); 模块外部函数 点击按钮发送电视关的信号 addVmeClicked(); 模块外部函数 点击按钮发送音量+信号 subVolumeClicked(); 模块外部函数 点击按钮发送音量减信号 addProgramClicked() 模块外部
16、函数 点击按钮发送节目+信号 subProgramClicked(); 模块外部函数 点击按钮发送节目-信号 Back_clicked 模块外部函数 返回上一界面 4.1.4安防模块 函数名称 函数类型 概要说明 securityWidget2infraredWidget(); 模块外部函数 点击按钮进入红外报警。 security2LockWidget(); 模块外部函数 点击按钮进入远程控制门锁 security2SmokeWidget(); 模块外部函数 点击按钮进入烟雾报警 Back_clicked 模块外部函数 返回上一界面
17、 4.1.4.1红外报警模块 函数名称 函数类型 概要说明 showLocation(int a); 模块内部函数 显示触发的位置 changeOnClicked(); 模块外部函数 点击按钮发送红外开启信号 changeOfficked(); 模块外部函数 点击按钮发送红外开启信号 Back_clicked 模块外部函数 返回上一界面 4.1.4.2烟雾报警模块 函数名称 函数类型 概要说明 changeSmoke(int); 模块内部函数 显示当前烟雾的浓度。 Back_clicked 模块外部函数 返回上一界面
18、 4.1.4.3门锁控制模块 函数名称 函数类型 概要说明 changeLockState(int ); 模块内部函数 显示当前门的锁的状态 changeOn() 模块外部函数 点击按钮发送门开的状态 changeOff(); 模块外部函数 点击按钮发送门开的状态 Back_clicked 模块外部函数 返回上一界面 4.1.5小工具模块 函数名称 函数类型 概要说明 toolWidget2calendarWidget(); 模块外部函数 点击按钮进入日历 toolWidget2stopwatchWidget() 模块外部函数 点
19、击按钮进入秒表 toolWidget2cWidget() 模块外部函数 点击按钮进入计算器 toolWidget2alarmWidget() 模块外部函数 点击按钮进入闹钟 toolWidget2mianWindow() 模块外部函数 点击按钮进入画板 toolWidget2gameWidget() 模块外部函数 点击按钮进入2048游戏 toolWidget2clockWidget() 模块外部函数 点击按钮进入时钟 4.1.5.1日历模块 函数名称 函数类型 概要说明 selfinfowidget()
20、 模块内部函数 显示医生个人基本信息,显示医生的打卡时间。 button_schedual_clicked 模块外部函数 点击按钮进入日程界面 Select_cases 模块外部函数 选择代办事项,并显示代办事项的具体内容 Back_clicked 模块外部函数 返回上一界面 4.1.5.2时钟模块 函数名称 函数类型 概要说明 selfinfowidget() 模块内部函数 显示医生个人基本信息,显示医生的打卡时间。 button_schedual_clicked 模块外部函数 点击按钮进入日程界面 Select_cases 模块外部函
21、数 选择代办事项,并显示代办事项的具体内容 Back_clicked 模块外部函数 返回上一界面 4.1.5.3闹钟模块 函数名称 函数类型 概要说明 selfinfowidget() 模块内部函数 显示医生个人基本信息,显示医生的打卡时间。 button_schedual_clicked 模块外部函数 点击按钮进入日程界面 Select_cases 模块外部函数 选择代办事项,并显示代办事项的具体内容 Back_clicked 模块外部函数 返回上一界面 4.1.5.4秒表模块 函数名称 函数类型 概要说明 start
22、StopwatchClicked() 模块内部函数 秒表开始计时 resetStopwatchClicked() 模块内部函数 秒表重新计时 stopStopwatchClicked() 模块内部函数 秒表停止计时 4.1.5.5画板模块 函数名称 函数类型 概要说明 void open() 模块内部函数 打开图片 void save() 模块内部函数 保存图片 void penColor() 模块内部函数 改变画笔颜色 void penWidth() 模块内部函数 改变画笔宽度 void penBrush() 模块内
23、部函数 笔刷 4.1.5.6计算器模块 函数名称 函数类型 概要说明 selfinfowidget() 模块内部函数 显示医生个人基本信息,显示医生的打卡时间。 button_schedual_clicked 模块外部函数 点击按钮进入日程界面 Select_cases 模块外部函数 选择代办事项,并显示代办事项的具体内容 Back_clicked 模块外部函数 返回上一界面 4.1.5.7小游戏模块 函数名称 函数类型 概要说明 selfinfowidget() 模块内部函数 显示医生个人基本信息,显示医生的打卡时间。
24、
resizeEvent(QResizeEvent *)
模块内部函数
窗口尺寸改变触发的事件
onScoreInc(int)
模块内部函数
处理分数增加信号的槽函数
onGameOver()
模块内部函数
处理游戏结束信号的槽函数
onWin()
模块内部函数
处理游戏获胜信号的槽函数
Main.c:
#include
25、int argc, char *argv[]) { QApplication a(argc, argv); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8")); openPassword w;
26、w.show(); init_network(); return a.exec(); } void init_network() { sfd=socket(AF_INET,SOCK_DGRAM,0); if(sfd<0) { qDebug("socket()failed!"); return; } struct sockaddr_in addr; bzero(&addr,sizeof(addr)); addr.sin_family = AF_
27、INET; addr.sin_port=htons(9999); addr.sin_addr.s_addr = htonl(INADDR_ANY); int ret; ret=bind(sfd,(struct sockaddr*)&addr,sizeof(addr)); if(ret != 0) { qDebug("bind() failed!"); return; } } #include "mainwidg
28、et.h"
#include "ui_mainwidget.h"
#include "head.h"
#include
29、me::currentTime());// QTimer *timer=new QTimer(this); connect(timer,SIGNAL(timeout()),this,SLOT(timeoutslot()));//timeoutslot() timer->start(1000); sha = new smartHomeAppliances; sw = new securityWidget; tw = new toolWidget; } mainWidget.c: mainWidget::~mainWidget(
30、) { delete ui; } void mainWidget::show() { QWidget::show(); showFullScreen(); } void mainWidget::mainWidget2smartHomeAppliances() { QPalette palette; palette.setBrush(QPalette::Background,QBrush(QImage( ":/new/prefix1/jiaju.png").scaled(size(), Qt::IgnoreAsp
31、ectRatio, Qt::SmoothTransformation))); sha->setPalette(palette); sha->setAutoFillBackground(true); sha->setAutoFillBackground(true); sha->show(); // sha->show(); } vo
32、id mainWidget::mainWidget2securityWidget() { QPalette palette; palette.setBrush(QPalette::Background,QBrush(QImage( ":/new/prefix1/anfang.png").scaled(size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformati
33、on))); sw->setPalette(palette); sw->setAutoFillBackground(true); // sw->setAutoFillBackground(true); // sha->show(); sw->show(); } void mainWidget::mainWidget2toolWidget() { // tw->show(); QPalette palette; palette.setBrush(QPalette::Background,QBrush(QImag
34、e( ":/new/prefix1/tool.png").scaled(size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation))); tw->setPalette(palette); tw->setAutoFillBackground(true); tw->setAutoFillBackground(true); tw->
35、show(); } void mainWidget::timeoutslot() { QDate date = ui->dateTimeEdit->date(); QTime time = ui->dateTimeEdit->time(); QTime time1(23,59,59); if(time == time1) { date = date.addDays(1); } time = time.addSecs(1); ui
36、>dateTimeEdit->setDate(date); ui->dateTimeEdit->setTime(time) 冰箱控制: #include "infraredwidget.h" #include "ui_infraredwidget.h" #include "head.h" infraredWidget::infraredWidget(QWidget *parent) : QWidget(parent), ui(new Ui::infraredWidget) { ui->setupUi(this); } in
37、fraredWidget::~infraredWidget() { delete ui; } void infraredWidget::show() { QWidget::show(); showFullScreen(); } void infraredWidget::changeOnClicked() { struct sockaddr_in peer_addr; bzero(&peer_addr,sizeof(peer_addr)); peer_addr.sin_family = AF_INET; pe
38、er_addr.sin_port = htons(INFRARED_PORT); peer_addr.sin_addr.s_addr = inet_addr(INFRARED_IP); int a=1; sendto(sfd,&a,sizeof(a),0,(struct sockaddr*)&peer_addr,sizeof(peer_addr)); ui->textBrowser->append(""); } void infraredWidget::changeOffClicked() { struct sockaddr_in pee
39、r_addr; bzero(&peer_addr,sizeof(peer_addr)); peer_addr.sin_family = AF_INET; peer_addr.sin_port = htons(INFRARED_PORT); peer_addr.sin_addr.s_addr = inet_addr(INFRARED_IP); int a=0; sendto(sfd,&a,sizeof(a),0,(struct sockaddr*)&peer_addr,sizeof(peer_addr)); ui->textB
40、rowser->append("");
}
void infraredWidget::showLocation(int a)
{
if(a==0)
{
ui->textBrowser->append();
}
if(a==1)
{
ui->textBrowser->append(");
}
}
门锁控制:
#include "lockwidget.h"
#include "ui_lockwidget.h"
#include 41、tButton>
#include"head.h"
lockWidget::lockWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::lockWidget)
{
ui->setupUi(this);
// rt = new recvThread;
//QObject::connect(rt, SIGNAL( lockStateChange(int)),
// this, SLOT(changeLockState(int)));
42、 // rt->start();
}
lockWidget::~lockWidget()
{
delete ui;
}
void lockWidget::show()
{
QWidget::show();
showFullScreen();
}
void lockWidget::changeOn()
{
// ui->btn1->setChecked(true);
ui->lineEdit->setText("The gate is ON!");
struct sockaddr_in addr;
43、 bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(7002);
addr.sin_addr.s_addr = inet_addr("192.168.1.222");
// int kind = 5; //
// sendto(sfd, &kind, sizeof(kind), 0, (struct sockaddr*)&addr, sizeof(addr));
int bool2=1;
sendto(sf 44、d, &bool2, sizeof(bool2), 0, (struct sockaddr*)&addr, sizeof(addr));
// ui->label_2->setText("the GATE is On!");
}
void lockWidget::changeOff()
{
ui->lineEdit->setText("The gate is OFF!");
// ui->btn2->setChecked(true);
// ui->label_2->setText("the Gate is OFF!");
struct 45、sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(7002);
addr.sin_addr.s_addr = inet_addr("192.168.1.87");
// int kind = 5; //
// sendto(sfd, &kind, sizeof(kind), 0, (struct sockaddr*)&addr, sizeof(addr));
int bool2= 46、0;
sendto(sfd, &bool2, sizeof(bool2), 0, (struct sockaddr*)&addr, sizeof(addr));
}
void lockWidget::changeLockState(int bool1)
{
if(bool1==0)
{
// ui->setupUi(this);
// ui->Ui_lockWidget;
// close();
// show();
//update();
// 47、 repaint();
ui->lineEdit->setText("the GATE is OFF!");
// qApp->processEvents();
// this->updateGeometry();
// qDebug("recv1111");
}
else if (bool1==1)
{
// ui->btn1->setCheckable(true);
// ui->btn1->setFocus();
// ui->btn2->s 48、etChecked(false);
// ui->btn1->setChecked(true);
// ui->label_2->update();
// ui->label_2->setText("the GATE is On!");
// this->changeOff();
// this->changeOn();
// ui->setupUi(this);
// ui->retranslateUi(lockWidget);
// update();
49、ui->lineEdit->setText("the GATE is ON!");
// this->updateGeometry();
// qDebug("recv 2222");
}
}
远程灯控:
#include "lockwidget.h"
#include "ui_lockwidget.h"
#include 50、arent),
ui(new Ui::lockWidget)
{
ui->setupUi(this);
// rt = new recvThread;
//QObject::connect(rt, SIGNAL( lockStateChange(int)),
// this, SLOT(changeLockState(int)));
// rt->start();
}
lockWidget::~lockWidget()
{
delete ui;
}
void lockWi






