找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12125|回复: 34
收起左侧

手机蓝牙对大功率RGB-LED PWM调色,实现三路256级混色和多种模式 附单片机源码

  [复制链接]
ID:259648 发表于 2018-8-13 13:09 | 显示全部楼层 |阅读模式
通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色, 理论几乎包括了人类视力所能感知的所有颜色。  我们的手机、电脑、电视,等显示器 ,一个像素就是通过对RGB三个颜色不同占比的控制实现显示不同颜色。
突发联想,做个大功率的RGB调光如何?可以做夜灯,做装饰 ,照明 ,加上手机控制,晚上很少开灯。本制作有所不足,希望各位大佬能进行完善,或者添加新的玩法~

用到的元器件:
RGB LED 3W*4
15W404AS 单片机
4.7R  1W电阻*3
NMOS管*3
100Ω  1/4 W电阻*3
1-10K  1/4 W电阻*3
6*8cm 洞洞板*1
蓝牙模块 *1

先发个演示视频吧~


原理:利用蓝牙串口助手发送数据,蓝牙模块接收后,经过单片机处理,处理当前的三路PWM值输出到IO口,通过MOS管驱动LED。
蓝牙APP 的配置(如果想深入了解可以在app菜单点击程序帮助)

蓝牙串口助手发送界面

蓝牙串口助手发送界面

可以通过这个APP拖动上面的滑块,或者点击下面的按键配置RGB 的占比 ,当单片机接收到有效数据帧的时候 ,单片机会将数据原样返回到APP 这样做的目的是为了使按键按下后上面的滑块也能同步当前的三路PWM值。从而用户可再次对当前模式进行微调
具体配置:(点击APP右上方三个小点-地面站设置)

具体配置

具体配置



详细数据说明:
*                滑块发送数据一次为7位数据  
*                例如        A5 5A 05 F1 80 76 AA
*                A5 5A 为帧头
*                05为除去帧头的长度
*                F1为哪一个滑块
*                80为具体数值
*                76为byte 2到4位数据的和 (低字节)
*              AA为帧尾

本制作实际使用中,接收做了两次帧头核对(接受时判断第0位A5,处理时判断第一位,5A)保证数据正确完整 。
没有使用效验。 但是在往APP返回数据时候需要严格按照APP标准执行。
具体的发送和接收处理过程在程序中有所体现,也做了充分的注释、
电路:
电路很简单,只是介绍MOS部分的接法:

MOS管接法

MOS管接法



我使用的是PWM模块拆解的MOS管,其中两个MOS管是并连关系,为了驱动大功率的,但是在这里有点浪费,体积较大。
IMG_20180813_110352.jpg

拆解后将引脚掰直
IMG_20180813_130538.jpg IMG_20180813_130607.jpg
背面焊一个引脚出来,贴片变直插 ~~

其中PWM端接单片机io口
R1接RGB LED的其中一个颜色,4个LED的正极 R端G端B端口采用并联方式连接。
需要注意是需要对RGB三个颜色的功率进行匹配,也就是说当PWM为最大255时,保证每一个LED的每一个颜色不会过载。
我用的是下面这一款LED
3w RGB参数.png

红色电压2.2v
蓝绿色电压 3.3v
电流 350ma (实际100ma就发烫)
LED电阻的适配:
5V电源电压下   红:(5-2.2)/0.35  = 8Ω    电阻功率2.8*0.35    = 0.98w(电阻发烧严重)
                    蓝绿:(5-3.3)/0.35  = 4.85Ω            1.7*0.35    = 0.59w

3.3v 电源电压  红:  (3.3-2.2)/0.35 = 3.14Ω 电阻功率 1.1*0.35   = 0.38w(不发烧)
       蓝绿:  不用电阻


通过上面的数据和实际测试发现电源电压使用3.3v最为合适,并且还省去的蓝绿色的电阻(G/B直接接MOS管的D极,R通过3.1Ω电阻接D)。所以选择了使用5V 2A适配器+DCDC调压供电,此时需要考虑你的单片机工作电压和蓝牙模块工作电压是否合适。



说了这么久PWM,简谈一下PWM:
即在频率不变的情况下改变高低电平的占比。


程序中off_all 和on_all需要注意的是并没有对PWM值进行操作,而是直接关闭了io口的输出。因为这样可以彻底关闭LED不至于PWN=0时侯微亮状态。
其次程序中并没有对PWM=0进行发送 ,因为不知道为什么,PWM =0 app会接受失败,所以最低发送了PWM=1,然后让io口关闭实现LED完全熄灭。

