资讯详情

第五章 STM32+LD3320语音识别控制淘宝USB宿舍书桌灯

前言

一、设备准备

二、改造USB宿舍书桌灯

1.原理

2.拆下控灯板的护壳

3.在控灯板的供电端GND焊接杜邦线

4.将每个触发脚焊接到杜邦线上

三、代码解释

1.首先初始化控灯GPIO口;

2.写几个控灯GPIO口腔工作状态;

3.将灯的默认状态放入main函数的while循环内。

4.在相应的控灯语音部分添加控灯语句;


前言

前几章,我们介绍了LD语音识别模块3320,SYN6288语音合成模块和DHT基于11温湿度传感器模块的开发STM32语音识别查询温湿度小,但还是比较简单的,所以我去淘宝买了一块USB的宿舍书桌LED灯,改造一波,让我们通过语音命令控制LED灯。


一、设备准备

STM32F103C8T6、LD3320语音识别、SYN语音合成模块6288,DHT11温湿度传感器,STLink下载器、胶水(有条件的电烙铁)、杜邦线淘宝购买USB宿舍书桌LED灯(如下图所示)。

二、改造USB宿舍书桌灯

1.原理

淘宝购买的USB宿舍LED灯的开关、亮度调节、冷暖色调由控灯芯片结合外部按键电路实现的,,因此,我们可以对控灯芯片的外部电路做一个小的改造,如下图所示(PA控制开关,PA5.提高照明亮度,PA4降低亮度,PA3)改变灯光颜色)。

2.拆下控灯板的护壳

USB宿舍书桌灯的控灯电路板受外壳保护(下图红色框),要拆开。

拆卸后,电路板正面是这样的(忽略图中焊接的杜邦线)。

背面是这样的(忽略图中焊接的杜邦线)。

3.在控灯板的供电端GND焊接杜邦线

在供电端的GND一条线(上图所示)有两个功能:

1.其是与STM32上的GND引脚连接实现共地(不共地,STM32控制不了灯),

2.可以用这个引出。GND触摸控灯电路板上每个按钮的四个脚。当触摸哪个按钮脚时,灯的状态可以相应地改变。然后这个按钮脚是我们可以通过按钮直接控制灯芯片信号的脚(我们称之为触发脚),并根据以下视频方法找到触发脚。

用GND找到触发脚的线

/h3>

        找到每个按键的触发脚后,焊上杜邦线,如下图所示(说明:图中控制降低亮度的杜邦线断了)。

        然后杜邦线的另一端直接与STM32的IO口相连接(如下图所示),这样,只要STM32相应IO口输出一段低电平,就可以实现相应的控灯效果了。

三、代码讲解

        代码方面也是比较简单,只要在第四章的代码中增加几句控灯语句就可以了。(第四章链接STM32+LD3320+SYN6288+DHT11实现语音获取温湿度数值(下))

1.首先初始化一下控灯的GPIO口;

        初始化与控灯芯片相连接的GPIO口,这里我用的是PA2、PA3、PA4和PA5,大家可以根据自己的实际情况做出更改。

void led_init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//使能GPIOA时钟
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; //PA2 PA3 PA4 PA5
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	//复用推挽输出
	
		GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA

}

 2.编写几个控灯GPIO口的工作状态;

        这里说明一下,。(这就好比你同时按两个或三个按键,这肯定是不正常的操作,正常只能按一个按键来控灯)。还有就是当PA2控制灯关闭后,其他三个GPIO口的控制是没有效果的,毕竟灯都关了,还怎么调节亮度和颜色。

//每个与控灯芯片连接的IO口默认输出高电平
void led_default(void)
{
		GPIO_SetBits(GPIOA,GPIO_Pin_2);
		GPIO_SetBits(GPIOA,GPIO_Pin_3);
		GPIO_SetBits(GPIOA,GPIO_Pin_4);
		GPIO_SetBits(GPIOA,GPIO_Pin_5);
}
//PA2输出500毫秒低电平,控制打开关闭
void led_onoff(void)
{
		GPIO_ResetBits(GPIOA,GPIO_Pin_2);
		delay_ms(500);
}
//PA3输出500ms低电平,提高亮度
void led_raise(void)
{
		GPIO_ResetBits(GPIOA,GPIO_Pin_3);
		delay_ms(500);
}
//PA5输出500ms低电平,降低亮度
void led_down(void)
{
		GPIO_ResetBits(GPIOA,GPIO_Pin_5);
		delay_ms(500);
}
//PA4输出500ms低电平,改变颜色
void led_change(void)
{
		GPIO_ResetBits(GPIOA,GPIO_Pin_4);
		delay_ms(1000);
}

