基于stm32作品设计:多功能氛围灯、手机APP无线控制ws2812,MCU无线升级程序 您所在的位置:网站首页 音乐氛围灯软件哪个好用 基于stm32作品设计:多功能氛围灯、手机APP无线控制ws2812,MCU无线升级程序

基于stm32作品设计:多功能氛围灯、手机APP无线控制ws2812,MCU无线升级程序

2024-06-29 05:46| 来源: 网络整理| 查看: 265

文章目录 一、作品背景二、功能设计与实现过程三、实现基础功能(一)、首先是要选材(二)、原理图设计(二)、第一版本PCB设计(三)、焊接PCB板(四)编写单片机程序(五)下载程序验证 四、外壳设计(一)CAD图纸设计(二)磨砂亚克力板 五、重新设计PCB六、QT安卓APP设计(一)界面设计(二)QT程序设计(三)APP功能设计

作品哔哩哔哩视频:https://www.bilibili.com/video/BV1Yb4y1a7AQ#reply5536921990 资料链接: 蓝牙彩灯v1.01资料链接: CSDN: https://download.csdn.net/download/mbs520/25149435 百度网盘: https://pan.baidu.com/s/14Vout7Q2P6JBDZCCd8Gm6w 提取码:b7it

蓝牙彩灯v1.03资料链接: https://download.csdn.net/download/mbs520/25150035 取走记得点赞~ 有问题可以在评论区发表或者私信 在这里插入图片描述

实物链接:https://m.tb.cn/h.56p8Lt8?tk=jLixWYHUq6z CZ0001

一、作品背景

在智能的2021年代,年轻的小伙伴都患上了懒惰的症状,我也一样。 有一个难以入眠的夜晚,我打开了王者荣耀,我习惯了玩手机都要开着灯打,这样可以减少对眼睛的损伤,终于,赢了好几把,时间已经到了凌晨2点半,我也开始有了睡意,当我放下手机,准备闭眼入睡时,发现灯光格外耀眼,心烦意乱,实在不想按下那下床走好几步才能触碰到的开关,但是房间的设计就是这样,无法改变。无奈的我还是挣扎地下床按下了开关,这才安心入睡。 作为学电子专业的我并不妥协,我一定要设计一个不下床就可以关掉的灯。

二、功能设计与实现过程

(一)功能设计 1、可以用按键控制灯的亮灭、亮度以及切换颜色 2、可以用按键控制灯的6种以上显示样式 4、设计一个外壳,让它更加美观 5、设计一个手机APP,实现按键的所有功能以及能够调节灯的任意颜色 6、设计一个手机APP升级单片机程序功能,能够把单片机程序保存到某个版本的手机APP中,手机APP点击升级,就可以完成对单片机程序的升级。 (二)实现的过程 1、设计一个按键与单片机连接,编写多功能按键(单击、双击、长按)来控制灯的亮灭、亮度以及切换颜色以及6种以上显示样式

2、用CAD绘制一个与PCB大小合适的外壳,交给淘宝定制

3、用QT编写一个安卓APP,利用蓝牙模块与单片机进行通信,完成控制与升级的功能

三、实现基础功能 (一)、首先是要选材

1、LED选择:WS2812 既然是想做任意颜色的灯,那么毫无疑问选择最普遍的WS2812,24位全彩RGB彩灯,可以发出2^24=16777215种颜色。 在这里插入图片描述

2、单片机选择:STM32G0 在当今MCU那么稀贵的情况下,当然是要为自己的腰包考虑,WS2812的驱动时钟大概需要800KHZ,速度要求很高,首先选择stm32,看了一下价格,选择了和蔼可亲的stm32g030c8t6,6元还包邮 在这里插入图片描述 3、通信模块选择:蓝牙模块JDY-31 要手机控制灯,首先想到用蓝牙模块,价格考虑,选择全网最便宜的蓝牙模块JDY-31,比起HC-05,它更加小巧,就是连接速度不是很快 在这里插入图片描述

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

(二)、原理图设计

1、单片机需要3.3V供电,首先设计一个电源部分,先用usb进行供电5V给ws2812,再用降压芯片降压到3.3V供给MCU, 在这里插入图片描述

