物联网智能家居实训||实验二十三 语音识别场景控制实验
发布者:唯众
布时间:2020-09-23 16:24:55
点击量:
实验环境
软件环境:JDK1.6、SDK、ADT、Eclipse
硬件环境:DC5V、DC12V、节点板2块、ZIGBEE协调器1个、WIFI模块1个、ZIGBEE节点1个、A9网关、照明灯、继电器模块、声音识别模块
实验内容
根据预设音,进入场景联动,如:“开灯”,照明灯被点亮,“关灯”,照明灯被关闭。声音识别模块将识别给定的指令,如:“开灯”、“关灯”、“开风扇”、“关风扇”等,并将识别出来的结果通过ZIGBEE发送给A9网关。A9网关收到命令并解析之后,控制相应的节点执行命令。
实验原理
唯众语音模块采用了STC的51单片机STC11L08XE和ICROUT公司的语音识别芯片LD3320。该单片机(STC11L08XE)编程方式与51、52系列单片机编程方式一样,用户无需从新查看学习新的单片机寄存器,到手即可编程使用;预留16个单片机IO口,其中有一组8位IO扩展接口、1个定时器、1个外部中断,可做为单片机最小系统实现控制功能,无需配套其他单片机独自完成工作。
ZIGBEE节点模块与1个WIFI节点模块同时连接到A9的网关上。ZIGBEE节点插上唯众的声音识别模块。WIFI节点插上唯众的继电器模块,继电器模块再接上照明灯。ZIGBEE节点将语音识别的结果通过ZIGBEE网络传感A9网关,网关接到语音识别的命令之后执行对应的动作,本实验以“开灯”命令进行讲解。
硬件接口原理
本实验集成了语音识别模块及继电器输入输出模块。相关工作原理及原理图参考实验二《照明控制实验》及实验九《语音识别控制实验》。
软件设计
1. CC2530 语音识别场景控制流程图
2. CC2530语音识别场景控制软件
WIFI节点控制继电器,请参考实验四;协调器通过WIFI控制继电器,请参考实验二十一。此处是语音识别的初始化软件代码:
1. void GenericApp_Init( uint8 task_id )
2. {
3. GenericApp_TaskID = task_id;
4. GenericApp_NwkState = DEV_INIT;
5. GenericApp_TransID = 0;
6.
7. GenericApp_Rout_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
8. GenericApp_Rout_DstAddr.endPoint = GENERICAPP_ENDPOINT;
9. GenericApp_Rout_DstAddr.addr.shortAddr = 0x0000;
10.
11. GenericApp_Rout_epDesc.endPoint = GENERICAPP_ENDPOINT;
12. GenericApp_Rout_epDesc.task_id = &GenericApp_TaskID;
13. GenericApp_Rout_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
14. GenericApp_Rout_epDesc.latencyReq = noLatencyReqs;
15. afRegister( &GenericApp_Rout_epDesc );
16.
17. aps_AddGroup(GENERICAPP_ENDPOINT, &Group_Rout);
18.
19. init_buzzer();
20. init_key();
21. init_sensor_io();
22. SensorId = *get_sensor_id();
23.
24. //初始化oled显示屏
25. oled_initial();
26. oled_disp_string(1,1,"武汉唯众智创科技");
27. oled_disp_string(3,1,"有限公司");
28. Delay_ms(500);
29.
30. //对传感器数据口P0.0 P0.1 P0.2 P0.3进行分类初始化
31. halUARTCfg_t uartConfig; //定义个串口结构体
32. uartConfig.configured = TRUE; //串口配置为真
33. uartConfig.baudRate = HAL_UART_BR_9600;
34. //波特率为9600
35. uartConfig.flowControl = FALSE; //流控制为假
36. uartConfig.callBackFunc = rxCB; //当模块收数据时,会调用这个函数进行处理
37. HalUARTOpen(HAL_UART_PORT_0,&uartConfig);
38. }
39. #pragma vector=P0INT_VECTOR
40. __interrupt void P0_IRQ()
41. {
42. P0IFG &= ~0X02;
43. SyjcFlag = 1;
44.
45. RfTx.Pack.Sid[0] = 20;
46. RfTx.Pack.Sid[1] = ' ';
47.
48. RfTx.Pack.Cmd[0] = 'S';
49. RfTx.Pack.Cmd[1] = 'N';
50. P0IF=0;
51. }
52.
53. static void GenericApp_SendTheMessage( void )
54. {
55. uint8 temp=0;
56. char charbuf[15] = "KeyName:";
57. static uint8* ptr = NULL;
58. static uint16_t sen=0;
59. SensorId = *get_sensor_id();
60. if(sen != SensorId){
61. sen = SensorId;
62. oled_clear_vertical(1);
63. sprintf(Str1,"%4X:%d:%04X:%d",_NIB.nwkPanId,_NIB.nwkLogicalChannel,ShortAddr,SensorId);
64. oled_disp_string(1,1,Str1);
65.
66. memset(RfTx.Buf,'x',sizeof(RfPacket_t));
67. memcpy(RfTx.Pack.Laddr,IeeeAddr,8); //8个字节 本设备IEEE地址
68. RfTx.Pack.Head = '#';
69. RfTx.Pack.Saddr[0] = ShortAddr;
70. RfTx.Pack.Saddr[1] = ShortAddr>>8;
71. RfTx.Pack.Tail = '$';
72. RfTx.Pack.Sid[0] = SensorId;
73. RfTx.Pack.Sid[1] = ' ';
74. RfTx.Pack.Cmd[0] = 'S';
75. RfTx.Pack.Cmd[1] = 'N';
76. }
77. switch(SensorId)
78. {
79. case S4_YD: //雨滴
80. ptr = get_aout_dout();
81. break;
82. case S17_RTHW: //人体红外
83. ptr = get_aout_dout();
84. break;
85. case S20_SYJC:
86. oled_clear_vertical(2);
87. sprintf(Str2,"Sig:%d",SyjcFlag);
88. oled_disp_string(3,1,Str2);
89. RfTx.Pack.Len = 1;
90. RfTx.Pack.Data[0] = SyjcFlag;
91. SyjcFlag = 0;
92. break;
93. default:
94. oled_clear_vertical(2);
95. oled_disp_string(3,1,"No sensor!");
96. RfTx.Pack.Len = 0;
97. break;
98. }
99.
100. if(SensorId==S4_YD|| SensorId==S17_RTHW)
101. {
102. sprintf(Str2,"Sig:%d Val:%d",ptr[0],ptr[2]);
103. oled_clear_vertical(2);
104. oled_disp_string(3,1,Str2);
105.
106. RfTx.Pack.Len = 3;
107. RfTx.Pack.Data[0] = ptr[0];
108. RfTx.Pack.Data[1] = ptr[1];
109. RfTx.Pack.Data[2] = ptr[2];
110. }
111. temp = AF_DataRequest(
112. &GenericApp_DstAddr, &GenericApp_epDesc,
113. SensorId,
114. sizeof(RfPacket_t),
115. (byte *)&RfTx.Buf,
116. &GenericApp_TransID,
117. AF_DISCV_ROUTE,
118. AF_DEFAULT_RADIUS);
119. if(temp != SUCCESS){
120. asm("NOP");121. }122. }
3)Android端软件代码:
实验步骤
1) 将ZIGBEE协调器插在A9网关上
2) 将ZIGBEE节点插到节点板上,同时插上语音识别模块
3) 将WIFI模块插到节点底板上,同时插上继电器模块
4) 将照明灯接到继电器的输出端
5) 用DC5V电源给A9网关供电,同时按下电源键3S开启网关
6) 用DC5V电源给节点底板供电
7) 用DC12V电源给照明灯上电
8) 对着语音识别模块说出一级指令“小唯”,观察屏幕显示“YES”后,继续说出二级指令“开灯”,识别成功则屏幕上显示“OK:KD”,观察照明灯是否开启。
9) 打开继电器节点模块 、语音识别节点模块 、照明灯;
10) 打开A9网关,并打开指定APP ;
11) 点击设置按钮 ,设置指定串口号和波特率 ,并设置WiFi服务器端端口号,开启服务器(默认情况WiFi服务器自动开启);
12) 对着语音识别模块说出指定命令(“开灯”/“关灯”),则对应照明灯会被点亮/关闭。
上一篇:物联网智能家居实训||实验二十二 安防报警布撤防实验
下一篇:物联网智能家居实训||实验二十四 物联网智能家居场景实验