目录
前言
一、设备准备
二、改造USB宿舍书桌灯
1.原理
2.将控灯板子的护壳拆开
3.在控灯板子供电端的GND焊上一根杜邦线
4.将每个触发脚焊上杜邦线
三、代码讲解
1.首先初始化一下控灯的GPIO口;
2.编写几个控灯GPIO口的工作状态;
3.将灯的默认状态放入main函数的while循环内。
4.在相应的控灯语音部分添加控灯语句;
前言
前面几个章节,我们介绍了LD3320语音识别模块、SYN6288语音合成模块和DHT11温湿度传感器模块,并开发了基于STM32的语音识别查询温湿度小项目,但还是比较简单,所以我专门去淘宝买了一块USB的宿舍书桌LED灯,将其改造一波,让我们能够通过语音命令就能控制LED灯。
一、设备准备
STM32F103C8T6、LD3320语音识别、SYN6288语音合成模块、DHT11温湿度传感器、STLink下载器、胶水(有条件的用电烙铁)、杜邦线和淘宝购买的USB宿舍书桌LED灯(下图所示)。
二、改造USB宿舍书桌灯
淘宝购买的USB宿舍LED灯的打开关闭、亮度调节、冷暖色调节都是由控灯芯片结合外部按键电路实现的,相应按键按下,控灯芯片实现相应功能,所以我们可以对控灯芯片外部电路做个小小改造一下,让STM32的IO引脚越过按键,直接给控灯芯片控制信号(一段低电平信号),如下图所示(PA2控制打开关闭,PA5提高灯光亮度,PA4降低亮度,PA3改变灯光颜色)。
USB宿舍书桌灯的控灯电路板被外部护壳保护着(下图红色框),所以我们要将其拆开。
拆开后,电路板正面是这样子(忽略图中的焊接的杜邦线)。
背面是长这样子的(忽略图中焊接的杜邦线)。
在供电端的GND引出的一根线(上图所示),有两个作用:
1.其是与STM32上的GND引脚相连接实现共地(不共地,STM32控制不了灯),
2.可以用这根引出的GND线去触碰控灯电路板上每个按键的四个脚,哪个按键脚被触碰时,灯的状态能做出相应改变,那么这个按键脚就是可以我们可以越过按键直接给控灯芯片控制信号的脚(后面我们称其为触发脚),按照下面视频方法找到触发脚。(LED灯要上电)
用GND线找到触发脚
找到每个按键的触发脚后,焊上杜邦线,如下图所示(说明:图中控制降低亮度的杜邦线断了)。
然后杜邦线的另一端直接与STM32的IO口相连接(如下图所示),这样,只要STM32相应IO口输出一段低电平,就可以实现相应的控灯效果了。
三、代码讲解
代码方面也是比较简单,只要在第四章的代码中增加几句控灯语句就可以了。(第四章链接STM32+LD3320+SYN6288+DHT11实现语音获取温湿度数值(下))
初始化与控灯芯片相连接的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
}
这里说明一下,任何时候与控灯芯片相连接的四个GPIO口最多只能有一个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);
}
没有控制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;
}
}
}
在识别码 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;
}
}
}
怕有些同学看文章了之后不知道怎么添加到第四章的代码中,所以我把写好的代码放在我的公众号里了,关注下方公众号发送“语音控灯”就可以获取资料链接了。按照资料链接里的接线图把每个模块用杜邦线连接好,然后把代码烧录进入就愉快的玩耍了。
效果视频:(忘记使用语音指令“太暗了”,有兴趣的可以买模块自行尝试)
控灯