摘要:文章目錄一作品背景二功能要求三實現(xiàn)基礎(chǔ)功能一首先是要選材二原理圖設(shè)計二第一版本設(shè)計三焊接板四編寫單片機程序五下載程序驗證四外殼設(shè)計一圖紙設(shè)計二磨砂亞克力板五重新設(shè)計六安卓設(shè)計一界面設(shè)計二程序設(shè)計三功能設(shè)計作品嗶哩嗶哩視
作品嗶哩嗶哩視頻:【待上映】
資料鏈接:【待更新】
在智能的2021年代,年輕的小伙伴都患上了懶惰的癥狀,我也一樣。
有一個難以入眠的夜晚,我打開了王者榮耀,我習(xí)慣了玩手機都要開著燈打,這樣可以減少對眼睛的損傷,終于,贏了好幾把,時間已經(jīng)到了凌晨2點半,我也開始有了睡意,當(dāng)我放下手機,準(zhǔn)備閉眼入睡時,發(fā)現(xiàn)燈光格外耀眼,心煩意亂,實在不想按下那下床走好幾步才能觸碰到的開關(guān),但是房間的設(shè)計就是這樣,無法改變。無奈的我還是掙扎地下床按下了開關(guān),這才安心入睡。
作為學(xué)電子專業(yè)的我并不妥協(xié),我一定要設(shè)計一個不下床就可以關(guān)掉的燈。
有了想法,就要大膽給自己一個功能要求,為了不下床關(guān)燈,沖!!!
藍牙彩燈的功能初步打算:
1、可以用手機控制燈的亮滅
2、可以用手機控制燈的亮度
3、可以用手機控制燈的任意顏色
有了功能要求,那能不能實現(xiàn)就要靠自己的技術(shù)了。
1、LED選擇:WS2812
既然是想做任意顏色的燈,那么毫無疑問選擇最普遍的WS2812,24位全彩RGB彩燈,可以發(fā)出2^24=16777215種顏色。
2、單片機選擇:STM32G0
在當(dāng)今MCU那么稀貴的情況下,當(dāng)然是要為自己的腰包考慮,WS2812的驅(qū)動時鐘大概需要800KHZ,速度要求很高,首先選擇stm32,看了一下價格,選擇了和藹可親的stm32g030c8t6,6元還包郵
3、通信模塊選擇:藍牙模塊JDY-31
要手機控制燈,首先想到用藍牙模塊,價格考慮,選擇全網(wǎng)最便宜的藍牙模塊JDY-31,比起HC-05,它更加小巧,就是連接速度不是很快
有了這3個主要材料,我們就可以開始設(shè)計一下原理圖
1、單片機需要3.3V供電,首先設(shè)計一個電源部分,先用usb進行供電5V給ws2812,再用降壓芯片降壓到3.3V供給MCU,
2、設(shè)計一個單片機最小系統(tǒng),以及預(yù)留一個下載接口,方便使用ST-LINK進行下載程序
3、然后要連接一個藍牙和一個按鍵作為控制,再預(yù)留一個LED作為指示燈
4、RGB燈的電路設(shè)計,這里兩組LED,用兩個IO口控制,防止LED過多導(dǎo)致信號失真
這樣一張原理圖就設(shè)計好啦
1、根據(jù)原理圖給定相應(yīng)的封裝導(dǎo)入PCB,再進行布局與布線,設(shè)計好一塊給淘寶客服能夠打印出來的PCB圖紙
2D:
3D:
然后交給淘寶,這里推薦嘉立創(chuàng),便宜,質(zhì)量也高。
這是打印出來的第一板PCB:
1、打印出PCB之后,當(dāng)然是要把元器件焊接到PCB板上,第一塊板焊接的時候先不用一次性全部焊接上去,先焊接電源部分,看看電源芯片是否能夠正常工作,比如我畫的這塊板子USB母座封裝與原理圖不對應(yīng),導(dǎo)致正負(fù)極直接反向,就很容易導(dǎo)致元器件損壞,檢測完電壓正常之后,再焊接其他元器件
單片機程序包含了很多知識
1、輕量級多任務(wù)系統(tǒng)
2、藍牙數(shù)據(jù)自定義控制協(xié)議、藍牙無線升級單片機
3、多種控制方式按鍵+藍牙
4、多功能按鍵,單擊、雙擊、長按
5、ws2812串聯(lián)控制
6、呼吸燈算法
7、顏色漸變算法
…
/***************************************** 函數(shù)名稱: DIS_TASK()* 輸入?yún)?shù): 無* 輸出參數(shù): 無* 功 能: 顯示任務(wù)******************************************/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)//可以更新顯示 { /***********************靜態(tài)*******************************/ if(SysState.Dismode == DisMode_Static)//靜態(tài) { 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 <= 4)dir = 0; } r = ((SysState.StaticRgb>>16)%0x100)*a/0xff; g = ((SysState.StaticRgb>>8)%0x100)*a/0xff; b = ((SysState.StaticRgb>>0)%0x100)*a/0xff; color_rgb = (r<<16) + (g<<8) + b; printf("%d %d %d %d/r/n",r,g,b,a); RGB_Refresh(color_rgb,LED_NUM);//顯示 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){ //設(shè)置顏色 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(); //結(jié)束固定格式一定要的}
下載程序后測試ws2812是否正常工作
感覺沒有一個外殼會很難看,添加一個外殼,讓世界變得美麗
淘寶搜磨砂亞克力板定制,發(fā)送CAD圖紙給師傅,就可以給你做了
這是做好的亞克力板,是按照PCB板尺寸量身定做的
重新布局設(shè)計出來第3版本成品板:PCBV1.3
這是打樣后焊接好的樣子:
展示部分代碼:
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(){ //設(shè)置背景圖片 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 <= 0 || src_h <= 0) { src_h = 2267;src_w = 1080; this->setGeometry(0,0,src_w,src_h);//1080 2267 qDebug() << "src get err ======== "<< src_w <<src_h << endl; } else { this->setGeometry(0,0,src_w,src_h);//1080 2267 qDebug() << "src get ok ======== " << src_w <<src_h << endl; }}//藍牙初始化void MainWindow::BuleTooth_Init(void){ //藍牙連接初始化代碼 timer_conflag = new QTimer; ptimer = new QTimer; //QBluetoothDeviceDiscoveryAgent 這個是指掃描周圍藍牙設(shè)備! discoveryAgent = new QBluetoothDeviceDiscoveryAgent(); //QBluetoothLocalDevice 是指配置獲取設(shè)備的藍牙狀態(tài)信息等! localDevice = new QBluetoothLocalDevice(); //QBluetoothSocket指進行鏈接藍牙設(shè)備,讀寫信息! socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol); //多窗口初始化 btcwindow = new BTMainWindow(this); btcwindow->hide(); aboutwindow = new AboutMainWindow(this); aboutwindow->hide(); connect(socket, SIGNAL(readyRead()), this, SLOT(readBluetoothDataEvent()) ); connect(socket, SIGNAL(connected()), this, SLOT(bluetoothConnectedEvent()) ); connect(socket, SIGNAL(disconnected()), this, SLOT(bluetoothDisconnectedEvent()) ); localDevice->powerOn();//打開藍牙 discoveryAgent->start();//開始掃描}//顏色條初始化void MainWindow::ColorSlider_Init(void){ 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() << color << endl; colorslider_G->init(ColorSlider::RGB,ColorSlider::GREEN,color,0x00,0xff);qDebug() << color << endl; colorslider_B->init(ColorSlider::RGB,ColorSlider::BLUE,color,0x00,0xff);qDebug() << color << endl; colorslider_A->init(ColorSlider::RGB,ColorSlider::ALPHA,color,0x00,0xff);qDebug() << color << endl; colorslider_R->setGeometry(100,200,880,60); colorslider_G->setGeometry(100,400,880,60); colorslider_B->setGeometry(100,600,880,60); colorslider_A->setGeometry(100,800,880,60);}//按鈕初始化void MainWindow::PushButton_Init(void){ //刷新定時器 static QColor last_Color; time1= new QTimer(this); time1->start(1000); connect(time1,&QTimer::timeout,[=](){ time1->start(100); if(Connect_Flag == 1)//連接指示 { Connect_Flag = 0; btcwindow->hide(); this->show(); QMessageBox::information(this,tr("提示"),tr("藍牙連接成功!")); QByteArray arrayData; //發(fā)送空指令 QString s = QString("NONE/r/n"); qDebug() << s << endl; arrayData = s.toUtf8(); socket->write(arrayData); s.clear(); arrayData.clear(); } if(last_Color != Color_sum)//發(fā)送指令 { update();//更新 unsigned int color_d = ((Color_sum.alpha()/16)<<24)+(Color_sum.red()<<16) + (Color_sum.green()<<8) + (Color_sum.blue()<<0) ; QByteArray arrayData; QString s = QString("COLOR:%1/r/n").arg(color_d); qDebug() << s << endl;
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/121235.html
摘要:中控部分采用了單片機,其主要作用是獲取輸入部分?jǐn)?shù)據(jù),經(jīng)過內(nèi)部處理,控制輸出部分。 設(shè)計簡介: 本設(shè)計是基于單片機的智能家居控制系統(tǒng),主要實現(xiàn)以下功能: 可通過DS18B20實時測量環(huán)境溫度溫度具有上下限,自動模式下溫度超出限值,GMS發(fā)送短信溫度上下限通過手機藍牙設(shè)置系統(tǒng)可通過手機藍牙、紅外...
摘要:二模塊原理藍牙模塊的通信示意圖如下兩個設(shè)備主控芯片或單片機分別連接各自的藍牙模塊,即將主控芯片與藍牙模塊的串口控制引腳交叉連接。如圖注藍牙模塊自帶轉(zhuǎn)電路。注博主演示的藍牙模塊雖然不是,但是功能和一樣。 ...
摘要:使用庫讀寫環(huán)境光照度傳感器本文將教大家如何快速使用庫讀取光照度數(shù)據(jù)。五實驗樣機測試展示通過之前配置好的面板,通過涂鴉智能進行配網(wǎng)實時采集光照度傳感器的數(shù)據(jù)。 使用STM32 HAL庫讀寫環(huán)境光照度傳感器(BH1750) 本文將教大家如何快速使用STM32HAL庫讀取光照度數(shù)據(jù)。 實現(xiàn)功能:通...
摘要:前言芯片接口占用管腳數(shù)量比以太網(wǎng)的少,版線布局可更精簡。網(wǎng)卡芯片介紹接口網(wǎng)卡芯片是為方物聯(lián)網(wǎng)行業(yè)進以太網(wǎng)通信而開發(fā)出的解決方案。此應(yīng)用可用于監(jiān)控家庭物聯(lián)網(wǎng)網(wǎng)關(guān)搭建等。 前言 ????DM9051NP芯片?SPI接口占用管腳數(shù)量比以太網(wǎng)PHY的RMII/MII少,PCBA版線布局可更精簡。...
閱讀 3267·2023-04-26 02:10
閱讀 2888·2021-10-12 10:12
閱讀 4587·2021-09-27 13:35
閱讀 1528·2019-08-30 15:55
閱讀 1070·2019-08-29 18:37
閱讀 3433·2019-08-28 17:51
閱讀 1967·2019-08-26 13:30
閱讀 1203·2019-08-26 12:09