3.将灯的默认状态放入main函数的while循环内。

        没有控制LED灯时,与控灯芯片相连接的四个GPIO口保持高电平。

while(1)
		{
				led_default();  //没有控制按键时,保持默认状态
			
				switch(ASR_Status)
				{
						case LD_ASR_RUNING:							
						case LD_ASR_ERROR:							
								 break;						
						case LD_ASR_NONE:
						{
								ASR_Status=LD_ASR_RUNING;
							
								if (RunASR()==0) 
								{
									ASR_Status = LD_ASR_ERROR;
								}
								break;
						}
						case LD_ASR_FOUNDOK: 																				
						{
								nASR_Res = LD3320_GetResult();		//获取结果												
								User_Modification(nASR_Res);
								ASR_Status = LD_ASR_NONE;
								break;
						}
						case LD_ASR_FOUNDZERO:
						default:
						{
								ASR_Status = LD_ASR_NONE;
								break;
						}
				} 
		}

 4.在相应的控灯语音部分添加控灯语句;

        在识别码 CODE_1KL1、CODE_1KL2、CODE_1KL3、CODE_1KL4下添加相应控灯语句。(为什么在这几个识别码下添加,可看第三章 LD3320语音识别模块的使用)

void User_Modification(uint8_t data)
{
	if(data == CODE_CMD)				// CODE_CMD:"xiao jie"的识别码
		{
				flag=1;
				SYN_FrameInfo(0, "[v16][m0][t5]主人,我在");
		}
		else if(flag)
		{
				flag=0;
				switch(data)				
				{
						case CODE_DMCS:				// CODE_DMCS:"ni hao ya"的识别码	
							SYN_FrameInfo(0, "[v16][m0][t5]你好");
								break;
						case CODE_CSWB:			// CODE_CSWB:"zai gan ma ne"的识别码
							SYN_FrameInfo(0, "[v16][m0][t5]在学习");
								break;						
						case CODE_1KL1:		//CODE_1KL1:"kai deng"的识别码,往下以此类推
							//执行开灯操作,并回答“已为你打开灯”	
							led_onoff();
							SYN_FrameInfo(0, "[v16][m0][t5]已为你打开灯");
								break;
						case CODE_1KL2:	
							//执行关灯操作,并回答“已为你关闭灯”
							led_onoff();
							SYN_FrameInfo(0, "[v9][m0][t5]已为你关闭灯");
								break;
						case CODE_1KL3:	
							//执行调亮操作,并回答“已为你提高亮度”
							led_raise();
							SYN_FrameInfo(0, "[v9][m0][t5]已为你提高亮度");
								break;
						case CODE_1KL4:	
							//执行变色操作,并回答“已为你改变颜色”
							led_change();
							SYN_FrameInfo(0, "[v9][m0][t5]已为你改变颜色");
								break;
						case CODE_2KL1:	
							//回答“温度是XX摄氏度”
							Read_DHT_Data(wendu,shidu);	//读取温湿度值
							Tempconverspeech(wendu,shidu,0x01);
								break;
						case CODE_2KL2:	
							//回答“湿度是百分之XXRH”
							Read_DHT_Data(wendu,shidu);	//读取温湿度值
							Tempconverspeech(wendu,shidu,0x02);
								break;
						case CODE_2KL3:	
							//执行打开风扇操作,并回答“已为你打开风扇”
							SYN_FrameInfo(0, "[v9][m0][t5]已为你打开风扇");
								break;
						case CODE_2KL4:	
							//执行关闭风扇操作,并回答“已为你关闭风扇”
							SYN_FrameInfo(0, "[v9][m0][t5]已为你关闭风扇");
								break;								
						case CODE_3KL1:	
							//执行开门操作,并回答“已开门”
							SYN_FrameInfo(0, "[v9][m0][t5]已开门");
								break;
						case CODE_3KL2:	
							//执行开门操作,并回答“已关门”
							SYN_FrameInfo(0, "[v9][m0][t5]已关门");
								break;
						case CODE_5KL1:	
							
								break;
						
						default:break;
				}
		}
}

        怕有些同学看文章了之后不知道怎么添加到第四章的代码中,所以我把写好的代码放在我的公众号里了,。按照资料链接里的接线图把每个模块用杜邦线连接好,然后把代码烧录进入就愉快的玩耍了。

效果视频:(忘记使用语音指令“太暗了”,有兴趣的可以买模块自行尝试)

控灯

           


标签: 温湿度传感器怎么连接ni300pa2pa传感器ld11传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台