1项目介绍
该项目是我利用STM32单片机与WS2812彩色LED灯珠所作的一款智能彩色灯光控制系统。可通过手机APP软件,利用蓝牙设备远程控制灯光的亮灭,以及颜色的变化。
2相关硬件与软件
主控:STM32F103C6T6
供电系统:锂离子电池包
HT7750SA芯片将电压升到5V
ADI公司生产ADP151AUJZ进行3.3V供电
充电系统:美信MAX1811芯片为锂电池进行充电管理
蓝牙模块:JDY-31模块
LED彩色灯珠控制芯片:WS2812b芯片
主控编译软件:KEIL5
APP编译软件:MIT app inventor在线编译器
相应的硬件电路图为:
该图为STM32主控芯片的最小系统电路图。
该图为HT7750SA芯片,ADI公司生产ADP151AUJZ进行3.3V供电,美信MAX1811芯片的相应电路图。
下图为具体功能实现的流程图框图。首先完成该相关芯片模块的初始化功能,其中包括串口的输入输出功能、时钟配置、定时器初始化、DMA初始化。其中由于WS2812b需要利用PWM的不同占空比对其进行控制,并且每个时间周期太短,只有几微秒,普通的IO口电平反转方式根本来不及反应,因此采用定时器与DMA功能结合的方式,产生高速PWM,对灯珠进行控制。在初始化任务完成之后,首先对UART串口处所接收的信息进行检测,如果有主机蓝牙与板载蓝牙相连接,串口便可收到相应的信息。利用这一点,判断系统是否有上位机进行连接。若有蓝牙连接进入,则开启灯的闪烁,表示蓝牙的连接成功。在蓝牙连接完成之后,开始循环检测是否有数据接收到,如果接收到相应的数据,对其进行判断,是否为灯光命令,若为灯光命令,则将相应的信息提取出来,改变三原色的亮度比例,更换其他颜色,若不为灯光命令,则应该为蓝牙断开连接的信息,控制系统关闭灯珠。其流程框图如图所示。
3代码说明
这里针对相关代码进行展示与介绍,其中包括利用KEIL5编辑的STM32单片机程序,以及利用MIT App Inventor在线编译器编译的APP图形程序。以下为具体的程序片段。
int main(void)
{
u16 temp;
const char s[2] = "<";
char *token;
SystemInit();
delay_init();
delay_ms(180);
uart_init(9600);
Timer2_init();
该代码为初始化代码,可以看到,这里对单片机的时钟设置、延时功能以及串口功能和定时器与DMA相关功能进行初始化。
for(;;)
{
if((USART_RX_STA&0x8000))//´®¿ÚÐÅÏ¢ÊÕ¼¯
{
for(temp=0;temp<100;temp++)
{
comd[temp] = (char) USART_RX_BUF[temp];
USART_RX_BUF[temp]=0;
}
token = strtok(comd, s);
if(strcmp(token,"+CONNECTING")==0)
{
connect=1;
for(i=0;i<53;i++)
{
WS2812_send(&rgb1[i],1);
delay_ms(20);
}
for(i=0;i<53;i++)
{
WS2812_send(&rgb2[i],1);
delay_ms(20);
}
for(i=0;i<53;i++)
{
WS2812_send(&rgb3[i],1);
delay_ms(20);
}
WS2812_send(&rgb0[0],1);
USART_RX_STA=0;
break;
}
}
}
该部分代码主要为对蓝牙是否连接成功进行相应的检测。首先判断串口是否接收到相关信息,其次对相应的信息进行分析,判断其是否为蓝牙连接成功的消息,在判断成功之后,使LED灯珠闪烁三下,表示已经正常连接,可以进行下一步命令。
if((USART_RX_STA&0x8000))//
{
if(connect==0)
{
for(temp=0;temp<100;temp++)
{
comd[temp]=(char)USART_RX_BUF[temp];
USART_RX_BUF[temp]=0;
}
token = strtok(comd, s);
if(strcmp(token,"+CONNECTING")==0)
{
connect=1;
for(i=0;i<53;i++)
{
WS2812_send(&rgb1[i],1);
delay_ms(20);
}
for(i=0;i<53;i++)
{
WS2812_send(&rgb2[i],1);
delay_ms(20);
}
for(i=0;i<53;i++)
{
WS2812_send(&rgb3[i],1);
delay_ms(20);
}
}
WS2812_send(&rgb0[0],1);
USART_RX_STA=0;
}
else
{
for(temp=0;temp<100;temp++)
{
comd2[temp]=USART_RX_BUF[temp];
USART_RX_BUF[temp]=0;
}
USART_RX_STA=0;
if((comd2[0]==0x2b)&&(comd2[1]==0x44)&&(comd2[2]==0x49)&&(comd2[3]==0x53))
{
connect=0;
WS2812_send(&rgb0[0],1);
delay_ms(2);
WS2812_send(&rgb0[0],1);
}
else
{
rgb4[0][0]=comd2[0];//RED
rgb4[0][1]=comd2[1];//GREEN
rgb4[0][2]=comd2[2];//BLUE
WS2812_send(&rgb4[0],1);
delay_ms(2);
WS2812_send(&rgb4[0],1);
}
}
}
该部分程序主要判断系统在正常运行的过程中是否收到了相关信息通知。首先按照蓝牙连接初始化的方式检测蓝牙是否断开。若检测到断开连接的消息,则关闭灯珠。若收到其他类型的消息,可将命令提取出来,执行相应的操作。
有关于相应APP的开发程序,为了避免过于麻烦的开发流程,这里使用了MIT App Inventor在线编译器,该编译器可以在网页上快速开发一款APP,用于各种项目。该编译器使用图形化程序进行编写,这里使用程序图进行展示。
4功能演示
下面对相关的功能进行演示。首先展示利用PCB板图制作的实物图片。
其次为控制灯泡颜色与亮度的情况。
最后为为电池充电时的工作情况。将开关拨动回关闭挡位,可开启电池充电功能。将type C充电口插入系统,便可为锂离子电池充电。
5心得体会
通过这次学习,使我重新学习了PCB整体制作过程,提高了硬件开发的能力。