stm32wifi多功能灯(毕业设计STM32多功能氛围灯)

本次分享的是STM32多功能氛围灯,涉及STM32开发、APP开发等,非常适合作为毕业项目使用。主要由STM32、WS2812、蓝牙模块为材料,可以用手机APP控制灯的颜色,还可以利用APP对单片机程序进行升级,解放用户双手,随时升级固件。(相关设计资料下拉文末查看)

☞功能设计

1、可以用按键控制灯的亮灭、亮度以及切换颜色

2、可以用按键控制灯的6种以上显示样式

3、设计一个外壳,让它更加美观

4、设计一个手机APP,实现按键的所有功能以及能够调节灯的任意颜色

5、设计一个手机APP升级单片机程序功能,能够把单片机程序保存到某个版本的手机APP中,手机APP点击升级,就可以完成对单片机程序的升级。

首先需要设计一个按键与单片机连接,编写多功能按键(单击、双击、长按)来控制灯的亮灭、亮度以及切换颜色以及6种以上显示样式;然后用CAD绘制一个与PCB大小合适的外壳,进行定制;用QT编写一个安卓APP,利用蓝牙模块与单片机进行通信,完成控制与升级的功能。

☞实现基础功能

LED选择:WS2812

既然是想做任意颜色的灯,那么毫无疑问选择最普遍的WS2812,24位全彩RGB彩灯,可以发出2^24=16777215种颜色。

stm32wifi多功能灯(毕业设计STM32多功能氛围灯)(1)

单片机选择:STM32G0

在当今MCU那么稀贵的情况下,当然是要为自己的腰包考虑,WS2812的驱动时钟大概需要800KHZ,速度要求很高,首先选择STM32,看了一下价格,选择了和蔼可亲的STM32G030c8t6,6元还包邮。

通信模块选择:蓝牙模块JDY-31

要手机控制灯,首先想到用蓝牙模块,价格考虑,选择全网最便宜的蓝牙模块JDY-31,比起HC-05,它更加小巧,就是连接速度不是很快。

有了这3个主要材料,我们就可以开始设计一下原理图

☞原理图设计

单片机需要3.3V供电,首先设计一个电源部分,先用usb进行供电5V给ws2812,再用降压芯片降压到3.3V供给MCU,

stm32wifi多功能灯(毕业设计STM32多功能氛围灯)(2)

设计一个单片机最小系统,以及预留一个下载接口,方便使用ST-LINK进行下载程序。

stm32wifi多功能灯(毕业设计STM32多功能氛围灯)(3)

然后要连接一个蓝牙和一个按键作为控制,再预留一个LED作为指示灯。

stm32wifi多功能灯(毕业设计STM32多功能氛围灯)(4)

RGB灯的电路设计,这里两组LED,用两个IO口控制,防止LED过多导致信号失真。

stm32wifi多功能灯(毕业设计STM32多功能氛围灯)(5)

这样一张原理图就设计好啦。

☞第一版本PCB设计

根据原理图给定相应的封装导入PCB,再进行布局与布线,设计好一块给淘宝客服能够打印出来的PCB图纸。这里推荐嘉立创,便宜,质量也高。

打印出PCB之后,当然是要把元器件焊接到PCB板上,第一块板焊接的时候先不用一次性全部焊接上去,先焊接电源部分,看看电源芯片是否能够正常工作,比如我画的这块板子USB母座封装与原理图不对应,导致正负极直接反向,就很容易导致元器件损坏,检测完电压正常之后,再焊接其他元器件。

stm32wifi多功能灯(毕业设计STM32多功能氛围灯)(6)

☞编写单片机程序

单片机程序包含了很多知识:

1、轻量级多任务系统

2、蓝牙数据自定义控制协议、蓝牙无线升级单片机

3、多种控制方式按键 蓝牙

4、多功能按键,单击、双击、长按

5、ws2812串联控制

6、呼吸灯算法

7、颜色渐变算法