有一个想法:当发送的为模式数据时,APP也能进行面板刷新,但是实际测试中  ,当模式执行时遇到发送数据就会停止当前模式(卡住),不知如何解决~  望支招

实际使用:

使用前先确认蓝牙模块波特率为9600bps ,弱不是,请进入蓝牙模块AT模式进行配置 ,蓝牙连接成功后点击app上的蓝牙标志选择连接 ,提示连接成功后按如上的APP配置即可使用,接下来是主程序部分。

IMG_20180812_225717.jpg IMG_20180812_225729.jpg IMG_20180812_225749.jpg IMG_20180812_225907.jpg IMG_20180812_225950.jpg IMG_20180812_230059.jpg


单片机程序源码如下:
  1. /*********************************************
  2. *                        功能  :RGB调光
  3. *                        单片机:15W404AS
  4. *                        app   :蓝牙串口助手
  5. *                        数据格式以及解释:

  6. *                        滑块数据一次为7位数据  例如
  7. *                        A5 5A 05 F1 80 76 AA
  8. *                        其中A5 5A 为帧头
  9. *                        05为除去帧头的长度
  10. *                        F1为哪一个滑块
  11. *                        80为具体数值
  12. *                        76为234位数据的和 (低字节)AA为帧尾*/
  13. #include <STC15F2K60S2.h>
  14. #include <main.h>
  15. #include <timerandusart.h>
  16. #include <mode.h>

  17. uchar quit_flag ,liangdu_flag ;  //模式退出标志  亮度设置标志
  18. /*用于返回数据刷新app面板  读取byte 4  计算byte5  */
  19.         uchar table1[7] ;  
  20.         uchar table2[7] ;
  21.         uchar table3[7] ;

  22. void port_mode(){     // 端口模式  
  23.         P1M1=0x00; P1M0=0xFF;
  24.         P3M1=0x00; P3M0=0xFC; }

  25.        
  26. /*不精准的延时函数*/
  27. void delay(uint i)
  28. {
  29.         uint x ,y;
  30.         for(x=i;x>0;x--)
  31.         for(y=700;y>0;y--);
  32. }

  33.        
  34. /*app面板刷新,必须每次对整个数组赋值  不然容易错乱*/
  35. void now_value()
  36. {
  37.                 REN = 0;                                          //马上将要发数据到手机 先禁止接收
  38.                 delay(1);
  39.           table1[0]  = 0xa5;
  40.                 table1[1]  = 0x5a;
  41.                 table1[2]  = 0x05;
  42.           table1[3]  = 0xf1;                                /*滑块1*/
  43.                 table1[4]  = PWM_r;                                                  //读取当前的PWM_r大小
  44.                 table1[5]  = (table1[2] + table1[3] + table1[4]) & 0XFF;//计算效验码 计算方法为byte2+byte3+byte4  取低位
  45.                 table1[6]  = 0xaa;
  46.                 SendStr(table1);                                                                                                                                        //发送处理完成后的PWM_r数据刷新第一个滑条  red
  47.        
  48. /*-------------------------------*/       
  49.        
  50.           table2[0]  = 0xa5;
  51.                 table2[1]  = 0x5a;
  52.                 table2[2]  = 0x05;
  53.           table2[3]  = 0xf2;                                /*滑块2        */
  54.                 table2[4] = PWM_g;       
  55.                 table2[5] = (table2[2] + table2[3] + table2[4]) & 0XFF;       
  56.           table2[6]  = 0xaa;
  57.                 SendStr(table2);         
  58.        
  59. /*-------------------------------*/                       
  60.           table3[0]  = 0xa5;
  61.                 table3[1]  = 0x5a;
  62.                 table3[2]  = 0x05;
  63.           table3[3]  = 0xf3;                                /*滑块3        */
  64.                 table3[4] = PWM_b;                         
  65.                 table3[5] = (table3[2] + table3[3] + table3[4]) & 0XFF;
  66.                 table3[6]  = 0xaa;
  67.                 SendStr(table3);
  68.          
  69.                 REN = 1;                                                                                                                                          //允许接收
  70. }

  71. /*---------------------------------------------------------------------------主程序--------------------------------------------------------------------------*/
  72. void main()
  73. {
  74.   port_mode();
  75.         timer();
  76.         UART_init();//串口配置初始化
  77.         PS = 1 ;    //串口中断优先
  78.         while(1)
  79.         {         
  80.                                 if(sign)
  81.                          {
  82.                                                 sign = 0;  
  83.                                                 str_copy(S,T);   //再次复制
  84.                                                 if(S[1] == 0X5A)   //串口中断中进行了第1位的核对 为了数据正确  再核对一次第2个  
  85.                                                 {
  86.                                                                  switch(S[3])  //判断是哪一个数据,将对应滑块数值取出来给各个占空比
  87.                                                                  {
  88.                                 /*滑块*/                
  89.                                                                          case 0xF1 :   PWM_r = S[4] ; break ; //滑块1
  90.                                                                          case 0xF2 :   PWM_g = S[4] ; break ; //滑块2
  91.                                                                          case 0xF3 :   PWM_b = S[4] ;        break ; //滑块3
  92.                                 /*按键*/                       
  93.                                                                          case 0xB1 :   white ;  break ; //按键1   白色
  94.                                                                          case 0xB2 :   balck;   break;  //按键2   黑色
  95.                                                                          case 0xB3 :   yellow;  break ; //按键3   黄色
  96.                                                                          case 0xB4 :   violet;  break ; //按键4   紫色
  97.                                                                          case 0xB5 :   cyan ;   break ; //按键5   青色       
  98.                                                                          case 0xB6 :   break;
  99.                                  /*模式*/                                                          
  100.                                                                          case 0xA1 :   MODE_1();                    break;//呼吸
  101.                                                              case 0xA2 :   MODE_2();                    break;//闪烁
  102.                                                                          case 0xA3 :   MODE_3();                    break;//闪烁
  103.                                  /*闪烁速度*/
  104.                                                                          case        0xD1 :   if(speed<1000 )speed+=10;                                                                                       break;                  
  105.                                                                    case        0xD2 :   if(speed>0 && speed - 10 >= 0)speed-=10;          break;                  
  106.                                                                  }
  107.                                                        now_value();//刷新app面板
  108.                                                 }

  109.                                  }/*end sign*/
  110.                                        
  111.                                                                 if(PWM_r <= 1) OFF_red         ; else ON_red  ;  //通过设置端口模式,彻底关闭LED
  112. ……………………

  113. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


其它子程序和分文件Keil工程,app 均在附件之中 欢迎下载~
最后希望感兴趣的朋友们顺利制作成功~~

0.png

全部资料51hei下载地址:
RGB 蓝牙滑块调光.zip (2.84 MB, 下载次数: 283)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:305196 发表于 2019-5-25 15:25 | 显示全部楼层
MOS管用的不多,怕焊接错了,就直接飞线搭建了个,可以亮,就马上照着焊接起来了。在你基础上改了下,手里也没有3.3V稳压芯片,就搞了2个二极管,但是蓝牙模块得5V,经过两个二极管供电不够,所以蓝牙模块接了一个二极管,RGB彩灯用了2个二极管,靠近RGB彩灯的二极管很烫,但是正面的三个功率电阻不烫了,这叫温度转移吗,还有我觉得二次验证好难受,得按2下,模式按钮变快变慢按钮好像没作用,可能白天在实验室没效果。而且光好刺眼,加了个泡沫罩着,好了一点。
J$O1E8)EOM}BO~ILH8U8JQV.jpg 6_M1)WJ96${7@SN0@BP{@PK.jpg 945M2KZ5$U{O}S4PA{PI4PW.jpg (U@JL77K@MUEW6X~(DQ(@%V.jpg C(F5WGI17ME2MSM3I2SVXC7.jpg )035{}6Z5(N1[(P~{[DQ2EH.jpg

ZXC8[~]OD[[HAUY7)E8S5X6.jpg

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-8-14 04:28 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:328014 发表于 2018-8-14 16:20 | 显示全部楼层
谢谢楼主大大分享的好东东,只能用stc15W404AS芯片吗?用52单片机可不可以?
回复

使用道具 举报

ID:259648 发表于 2018-8-14 16:49 | 显示全部楼层
51hei团团 发表于 2018-8-14 16:20
谢谢楼主大大分享的好东东,只能用stc15W404AS芯片吗?用52单片机可不可以?

也可以,处理的东西并不多,主要原因是404AS体积小巧。如果用89c52的话串口配置函数需要写成51的  设置波特率为9600  另外,端口模式相关的操作就可以不用管了  其他的东西都是通用
回复

使用道具 举报

ID:377382 发表于 2018-8-24 14:00 | 显示全部楼层
谢谢楼主大大分享的好东东
回复

使用道具 举报

ID:161785 发表于 2018-11-21 16:32 来自手机 | 显示全部楼层
太好了,正需要。没有看的下载地址呢。
回复

使用道具 举报

ID:358930 发表于 2018-11-22 09:41 来自手机 | 显示全部楼层
admin 发表于 2018-8-14 04:28
好资料,51黑有你更精彩!!!

地址看不了吗。。。。
回复

使用道具 举报

ID:65956 发表于 2018-11-27 08:47 | 显示全部楼层
设置的门槛有点高哦
回复

使用道具 举报

ID:161785 发表于 2018-12-11 17:28 | 显示全部楼层
您好 蓝牙模块用HC-08可以吗。用改代码吗。十分感谢。
回复

使用道具 举报

ID:3802 发表于 2019-1-25 14:32 | 显示全部楼层
太厉害了
回复

使用道具 举报

ID:321613 发表于 2019-1-30 10:53 | 显示全部楼层
好精彩哦!!!!!!!!!!!!!!!
回复

使用道具 举报

ID:500243 发表于 2019-3-28 21:54 | 显示全部楼层
哇 好厉害呀~!!
回复

使用道具 举报

ID:86244 发表于 2019-4-18 22:39 | 显示全部楼层
楼主很用心,很好的代码.
回复

使用道具 举报

ID:271166 发表于 2019-4-19 08:13 | 显示全部楼层
好资料
回复

使用道具 举报

ID:222956 发表于 2019-4-19 11:53 | 显示全部楼层
优秀,加个外壳就更加完美了
回复

使用道具 举报

ID:516864 发表于 2019-4-20 01:33 来自手机 | 显示全部楼层
楼主能帮做的app吗
回复

使用道具 举报

ID:529074 发表于 2019-5-7 16:16 | 显示全部楼层
可以加个联系方式么?有些问题想请教
回复

使用道具 举报

ID:529074 发表于 2019-5-7 16:43 | 显示全部楼层
楼主能加个好友么,有些细节想问下
回复

使用道具 举报

ID:406752 发表于 2019-5-16 16:45 | 显示全部楼层
楼主!求一下电路连接图!
回复

使用道具 举报

ID:259648 发表于 2019-6-26 00:04 | 显示全部楼层
destiny_xl 发表于 2019-5-25 15:25
MOS管用的不多,怕焊接错了,就直接飞线搭建了个,可以亮,就马上照着焊接起来了。在你基础上改了下 ...

真漂亮~~   哈哈
回复

使用道具 举报

ID:148211 发表于 2019-7-14 02:04 | 显示全部楼层
高手在民间啊。好东西
回复

使用道具 举报

ID:137005 发表于 2019-7-30 16:59 | 显示全部楼层
用保存调光的值吗?这样就不用每次开机都调一下。
回复

使用道具 举报

ID:372939 发表于 2019-7-30 23:47 | 显示全部楼层
学习了,感谢楼主开源精神。
回复

使用道具 举报

ID:282431 发表于 2019-7-31 09:01 | 显示全部楼层
好东东,向楼主学习,比较实用的学习
回复

使用道具 举报

ID:259648 发表于 2019-8-7 15:10 | 显示全部楼层
民盛 发表于 2018-12-11 17:28
您好 蓝牙模块用HC-08可以吗。用改代码吗。十分感谢。

不需要
回复

使用道具 举报

ID:194844 发表于 2019-9-7 13:38 | 显示全部楼层
ok thankyou
回复

使用道具 举报

ID:56665 发表于 2019-9-7 15:49 | 显示全部楼层
谢谢分享,但原理图只画MOS管,应该把怎么连接单片机、LED都要画出来,PCB文件是空的,有空最好补齐。
回复

使用道具 举报

ID:632514 发表于 2019-11-12 13:05 | 显示全部楼层

好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:692357 发表于 2020-2-12 16:20 | 显示全部楼层


好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:517794 发表于 2020-12-17 23:44 | 显示全部楼层
再来一发,很棒!
回复

使用道具 举报

ID:230742 发表于 2020-12-18 11:31 | 显示全部楼层
高手!这个现在太实用了。
回复

使用道具 举报

ID:140183 发表于 2020-12-21 20:57 | 显示全部楼层
太好啦!51黑有你更精彩!!!
回复

使用道具 举报

ID:392670 发表于 2020-12-23 22:55 | 显示全部楼层
好资料,
用52单片机就好了,程序不会改
回复

使用道具 举报

ID:896273 发表于 2021-3-27 09:55 | 显示全部楼层
又是一个学习典范
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表