对于传统阳台来说,阳台是采光的用来晾晒衣服作为主要作用,如今随着物联网技术的发展,阳台赋予了更多的应用,更多的使用空间,是一种生活场景。本文讲述智能阳台基础仿真设计与实现过程。使用语音助手,多传感器,ZigBee等技术为您展现。
随着社会的发展,城市化的比例越来越高,当下的年轻人对于房子的装修,也是不同于以前,尤其是智能家居的火热,当然对于阳台的使用也大有不同,对于传统阳台来说,阳台是采光的用来晾晒衣服作为主要作用,如今随着物联网技术的发展,阳台赋予了更多的应用,更多的使用空间,是一种生活场景。本文讲述智能阳台基础仿真设计与实现过程。
阳台智能化,添加多元场景,本文介绍智能阳台三大功能:
其一,自然是智能晾衣架,作为阳台基本可以通过控制,自动升降,既不占空间,又保留其功能。使用步进电机传感器,以及中控系统完成晾衣架的自动升降。
其二就是智能养护功能,绿植在房子装饰上不可或缺,许多人都或多或少种植一些绿植,阳台作为采光的部分,自然是培养绿植的好地方,智能养护可以通过传感器获得光照强度,温度湿度,监测环境,完全可以实现科学种植,非常省心。
其三为智能灯光系统,要知道阳台作为不同生活场景时候对于灯光效果也是不相同的,所以配合灯光系统,可以带来不同的体验。最为最基础的灯光系统,配合光敏传感器,以及人体红外传感器,用于场景夜晚,检测阳台有人则自动开启灯光。
1、本实验使用 Zstack 协议栈多点自组织网络形式采集实验数据。如图 1 所示,系统由一个协调器 和四个终端节点,即人体红外传感器,步进电机传感器,温湿度传感器,光照强度传感器以及电脑作为网关串口和本地数据库组成。
图 1 系统架构组成
语音录入,python调用百度API识别语音命令向串口发送,再向协调器发送采集命令,协调器再将 命令以广播形式发送给四个终端节点。接着,终端节点采集信息反馈给协调器,协调器将数据发送给串口,最后通过python串口函数将数据存入数据库,然后通过python flask web框架结合echarts图表显示出来
单片机编译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 作为数据管理工具。
本任务使用HC-SR501传感器,是基于红外线技术的自动控制钱块,广泛应用于各类自动感应电器设备,HC-SR501的核心控制模块是采用稳定性好、可靠性强、灵敏度高且超低功耗
人体红外传感器检测到有人体活动时,其输出的I/O值发生变化。当传感器模块检测到有人入侵时,会返回一个高电平信号,无人入侵时,返回一个低电平信号,通过读取1/O口的状态判断是否有人体活动。因此通过检测此I/O口电平状态的变化,可判新是否检测到周围有人靠近。
光敏传感器主要是对于ADC值的读取光照越强,数值越低
图 2人体红外传感器
图 3 光敏传感器
图 6协调器
图 7 光照强度数据表
图 8 温湿度数据表
选择设计id作为主键自增,datatime设计为varchar,并没有设为time类型,因为可以直接存储,不需要调用数据库时间函数,id用来查询最新数据,这样就可以显示最新数据完成实时读取
图 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)
图 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)
图16温湿度折线图
可以看到数据随着时间的变化进行采集,温湿度设置为3s读取一次,串口读取数据读10,可能协调器不一定能接受到因为传感器太多,需要等一等
图 18光照强度折线图
同理光照强度也是如此可以随着时间变化读取数据,采集的数据也可以通过仪表图显示最新数据
图 19实时数据
图 20 整体效果
本文主要是对于阳台的温度、湿度、光照强度进行采集,以及对于光照低情况下自动开启补光,光照低阳台有人的话,开启灯光,还有就是控制晾衣架自动升降这些作为主要功能,设计些许不足,后面拓展可以进行语音助手升级优化,可以设置唤醒词,或者按键唤醒,对于串口读取可以使用双线程实现边读边写,还有也可拓展写一个小程序用于手机控制,对于平台优化,可以基于算法模型对于土壤湿度模型曲线的预测把拟合数据与实际湿度数据对比这样就可以提醒什么时候浇水,补光等操作。
[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.