通过语音控制家电是我本次评测项目的一个重点,这次实验使用的是从某宝购买的语音识别模块,这个模块具有较高的性价比,缺点就是无法改变识别的内容,只能使用其定制好的语音命令。下面是实验过程中的照片:
下图是语音识别模块,模块通过串口与单片机进行通讯:
为了方便测试,我使用了一块192*64的LCD显示屏来展现相关的信息:
输出控制部分暂时使用了一块四路继电器模块,在各个继电器上标注了被控制的家电设备,并没有真正连接器对应的家电设备,在测试过程中可以通过观察对应的LED灯亮灭确定执行何种操作,同时也会在LCD屏幕上显示相应的内容:
实验过程并不复杂,因为语音识别在模块内完成,并通过串口将信息发送到单片机,单片机仅仅是将接收到的信息提取几个关键点进行判别,然后显示相应的内容并改变对应的GPIO电平的高低,从而驱动继电器动作,代码如下:
void yy_handler(void)
{
uint8_t f0,f1,f2,f3,f4;
f1 = rx_buffer[16]; //取关键字
f2 = rx_buffer[22];
f3 = rx_buffer[23];
f4 = rx_buffer[24];
LCD_clear_line(2);
LCD_clear_line(3);
/*
LCD_write_HEX(40,4,f1);
LCD_write_HEX(70,4,f2);
LCD_write_HEX(100,4,f3);
LCD_write_HEX(130,4,f4);
*/
switch (f1){
case 0x63:
switch (f3){
case 0x63:
LCD_write_BG(20,2,(uint8_t *)"关闭风扇");
OutFs_0;
break;
case 0x64:
LCD_write_BG(20,2,(uint8_t *)"关闭灯光");
OutDg_0;
break;
case 0x6e:
LCD_write_BG(20,2,(uint8_t *)"关闭空调");
OutKt_0;
break;
default:
LCD_write_BG(20,2,(uint8_t *)"暂未处理");
}
break;
case 0x64:
switch (f2){
case 0x61:
switch (f3){
case 0x69:
LCD_write_BG(20,2,(uint8_t *)"打开开关");
OutKg_1;
break;
case 0x6f:
LCD_write_BG(20,2,(uint8_t *)"打开照明");
break;
default:
LCD_write_BG(20,2,(uint8_t *)"暂未处理");
}
break;
case 0x66:
LCD_write_BG(20,2,(uint8_t *)"打开吹风机");
break;
case 0x69:
LCD_write_BG(20,2,(uint8_t *)"打开饮水机");
break;
case 0x6e:
LCD_write_BG(20,2,(uint8_t *)"打开电饭煲");
break;
case 0x75:
switch (f3){
case 0x61:
LCD_write_BG(20,2,(uint8_t *)"打开暖气");
break;
case 0x62:
LCD_write_BG(20,2,(uint8_t *)"打开浴霸");
break;
default:
LCD_write_BG(20,2,(uint8_t *)"暂未处理");
}
break;
default:
LCD_write_BG(20,2,(uint8_t *)"暂未处理");
}
break;
case 0x65:
LCD_write_BG(20,2,(uint8_t *)"进入休眠");
break;
case 0x67:
switch (f2){
case 0x61:
LCD_write_BG(20,2,(uint8_t *)"关闭电饭煲");
break;
case 0x63:
LCD_write_BG(20,2,(uint8_t *)"关闭吹风机");
break;
case 0x6b:
LCD_write_BG(20,2,(uint8_t *)"关闭开关");
OutKg_0;
break;
case 0x6e:
LCD_write_BG(20,2,(uint8_t *)"关闭暖气");
break;
case 0x79:
switch (f3){
case 0x69:
LCD_write_BG(20,2,(uint8_t *)"关闭饮水机");
break;
case 0x75:
LCD_write_BG(20,2,(uint8_t *)"关闭浴霸");
break;
default:
LCD_write_BG(20,2,(uint8_t *)"暂未处理");
}
break;
case 0x7a:
LCD_write_BG(20,2,(uint8_t *)"关闭照明");
break;
default:
LCD_write_BG(20,2,(uint8_t *)"暂未处理");
}
break;
case 0x6f:
switch (f2){
case 0x64:
LCD_write_BG(20,2,(uint8_t *)"打开灯光");
OutDg_1;
break;
case 0x65:
LCD_write_BG(20,2,(uint8_t *)"打开风扇");
OutFs_1;
break;
case 0x6e:
LCD_write_BG(20,2,(uint8_t *)"打开空调");
OutKt_1;
break;
default:
LCD_write_BG(20,2,(uint8_t *)"暂未处理");
}
break;
case 0x74:
switch (f2){
case 0x5f:
LCD_write_BG(20,2,(uint8_t *)"打开台灯");
break;
case 0x66:
LCD_write_BG(20,2,(uint8_t *)"关闭台灯");
break;
default:
LCD_write_BG(20,2,(uint8_t *)"暂未处理");
}
break;
case 0x77:
LCD_write_BG(20,2,(uint8_t *)"准备就绪");
break;
default:
LCD_write_BG(20,2,(uint8_t *)"暂未处理");
}
}
下面的动画是实验时继电器的动作情况:
这是实验时LCD屏幕显示的内容: