文章目录
- 摘 要:
-
- 关键词:ZigBee 、语音识别、智能家居、传感器
- 0.引言
- 1.概述
- 2.系统总体设计
-
-
- 2.1系统组成
- 2.系统使用过程
- 3、开发环境
- 2.由系统传感器组成
- 2.3系统数据库设计
-
- 3.详细设计和实现系统
- 4.系统测试结果
- 5.总结
- 6.参考文献
摘 要:
对于传统阳台,阳台主要用于照明和晾晒衣服。现在,随着物联网技术的发展,阳台提供了更多的应用和使用空间,这是一种生活场景。本文介绍了智能阳台的基本模拟设计和实现过程。使用语音助手和多传感器,ZigBee等技术为您展示。
关键词:ZigBee 、语音识别、智能家居、传感器
0.引言
随着社会的发展,城市化的比例越来越高,当前年轻人的房屋装修,也不同于以前,尤其是智能家居,当然,阳台的使用,对于传统阳台,阳台是照明干衣服作为主要作用,现在随着物联网技术的发展,阳台给予更多的应用,更多的使用空间,是一种生活场景。本文介绍了智能阳台的基本模拟设计和实现过程。
1.概述
本文介绍了智能阳台的三,本文介绍了智能阳台的三大功能: 其一,自然是智能晾衣架,作为阳台基本可以通过控制,自动升降,既不占空间,又保留其功能。使用步进电机传感器,以及中控系统完成晾衣架的自动升降。 二是智能维护功能,绿色植物在房屋装饰中不可或缺,许多人或多或少种植一些绿色植物,阳台作为照明的一部分,自然是培育绿色植物的好地方,智能维护可以通过传感器获得光强、温湿度、监测环境,可以实现科学种植,非常担心。 第三是智能照明系统。我们应该知道,当阳台作为不同的生活场景时,照明效果是不同的,因此配合照明系统可以带来不同的体验。最基本的照明系统,配合光敏传感器和人体红外传感器,用于夜间场景。如果有人测试阳台,他们会自动打开灯。
2.系统总体设计
2.1系统组成
1、本实验使用 Zstack 协议栈以自组织网络的形式采集实验数据。如图所示 1 系统由协调器显示 还有四个终端节点,即人体红外传感器、步进电机传感器、温湿度传感器、光强度传感器和计算机作为网关串口和本地数据库。
图 1 由系统架构组成
2.系统使用过程
语音录入,python调用百度API将语音命令识别到串口,然后将收集命令发送到协调器,协调器将再次发送 命令以广播的形式发送到四个终端节点。然后,终端节点向协调器收集信息,协调器将数据发送到串口,最后通过python串口函数将数据存储在数据库中,然后通过python flask web框架结合echarts图表显示出来
3、开发环境
单片机编译IAR环境以及python3.9解释器,pyCharm库和模块需要环境pymysql、serial、time、utils、 serial.tools.list_ports、win32com.client、from aip import AipSpeech、 pyaudio、 wave、flask、render_template。Mysql5.7数据库以及Navicat 作为数据管理工具。
2.由系统传感器组成
本任务使用HC-SR501传感器是基于红外技术的自动控制钱块,广泛应用于各种自动感应电气设备中,HC-SR501核心控制模块稳定性好,可靠性强,灵敏度高,功耗超低 当人体红外传感器检测到人体活动时,其输出I/O值发生了变化。当传感器模块检测到有人入侵时,将返回高电平信号。当没有人入侵时,通过读取1/O判断口腔状态是否有人体活动。因此,通过检测I/O口电平状态的变化可以判断周围是否有人靠近。 光敏传感器主要用于ADC读取光越强,值越低
图 2人体红外传感器
图 3 光敏传感器
· 图4温湿度传感器
图 5步进电机传感器
图 6协调器
2.3系统数据库设计
图 7 光强数据表
图 8 温湿度数据表
选择设计id作为主键自增,datatime设计为varchar,并没有设为time类型,因为可以直接存储,不需要调用数据库时间函数,id用于查询最新数据,最新数据实时读取
3.详细设计和实现系统
光敏传感器功能
图 9光敏传感器功能图
核心代码
if (strncmp("0x11", pData, len) == 0) {
///如果收到的数据是"0x11" osal_start_timerEx( sapi_TaskID, MY_REPORT_EVT, 3000 );///光强度触发事件循环采集3s一次 } 传感器初始化 int getADC(void) {
unsigned int value; P0SEL |= 0x02; ADCCON3 = (0xB1); ADCCON1 |= 0x30; ADCCON1 |= 0x40; while(!(ADCCON1 & 0x80)); value = ADCL >> 2; value |= (ADCH << 6); //取得最终转化结果,存入value中 return ((value) >> 2); }
步进电机功能图
图 10步进电机功能图
核心代码
电机初始化
/*motor_init函数 -------------------------------------------------------*/
void motor_init(void)
{
P0SEL &=~ 0x62; //P0_1 P0_5 P0_6 为普通io口
P0DIR |= 0x62; //作输出
P1SEL &=~ 0x08; //P1_3为普通io口
P1DIR |= 0x08; //作输出
AA = 1;
BB = 1;
CC = 1;
DD = 1;
}
if (strncmp("0x14", pData, len) == 0) {
//如果收到的数据是"0x14"
flag=0; //改变方向用的
motor_init();//初始化
for(int i=0;i<1000;i++){
Motor_Test();//转动
}
}
人体红外功能图
图 11人体红外功能图
核心代码
初始化以及发送数据
P0SEL &= ~0x20; //P0_5为普通io口
P0DIR &= ~0x20; //P0_5输入
int Value;
Value = P0_5;
char rbuf[10] = {
0};
if(Value==1){
sprintf(rbuf,"Y%u",Value);
zb_SendDataRequest( 0, ID_CMD_REPORT,10, rbuf, 0, AF_ACK_REQUEST, 0 ); //发送数据*/
}
else{
sprintf(rbuf,"N%u",Value);
zb_SendDataRequest( 0, ID_CMD_REPORT,10, rbuf, 0, AF_ACK_REQUEST, 0 ); //发送数据*/
}
else if (strncmp("0x13", pData, len) == 0) {
//如果收到的数据是"0x13"
osal_start_timerEx( sapi_TaskID, MY_REPORT_EVT, 1000 );//人体红外
}
else if (strncmp("0x15", pData, len) == 0) {
flag2=1;//开灯
}
else if (strncmp("0x16", pData, len) == 0) {
flag2=0;//关灯
}
温湿度功能图
图 12温湿度传感器功能图
核心代码
void dht11_io_init(void)
{
P0SEL &= ~0x20; //P1为普通 I/O 口
COM_OUT;
COM_SET;
}
unsigned char dht11_temp(void)
{
return sTemp;
}
unsigned char dht11_humidity(void)
{
return sHumidity;
}
void dht11_update(void)
{
int flag = 1;
unsigned char dat1, dat2, dat3, dat4, dat5, ck;
//主机拉低18ms
COM_CLR;
halMcuWaitMs(18);
COM_SET;
flag = 0;
while (COM_R && ++flag);
if (flag == 0) return;
//总线由上拉电阻拉高 主机延时20us
//主机设为输入 判断从机响应信号
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
flag = 0;
while (!COM_R && ++flag);
if (flag == 0) return;
flag = 0;
while (COM_R && ++flag);
if (flag == 0) return;
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) {
sTemp = dat3;
sHumidity = dat1;
}
char rbuf[20] = {
0};
sprintf(rbuf,"H%dT%d",dat1,dat3); //A0表示湿度,A1表示温度
zb_SendDataRequest( 0, ID_CMD_REPORT,10, rbuf, 0, AF_ACK_REQUEST, 0 ); //发送数据
}
串口功能图
图 13串口功能图
核心代码
Python
def serilink():#串口连接
port_list = list(serial.tools.list_ports.comports())
s=''
if len(port_list) == 0:
speak('无可用串口')
else:
for i in port_list:
s=str(i)
portx = s[0:4]
bps = 38400
# 超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
timex = None
ser = serial.Serial(portx, bps, timeout=timex)
return ser
def Judgmentcommand(n):#判断接收数据类型函数此处是我个性化数据
if 'H' and 'T'in n:
position=n.find('T')
humi=int(n[1:position])
temp=int(n[position+1::])
insertdata(temp,humi)
elif 'Y' in n:
light=utils.selectmaxid()
if(light>1000):
Sendcommand('0x15\r\n')
speak('自动为您开启阳台灯光')
else:
Sendcommand('0x16\r\n')
elif 'L' in n:
light=n[1::]
insert_l2_data(light)
elif 'D' in n:
dark=n[1::]
insert_l2_data(dark)
speak("为你开启补光")
def Readdata():#读取串口数据函数
for i in range(10):
time.sleep(1)
data = serilink().read(10)#读取10字节
data = str(data)#转为字符串
data = data.replace('\\x00', '')#数据分割
data = data.replace("'", '')#数据分割
Judgmentcommand(data[1:])#数据判断函数判断数据并存入数据
print(data[1:])
# 百度API语音识别自行申请
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''
client=AipSpeech(APP_ID,API_KEY,SECRET_KEY)
#语音识别
def recognize(file):
data=open(file,'rb').read()
result=client.asr(data,'wav',16000,{
'dev_pid':1537})
result=str(result['result'][0])
return result
def get_audio(sec):
p=pyaudio.PyAudio()
#创建流,采样数,声道数,采样频率,缓存区,input=True
stream=p.open(format=pyaudio.paInt16,channels=1,rate=16000,input=True,frames_per_buffer=1024)
#创建打开音频文件
wf=wave.open('test.wav','wb')
#设置
wf.setnchannels(1)
wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
wf.setframerate(16000)
print("请说话")
for w in range(int(16000*sec/1024)):
data=stream.read(1024)
wf.writeframes(data)
print("开始识别")
stream.stop_stream()
stream.close()
p.terminate()
wf.close()
return "test.wav"
def speak(s):
print("-->"+s)
win32com.client.Dispatch("SAPI.SpVoice").Speak(s)
Web功能图
图 14 web功能图 核心代码
function get_l1_data() {
$.ajax({
type:"GET",
url:"http://127.0.0.1:5000/l1",
dataType:"json",
async:false,
success: function(data) {
option_left1.xAxis.data = data.sec
option_left1.series[0].data = data.humi
option_left1.series[1].data = data.temp
ec_left1.setOption(option_left1)
},
error: function(errorData) {
}
});
}
get_l1_data()
setInterval(get_l1_data, 1000)
4.系统测试结果
图15温湿度折线图
图16温湿度折线图
可以看到数据随着时间的变化进行采集,温湿度设置为3s读取一次,串口读取数据读10,可能协调器不一定能接受到因为传感器太多,需要等一等
图 17光照强度折线图
图 18光照强度折线图
同理光照强度也是如此可以随着时间变化读取数据,采集的数据也可以通过仪表图显示最新数据
图 19实时数据
图 20 整体效果
5.总结
本文主要是对于阳台的温度、湿度、光照强度进行采集,以及对于光照低情况下自动开启补光,光照低阳台有人的话,开启灯光,还有就是控制晾衣架自动升降这些作为主要功能,设计些许不足,后面拓展可以进行语音助手升级优化,可以设置唤醒词,或者按键唤醒,对于串口读取可以使用双线程实现边读边写,还有也可拓展写一个小程序用于手机控制,对于平台优化,可以基于算法模型对于土壤湿度模型曲线的预测把拟合数据与实际湿度数据对比这样就可以提醒什么时候浇水,补光等操作。
6.参考文献
[1]聂佰玲,武将将,沈昊.阳台菜园智能控制系统的设计与研究[J].产业与科技论坛,2019,18(01):64-65. [2]李海川,杨思民.浅谈基于智能硬件在阳台智能化场景中的应用[J].科学技术创新,2021(17):147-148. [3]何文祥,李社蕾.智能家居盆栽系统技术的研究与设计[J].现代计算机,2021,27(23):167-170. [4]洪长平.基于物联网ZigBee技术的防盗报警系统设计[J].九江学院学报(自然科学版),2020,35(03):57-60.DOI:10.19717/j.cnki.jjun.2020.03.015. [5]张军. 基于智能盆栽系统的新型物联网架构设计[D].深圳大学,2017. [6]曾星,陈长菊,张坤. 基于物联网的智能阳台控制系统设计[J]. 通讯世界,2018(6):85-86. DOI:10.3969/j.issn.1006-4222.2018.06.053. [7]成都信息工程大学,孙翔. 一种基于ZigBee的智能化盆栽浇灌系统:CN201721211830.4[P]. 2018-04-27. [8]章煜佳,罗文强,金航,杨钦洋,陈祥军,陈超娣,杨金伟.专用于学生公寓阳台的智能防护装置研制[J].科学技术创新,2020(02):188-190. [9]杨巍,刘倩,邱博.基于STM32与物联网IP技术的智能生态阳台场景的设计与实现[J].电子产品世界,2018,25(09):57-60.