目录
一、方案流程及技术规格书设计
二、系统硬件电路设计
三、软件编写及调试
四、系统调试测试与分析
前言
随着科学技术的快速发展,人们对生活品质的要求也不断提高,开始追求更好更方便的生活方式。因此,智能家居系统应运而生。智能家居控制系统(smart home control systems),是以智能家居系统为平台,对家居电器及家电设备自动控制。提升家居智能、安全、便利、舒适。
传统的家居智能控制系统一般采用集中控制器为中心,采用界面按键操作的方式来控制家居家电。采用界面操作控制的弊端是操作复杂,必须在固定地点操作。
随着语音识别技术的快速发展,语音识别的准确率和可靠性大幅提高。语音识别技术将进入工业、家电、通信、汽车电子、医疗、家庭服务、消费电子产品等各个领域。语音识别ASR(Automatic Speech Recognition)的最大优势在于使得人机用户界面更加自然和容易使用。
基于语音识别技术的上述特点,同时结合当代智能家居在控制中的实际需求,我们选择语音控制的智能家居系统。本系统具有良好的开发和应用前景,在智能家居这个概念广为人知的时代,语音控制技术与智能家居的融合,最终会让智能家居引领市场并且走向更为广泛的应用。
软件工具准备
软件:
电路设计:protel99 se(up主使用版本) 或者其他版本,或者其他电路设计软件;
单片机开发:Keil5;
调试测试:串口调试助手,逻辑分析仪等;
工具:
电路焊接:电烙铁,SMT(有条件的);
调试:
万用表、示波器(基础入门即可,可以白嫖学校或者公司)USB转串口工具、仿真器;
一、方案流程及技术规格书设计
方案流程设计
技术规格书设计
1.本设计采用LD3320语音识别芯片。LD3320是一款非特定人语音识别芯片。其提供的语音识别技术,是基于“关键词语列表”的识别技术;ASR技术。
2.LD3320识别语音后,单片机根据语音控制家电设备开关。
3.家电设备有灯(双色LED灯模拟)、窗帘(步进电机模拟)、空调(继电器输出)、热水器(继电器输出)。
4、家居环境监测传感器有火焰传感器、烟雾传感器、温湿度传感器、人体红外传感器。
5、当火焰传感器、烟雾传感器、异常时,启动喷水设备(继电器输出)灭火。当人体红外传感器检测到人时,启动蜂鸣器报警。
6、语音控制灯开关、亮度、颜色。窗帘开关、空调开关、热水器开关。
7、报警信息通过GSM模块发送到指定手机。
8、设备状态在LCD显示。
9、4个按键可以手动控制设备开关。
二、系统硬件电路设计
2.1微处理控制电路
设计采用韩国现代产MC96F6432单片机芯片。该芯片是8051内核的8位单片机,电路图如图所示:
单片机供电电压是2-5V,设计采用5V供电,图中VCC为5V。C14是电源滤波去耦电容。J20是仿真烧录口。
IO口连接介绍:
1、LCD显示
P30-P37:连接LCD数据线,8位并行通讯。
P17:RS 控制LCD命令或数据。
P16:RW 控制LCD读或写数据。
P15:E LCD使能。
P14:CS1 左屏选择。
P13:CS2 中间屏选择。
P12:CS1 右屏选择。
2、语音模块
P07-P06:Y_Lamp4-Y_Lamp3语音模块指示灯开关。
P55:Y_AC 语音模块指示空调开关。
P42:Y_Curton 语音模块指示窗帘开关。
P43:Y_Heat语音模块指示热水器开关。
3、步进电机控制
P10: C4 步进电机控制。
P20-P22:C3-C1步进电机控制。
5、传感器
P50:ROUT 人感传感器输出。
P11:HDO 火焰传感器输出。
P51:YDO 烟雾传感器输出。
6、按键
P23:HEAT_SW控制热水器开关。
P02:CURTON_SW控制窗帘开关。
P52:LAMP_SW 控制灯开关。
P03:AC_SW 控制空调开关。
7、外部设备控制
P54:Water 喷水设备控制。
P53:Alarm 报警设备控制。
P25:AC 空调开关控制。
P26: LEDG 绿灯控制。
P27:LEDR红灯控制。
7、通讯模块
P40:RXD串口接收脚。
P41:TXD串口发送脚。
2.2 语音识别模块电路设计
LD3320语音电路设计为独立模块。LD3320的基本应用电路由单片机STC11L08和LD3320组成。主控MCU STC11L08来完成LD3320芯片寄存器的操作。如设置标志位,读状态,写数据到FIFO,识别结果,等等。例如,编辑关键词时,拼音串设置成LD3320寄存器来完成编辑关键词。寄存器可以分为以下几类,FIFO数据缓冲器,语音识别控制寄存器,音量控制,模拟电路和其他辅助寄存器。寄存器的读写操作有2种方式,分别是标准并行模式和串行SPI模式,本设计采用标准并行模式。该LD3320寄存器的地址空间为8位,从00H〜FFH。LD3320电路如图所示。
IO口连接介绍:
VDD/VDDIO:3.3V电源输入。
MIC[P、N](9、10脚):麦克风输入正负端。
MONO(11脚):单声道输入。
MBS(12脚):麦克风偏置。
LINE[L、R](13、14脚):立体声左右端
HPO[L、R](15、16脚):耳机输入左右端
EQ[1、2、3](20-22脚):喇叭音量外部控制
SPO[N、P](25、26脚):喇叭输出
LOUT(L、R)(27、28脚):lineout输出
RSTB(47脚):复位信号
INTB(48脚):中断信号
STC11L08电路如图所示:
IO口连接介绍:
LD_P0-P7(37-30脚) : 8位数据线。
LD_MD(6脚):读写模式控制,低电平是8位并行数据。
LD_CS,WR,RD,A0(19,13,12,18脚):LD3320读写控制。
2.3 LCD显示电路
LCD19264显示电路如图:
R29是电位器,作用是调节显示对比度。R22是上电复位电路。R32是背光限流电阻。
IO口连接介绍:
RS、RW、E(5、6、7脚):LCD读写控制脚。
D0-D7(8-15脚):数据线。
CS1、CS2、CS3(16、17、18脚):屏幕选择脚,CS1低选择左屏,CS2低选择中间屏,CS3低选择右屏。
2.4 按键电路
设计4个按键,单片机检测各个按键IO口电平,按键未按下时,高电平,按键按下时,低电平。按键控制对应设备开关。电路如图:
2.5 LED模拟灯电路设计
设计LED红灯和绿灯模拟灯的颜色。灯的开关和亮度通过LEDR和LEDG控制。亮度设置有灭、暗、亮。设置灭时,LEDR,G输出低电平,设置暗时,LEDR,G输出50%占空比的方波,设置亮时LEDR,G输出高电平。
2.6步进电机驱动电路
步进电机使用ULN2003达林顿管驱动,电路如图3-6-1。VCC是5V供电电压。C1-C4是脉冲控制脚。在C1-C4输出特定时序的脉冲信号,就能控制步进电机顺时针转或反时针转,模拟窗帘开关。
2.7 继电器及驱动电路设计
设计4个继电器驱动电路模拟喷水设备开关、防盗报警开关、空调开关、热水器开关。图中三极管驱动继电器断开或闭合,当控制脚输出高电平时,三极管导通,继电器闭合。电阻起限流作用。二极管防止反向高压。LED灯指示继电器状态,继电器闭合时,LED灯亮,断开时,LED灯灭。电路图如下:
2.8 传感器电路设计
传感器电路有人体红外传感器、烟雾传感器、火焰传感器,VCC和地供电,ROUT、YDO、HDO接单片机输入脚,当感应到信号时,对应脚输出低电平。YAO和HAO是传感器模拟输出,本设计未使用。电路如图:
2.9 GSM模块电路设计
通信模块和单片机串口通信,VCC、GND给模块供电,U_RXD是模块串口接收脚,U_TXD是模块串口发送脚。电路如图。
通信模块芯片使用的是3.3V电压,所以IO口不能和单片机直接连接,需要电平转换电路。电路如图。
2.10 电源电路设计
系统采用外部9V电源适配器供电,9V直流电经过3端稳压模块7805的降压和稳压,输出5V电压给芯片和其他电路供电。电路如图。
通讯模块供电是3.3V,通过3.3V稳压芯片ASM1117输出3.3V电压。电路如图。
三、软件编写及调试
3.1主程序设计
系统采用MC96F6432单片机,外围设备有语音模块输入,火焰传感器输入,烟雾传感器输入,人感传感器输入,按键,LCD显示,步进电机控制,灯控制,空调继电器控制,热水器继电器控制,防盗报警继电器控制,灭火继电器控制。
上电时,单片机初始化和外围设备初始化完成后,进入正常工作。单片机读取语音控制状态,根据状态控制灯光、空调继电器、窗帘步进电机、热水器继电器家电设备。单片机读取火焰传感器、烟雾传感器信号,控制灭火设备。单片机读取人感信号,控制报警继电器。LCD显示设备状态,报警信号通过GSM模块发送到指定手机。
系统流程图如图。
3.2 LCD显示程序设计
HS19264是字符点阵液晶,显示屏分3部分,通过CS1,CS2,CS3低电平选择。按16x16汉字计算,可以显示12x4=48个汉字。LCD控制线是RS,RW,E,控制写命令还是写数据。汉字、字符、数字需要建立字模。LCD取对应字模显示对应点,合起来就能显示对应文字。图是LCD显示流程图。
19264LCD显示代码:
/**底层驱动 ******************/
/*RS P17输出高低电平*/
void set_RS(unsigned char RS)
{
if(RS == 0)
P17 = 0;
else
P17 = 1;
}
/*RW P16输出高低电平*/
void set_RW(unsigned char RW)
{
if(RW == 0)
P16 = 0;
else
P16 = 1; }
/*E P15输出高低电平*/
void set_EN(unsigned char EN)
{
if(EN == 0)
P15 = 0;
else
P15 = 1;
}
/*CS1 P14输出高低电平*/
void set_CS1(unsigned char CS1)
{
if(CS1== 0)
P14 = 0;
else
P14 = 1;
}
/*CS2 P13输出高低电平*/
void set_CS2(unsigned char CS2)
{
if(CS2== 0)
P13 = 0;
else
P13 = 1;
}
/*CS3 P12输出高低电平*/
void set_CS3(unsigned char CS3)
{
if(CS3== 0)
P12 = 0;
else
P12 = 1;
}
/*LCD数据线P3口输出数据*/
void set_data(unsigned char data)
{
P3 = data ;
}
/*显示开关*/
void lcd_command_onoff(unsigned char onoff)
{
set_RW(0);
set_RS(0);
set_EN(0);
set_data(onoff+0X3E);
set_EN(1);
set_EN(0);
}
/*设置显示起始位置*/
void lcd_command_startline(unsigned char startline)
{
set_RW(0);
set_RS(0);
set_EN(0);
set_data(startline+0Xc0);
set_EN(1);
set_EN(0);
}
/*设置显示页*/
void lcd_command_setpage(unsigned char page)
{
set_RW(0);
set_RS(0);
set_EN(0);
set_data(page+0Xb8);
set_EN(1);
set_EN(0);
}
/*设置显示列*/
void lcd_command_setyadd(unsigned char yadd)
{
set_RW(0);
set_RS(0);
set_EN(0);
set_data(yadd+0X40);
set_EN(1);
set_EN(0);
}
/*向LCD DDRAM 写1BYTE 数据*/
void lcd_writedata(unsigned char data)
{
set_RW(0);
set_RS(1);
set_EN(0);
set_data(data);
set_EN(1);
set_EN(0);
}
/*LCD初始化*/
void lcd_init(void)
{
lcd_command_onoff(1);
lcd_command_startline(0);
lcd_clear_scr();
}
/*LCD选择屏幕1、2、3*/
void lcd_setscr(unsigned char scr)
{
if(scr==1)
{
set_CS1(0);
set_CS2(1);
set_CS3(1);
}
else if(scr==2)
{
set_CS1(1);
set_CS2(0);
set_CS3(1);
}
Else
{
set_CS1(1);
set_CS2(1);
set_CS3(0);
}
}
/*LCD清屏1、2、3*/
void lcd_clear_scr(void)
{
INT8U i,j;
for(i=0;i<=7;i++)
{
set_CS1(1);
set_CS2(0);
set_CS3(0);
lcd_command_setpage(i);
lcd_command_setyadd(0);
for(j=0;j<64;j++)
{
lcd_writedata(0x00);
}
}
for(i=0;i<=7;i++)
{
set_CS1(0);
set_CS2(1);
set_CS3(0);
lcd_command_setpage(i);
lcd_command_setyadd(0);
for(j=0;j<64;j++)
{
lcd_writedata(0x00);
}
}
for(i=0;i<=7;i++)
{
set_CS1(0);
set_CS2(0);
set_CS3(1);
lcd_command_setpage(i);
lcd_command_setyadd(0);
for(j=0;j<64;j++)
{
lcd_writedata(0x00);
}
}
}
/*显示数字 显示8X16点字符 */
void lcd_write_0816(unsigned char page, unsigned char yadd, unsigned char fanxiang,const unsigned char *disp)
{
unsigned char i=0,j=0;
for(j=0;j<2;j++)
{
lcd_command_setpage(page+j);
lcd_command_setyadd(yadd);
for(i=0;i<8;i++)
{
if(fanxiang==0)
{lcd_writedata(disp[j*8+i]);}
else
{lcd_writedata(~(disp[j*8+i]));}
}
}
}
/*显示汉字,显示16X16点字符 */
void lcd_write_1616(unsigned char page, unsigned char yadd, unsigned char fanxiang,const unsigned char *disp)
{
unsigned char i=0,j=0;
for(j=0;j<2;j++)
{
lcd_command_setpage(page+j);
lcd_command_setyadd(yadd);
for(i=0;i<16;i++)
{
if(fanxiang==0)
{lcd_writedata(disp[j*16+i]);}
else
{lcd_writedata(~(disp[j*16+i]));}
}
}
}
3.3 步进电机驱动程序设计
采用4相8拍步进电机,其原理是轮流通过电流,正转顺序是A,AB,B,BC,C,CD,D,DA。反转顺序是A,DA,D,CD,C,BC,B,AB。转速的快慢是由输出脉冲频率决定。
步进电机代码:
/*输出脉冲驱动*/
unsigned char MotorCtr(void)
{
if (stop_flag==1) //停止转动
{
P22 = 0;
P21 = 0;
P20 = 0;
P10 = 0;
return;
}
switch(step_index) //根据驱动时序,输出一个单脉冲信号波形
{
case 0: //0 ,(A 相)
P22 = 1;
P21 = 0;
P20 = 0;
P10 = 0;
break;
case 1: //0、1, (AB 相)
P22 = 1;
P21 = 1;
P20 = 0;
P10 = 0;
break;
case 2: //1,(B 相)
P22 = 0;
P21 = 1;
P20 = 0;
P10 = 0;
break;
case 3: //1、2 , (BC 相)
P22 = 0;
P21 = 1;
P20 = 1;
P10 = 0;
break;
case 4: //2, (C 相)
P22 = 0;
P21 = 0;
P20 = 1;
P10 = 0;
break;
case 5: //2、3, (CD 相)
P22 = 0;
P21 = 0;
P20 = 1;
P10 = 1;
break;
case 6: //3, (D 相)
P22 = 0;
P21 = 0;
P20 = 0;
P10 = 1; break;
case 7: //3、0, (DA 相)
P22 = 1;
P21 = 0;
P20 = 1;
P10 = 1;
}
if (turn==0) //转动方向控制,0-正转;1-反转
{
step_index++; //正转时序
if (step_index>7)
step_index=0;
}
else
{
step_index--;//反转时序
if (step_index<0)
step_index=7;
}
}
3.4 LCD驱动程序设计
LED模拟灯光控制,LED状态有亮,暗,灭3种状态,LED的IO口输出高电平,灯亮,输出低电平,灯灭,输出PWM波,灯暗。图是LED控制流程图。
四、系统调试测试与分析
4.1电路焊接
用电烙铁将单片机,液晶显示,继电器,LED灯,稳压电源模块,按键,语音模块,传感器模块,按键,电容,电阻等焊接到线路板。实物如图所示。
4.2系统调试
连接电脑和烧写器,下载程序到单片机,上电初始化完成后,设备都在关闭状态。普通话说出以下单词,控制设备开。
1.开红灯。
2.开绿灯。
3.开空调。
4.开热水器。
5.开窗帘。
本智能家居系统设计报警功能,当火焰传感器检测到异常时,会显示火警,人体传感器检测到异常时,显示盗警。人移动到人体传感器前,显示盗警并继电器报警。如图。