2、设计一个单片机最小系统,以及预留一个下载接口,方便使用ST-LINK进行下载程序 在这里插入图片描述 3、然后要连接一个蓝牙和一个按键作为控制,再预留一个LED作为指示灯 在这里插入图片描述 4、RGB灯的电路设计,这里两组LED,用两个IO口控制,防止LED过多导致信号失真 在这里插入图片描述 这样一张原理图就设计好啦

(二)、第一版本PCB设计

1、根据原理图给定相应的封装导入PCB,再进行布局与布线,设计好一块给淘宝客服能够打印出来的PCB图纸 2D: 在这里插入图片描述

3D: 在这里插入图片描述 然后交给淘宝,这里推荐嘉立创,便宜,质量也高。 这是打印出来的第一板PCB: 在这里插入图片描述

(三)、焊接PCB板

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

在这里插入图片描述

(四)编写单片机程序

单片机程序包含了很多知识 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 >16)%0x100)*a/0xff; g = ((SysState.StaticRgb>>8)%0x100)*a/0xff; b = ((SysState.StaticRgb>>0)%0x100)*a/0xff; color_rgb = (r 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(); //结束固定格式一定要的 } (五)下载程序验证

下载程序后测试ws2812是否正常工作

四、外壳设计 (一)CAD图纸设计

感觉没有一个外壳会很难看,添加一个外壳,让世界变得美丽 在这里插入图片描述在这里插入图片描述

这中间的洞尺寸有误:5乘7改7乘7

在这里插入图片描述

(二)磨砂亚克力板

淘宝搜磨砂亚克力板定制,发送CAD图纸给师傅,就可以给你做了 这是做好的亚克力板,是按照PCB板尺寸量身定做的 在这里插入图片描述

五、重新设计PCB

重新布局设计出来第3版本成品板:PCBV1.3 在这里插入图片描述 这是打样后焊接好的样子: 在这里插入图片描述

六、QT安卓APP设计 (一)界面设计

在这里插入图片描述

(二)QT程序设计

展示部分代码:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { this->Start_Init(); this->File_Init(); this->BuleTooth_Init(); this->Label_Init(); this->PushButton_Init(); this->ColorSlider_Init(); this->setFocus(); } MainWindow::~MainWindow() { bin_save(FileInfo); delete ui; } //起始代码 void MainWindow::Start_Init() { //设置背景图片 this->setStyleSheet("QMainWindow{border-image: url(:/pic/btmenuv2.jpg);}"); //获取屏幕大小 QScreen *screen = QApplication::screens().at(0); src_w = screen->size().width(); src_h = screen->size().height(); if(src_w this->setGeometry(0,0,src_w,src_h);//1080 2267 qDebug() QColor color; color.setRgb(0x00,0x00,0x00); colorslider_R = new ColorSlider(this); colorslider_G = new ColorSlider(this); colorslider_B = new ColorSlider(this); colorslider_A = new ColorSlider(this); colorslider_R->init(ColorSlider::RGB,ColorSlider::RED,color,0x00,0xFF);qDebug() time1->start(100); if(Connect_Flag == 1)//连接指示 { Connect_Flag = 0; btcwindow->hide(); this->show(); QMessageBox::information(this,tr("提示"),tr("蓝牙连接成功!")); QByteArray arrayData; //发送空指令 QString s = QString("NONE\r\n"); qDebug() int r,g,b; r = FileInfo->color_tab[i]>>16; g = (FileInfo->color_tab[i]>>8)%256; b = FileInfo->color_tab[i]%256; phbutton[i] = new QPushButton(this); if(isetGeometry(90+i*200*src_w/1080,1600*src_h/2267,100*src_w/1080,100*src_h/2267); else if(i>=5)phbutton[i]->setGeometry(90+(i-5)*200*src_w/1080,1800*src_h/2267,100*src_w/1080,100*src_h/2267); QString s = QString("background-color: rgb(%1, %2, %3);").arg(r).arg(g).arg(b); phbutton[i]->setStyleSheet(s); phbutton[i]->setWindowFlags(Qt::WindowStaysOnTopHint); connect( phbutton[i],&myPushButton::clicked,[=](){ int r,g,b; if(SaveColorFlag != 0) { r = Color_sum.red(); g = Color_sum.green(); b = Color_sum.blue(); SaveColorFlag = 0; update(); FileInfo->color_tab[i] = (r


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有