/*****************************************函数名称: DIS_TASK()*输入参数:无*输出参数:无*功能:显示任务*****************************************/void DIS_TASK(void){ static u8 r=0,g=0,b=0,a=0,dir=0; static int i,cnt=0; static int color_rgb; SCHTaskBegin(); //开始固定格式一定要的 while (1) { if(SysState.Dis_flag == 1)//可以更新显示 { /***********************静态*******************************/ if(SysState.Dismode == DisMode_Static)//静态 { SysState.Dis_flag = 0; RGB_Refresh(SysState.StaticRgb,LED_NUM);//显示 RGB2_Refresh(SysState.StaticRgb,LED_NUM);//显示 }
/***********************呼吸*******************************/ else if(SysState.Dismode == DisMode_Breathe)//呼吸 { SysState.Dedlay_Time=20; if(dir==0) { a = (1 a*10/0xff); if(a > 0xf0)dir = 1; }else if(dir) { a -= (1 a*10/0xff); if(a
r = ((SysState.StaticRgb>>16)%0x100)*a/0xff; g = ((SysState.StaticRgb>>8)%0x100)*a/0xff; b = ((SysState.StaticRgb>>0)%0x100)*a/0xff; color_rgb = (r</显示 RGB2_Refresh(color_rgb,LED_NUM);//显示 SCHCurTaskDly(SysState.Dedlay_Time); }
/***********************闪烁*******************************/ else if(SysState.Dismode ==DisMode_Twinkle)//闪烁 { SysState.Dedlay_Time=200;//*SysState.Dedlay_Ratio/0x0f;; RGB_Refresh(SysState.StaticRgb,LED_NUM); RGB2_Refresh(SysState.StaticRgb,LED_NUM); SCHCurTaskDly(SysState.Dedlay_Time); RGB_Refresh(0,LED_NUM); RGB2_Refresh(0,LED_NUM); SCHCurTaskDly(SysState.Dedlay_Time); }
/***********************渐变*******************************/ else if(SysState.Dismode ==DisMode_GraChange)//渐变 { extern u8 GraChange_flag; SysState.Dedlay_Time=100;//*SysState.Dedlay_Ratio/0x0f; RgbAlg(&SysState.StaticRgb,&GraChange_flag);//渐变算法 RGB_Refresh(SysState.StaticRgb,LED_NUM);//显示 RGB2_Refresh(SysState.StaticRgb,LED_NUM);//显示 SCHCurTaskDly(SysState.Dedlay_Time); }
/***********************蹦迪*******************************/ else if(SysState.Dismode == DisMode_DiscoDance)//蹦迪 { SysState.Dedlay_Time=20;//*SysState.Dedlay_Ratio/0x0f; RGB_Refresh(Static_DisColor[cnt],LED_NUM); RGB2_Refresh(Static_DisColor[cnt],LED_NUM); SCHCurTaskDly(SysState.Dedlay_Time); RGB_Refresh(0,LED_NUM); RGB2_Refresh(0,LED_NUM); SCHCurTaskDly(SysState.Dedlay_Time*50); }
/***********************流水*******************************/ else if(SysState.Dismode == DisMode_RunWater)//流水 { static int i=0,flag=0; SysState.Dedlay_Time=100; i ; if(i == LED_NUM) { i=0;flag=!flag; } if(flag){ //设置颜色 RGB_Refresh(SysState.StaticRgb,i 1); RGB2_Refresh(SysState.StaticRgb,i 1); SysState.Dedlay_Time=50;//*SysState.Dedlay_Ratio/0x0f; SCHCurTaskDly(SysState.Dedlay_Time); } else{ //灭 RGB_Refresh(0,i 1); RGB2_Refresh(0,i 1); SysState.Dedlay_Time=50;//*SysState.Dedlay_Ratio/0x0f; SCHCurTaskDly(SysState.Dedlay_Time); }
}
/***********************用户*******************************/ else if(SysState.Dismode ==DisMode_User1) //用户 { SysState.Dedlay_Time=1000; RGB_Refresh(SysState.StaticRgb,1); RGB2_Refresh(0,1); SCHCurTaskDly(SysState.Dedlay_Time); RGB2_Refresh(SysState.StaticRgb,1); RGB_Refresh(0,1); SCHCurTaskDly(SysState.Dedlay_Time); } } SCHCurTaskDly(10); } SCHTaskEnd(); //结束固定格式一定要的}

☞外壳设计

感觉没有一个外壳会很难看,添加一个外壳,让世界变得美丽。

stm32wifi多功能灯(毕业设计STM32多功能氛围灯)(7)

☞重新设计PCB

重新布局设计出来第3版本成品板:PCBV1.3

stm32wifi多功能灯(毕业设计STM32多功能氛围灯)(8)

☞QT安卓APP设计

QT代码可以在文末的链接中查看,这里就不展示了。下面是APP界面:

stm32wifi多功能灯(毕业设计STM32多功能氛围灯)(9)

氛围灯设计资料下载可以找我拿,说了这么多,大家记得留意下方评论第一条(或者私信我)有干货~

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页