极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 77981|回复: 73

《博哥玩Arduino》- 蓝牙七彩灯优化版V1.0

[复制链接]
发表于 2016-12-25 12:27:34 | 显示全部楼层 |阅读模式
本帖最后由 单片机菜鸟 于 2017-6-14 16:21 编辑

一、前言

app 下载路径:http://sj.qq.com/myapp/detail.htm?apkName=com.wty.app.wifirgb

     前段时间写了个帖子
     《博哥玩Arduino》- 蓝牙七彩灯
                http://www.geek-workshop.com/thread-27892-1-1.html(出处: 极客工坊)

     不过当时因为没有RGB模块,所以就讲了一下基本原理以及调试过程。后面虽然RGB模块回来了,但楼主因为要评测公司高级工程师(需要考笔试,可惜楼主没有考过,想想有点小失落),所以并没有写最终效果的帖子。趁着这好日子(虽然不怎么过圣诞节,还是祝各位圣诞节快乐),出门前就把早上的调试结果总结一下,以供大家参考。

     这篇文章是基于《博哥玩Arduino》- 蓝牙七彩灯 来写的,没有看过的麻烦先去看看这篇,毕竟原理已经讲了很清楚。

    多彩灯效果:



    (为了看出效果,楼主把一个xxx风油精的瓶子放在RGB灯上面,各位也可以DIY各种灯罩效果哈哈哈哈)


二、优化事项

     优化事项1:多彩灯颜色切换不够平滑,会闪烁。同时修改了arduino代码以及app代码(需要最新版app 麻烦在帖子下面留言
     优化事项2:arduino 代码没有考虑共阴还是共阳(最新版代码加入这个考虑事项)
     未优化事项:可以考虑后期加入记录上一次灯颜色状态,下一次开灯就默认是该颜色
     未优化事项:是否可以在板子上加入一个按钮,可以切换常用颜色,不一定每次都用app
     .......

三、优化版代码

具体优化的地方可以对比两份代码
旧代码:
  1. /**
  2. * 日期:2016/11/24
  3. * 功能:蓝牙台灯
  4. * 作者:单片机菜鸟
  5. **/

  6. #define BTSerial Serial1
  7. #define MyDebugSerial Serial

  8. //该条语句用于使能DEBUG输出信息,屏蔽掉就不会输出debug调试信息
  9. #define DEBUG

  10. #ifdef DEBUG
  11. #define DBGLN(message)    MyDebugSerial.println(message)
  12. #else
  13. #define DBGLN(message)
  14. #endif

  15. #define PIN_RED 9
  16. #define PIN_GREEN 10
  17. #define PIN_BLUE 11

  18. int red = 0;//红色
  19. int green = 0;//绿色
  20. int blue = 0;//蓝色

  21. void setup() {
  22.   pinMode(PIN_RED, OUTPUT);
  23.   pinMode(PIN_GREEN, OUTPUT);
  24.   pinMode(PIN_BLUE, OUTPUT);
  25.   BTSerial.begin(9600);
  26.   MyDebugSerial.begin(9600);
  27. }

  28. void loop() {
  29.   int leng = ReceiveBTMessage();
  30.   if(leng>0){
  31.     //收到了新RGB数值
  32.     colorRGB(red,green,blue);
  33.   }
  34. }

  35. /**
  36. * 读取串口缓冲区里面的数据
  37. *
  38. */
  39. int ReceiveBTMessage(){
  40.   /**
  41.      * @Desc 把RGB组合成协议内的数据格式
  42.      *  开始符+长度+rgb+结束符
  43.      * "+C,n:rgbString;"
  44.      * 例子:"+C,10:100,255,60;"
  45.      **/
  46.   String data = "";
  47.   if (BTSerial.available()>0){
  48.     unsigned long start;
  49.     start = millis();
  50.     char c0 = BTSerial.read();
  51.     if (c0 == '+')
  52.     {
  53.       char c;
  54.       while (millis()-start<200)
  55.       {
  56.         if (BTSerial.available()>0)
  57.         {
  58.           c = BTSerial.read();
  59.           data += c;
  60.         }
  61.         if (c==';')
  62.           break;
  63.       }

  64.       int sLen = strlen(data.c_str());
  65.       int i,r,g,b;
  66.       for (i = 0; i <= sLen; i++){
  67.         if (data[i] == ':'){
  68.           break;
  69.         }
  70.       }
  71.       DBGLN(data);
  72.       int iSize;
  73.       //"+C,10:100,255,60;"   
  74.       String _size = data.substring(2, i);
  75.       iSize = _size.toInt();

  76.       for(r=i+1;r<=sLen;r++){
  77.          if(data[r]==','){
  78.            break;
  79.           }  
  80.       }

  81.       for(g=r+1;g<=sLen;g++){
  82.          if(data[g]==','){
  83.            break;
  84.           }  
  85.       }

  86.       for(b=g+1;b<=sLen;b++){
  87.          if(data[b]==';'){
  88.            break;
  89.           }  
  90.       }

  91.       String sred = data.substring(i+1,r);
  92.       String sgreen = data.substring(r+1,g);
  93.       String sblue = data.substring(g+1,b);

  94.       red = sred.toInt();
  95.       green = sgreen.toInt();
  96.       blue = sblue.toInt();

  97.       DBGLN("red:"+sred);
  98.       DBGLN("green:"+sgreen);
  99.       DBGLN("blue:"+sblue);
  100.       return iSize;
  101.     }else{
  102.       while(BTSerial.read() >= 0){}  
  103.     }
  104.   }
  105.   return 0;
  106. }

  107. void colorRGB(int red, int green, int blue){
  108.   analogWrite(PIN_RED,constrain(red,0,255));
  109.   analogWrite(PIN_GREEN,constrain(green,0,255));
  110.   analogWrite(PIN_BLUE,constrain(blue,0,255));
  111. }
复制代码


优化版代码:

  1. /**
  2. * 日期:2016/11/24
  3. * 功能:蓝牙台灯
  4. * 作者:单片机菜鸟
  5. **/

  6. #define BTSerial Serial1
  7. #define MyDebugSerial Serial

  8. //该条语句用于使能DEBUG输出信息,屏蔽掉就不会输出debug调试信息
  9. //#define DEBUG
  10. //该条语句用于使能是共阴RGB  屏蔽掉就是共阳RGB
  11. //#define COMMON_GND

  12. #ifdef DEBUG
  13. #define DBGLN(message)    MyDebugSerial.println(message)
  14. #else
  15. #define DBGLN(message)
  16. #endif

  17. #define PIN_RED 9
  18. #define PIN_GREEN 10
  19. #define PIN_BLUE 11

  20. int red = 0;//红色
  21. int green = 0;//绿色
  22. int blue = 0;//蓝色

  23. void setup() {
  24.   pinMode(PIN_RED, OUTPUT);
  25.   pinMode(PIN_GREEN, OUTPUT);
  26.   pinMode(PIN_BLUE, OUTPUT);
  27.   BTSerial.begin(9600);
  28.   MyDebugSerial.begin(9600);
  29. }

  30. void loop() {
  31.   int leng = ReceiveBTMessage();
  32.   if(leng>0){
  33.     //收到了新RGB数值
  34.     colorRGB(red,green,blue);
  35.   }
  36. }

  37. /**
  38. * 初始化RGB灯(后面可以考虑加入一个记录之前状态的功能,下次打开就取出来显示)
  39. */
  40. void init_RGB(){
  41.   #ifdef COMMON_GND
  42.     colorRGB(255,255,255);
  43.   #else
  44.     colorRGB(0,0,0);
  45.   #endif
  46. }

  47. /**
  48. * 读取串口缓冲区里面的数据
  49. *
  50. */
  51. int ReceiveBTMessage(){
  52.   /**
  53.      * @Desc 把RGB组合成协议内的数据格式
  54.      *  开始符+长度+rgb+结束符
  55.      * "+C,n:rgbString;"
  56.      * 例子:"+C,10:100,255,60;"
  57.      **/
  58.   String data = "";
  59.   if (BTSerial.available()>0){
  60.     unsigned long start;
  61.     start = millis();
  62.     char c0 = BTSerial.read();
  63.     if (c0 == '+')
  64.     {
  65.       char c;
  66.       while (millis()-start<100)
  67.       {
  68.         if (BTSerial.available()>0)
  69.         {
  70.           c = BTSerial.read();
  71.           data += c;
  72.         }
  73.         if (c==';')
  74.           break;
  75.       }

  76.       int sLen = strlen(data.c_str());
  77.       int i,r,g,b;
  78.       for (i = 0; i <= sLen; i++){
  79.         if (data[i] == ':'){
  80.           break;
  81.         }
  82.       }
  83.       DBGLN(data);
  84.       int iSize;
  85.       //"+C,10:100,255,60;"   
  86.       String _size = data.substring(2, i);
  87.       iSize = _size.toInt();

  88.       for(r=i+1;r<=sLen;r++){
  89.          if(data[r]==','){
  90.            break;
  91.           }  
  92.       }

  93.       for(g=r+1;g<=sLen;g++){
  94.          if(data[g]==','){
  95.            break;
  96.           }  
  97.       }

  98.       for(b=g+1;b<=sLen;b++){
  99.          if(data[b]==';'){
  100.            break;
  101.           }  
  102.       }

  103.       String sred = data.substring(i+1,r);
  104.       String sgreen = data.substring(r+1,g);
  105.       String sblue = data.substring(g+1,b);

  106.       red = sred.toInt();
  107.       green = sgreen.toInt();
  108.       blue = sblue.toInt();

  109.       DBGLN("red:"+sred);
  110.       DBGLN("green:"+sgreen);
  111.       DBGLN("blue:"+sblue);
  112.       return iSize;
  113.     }else{
  114.       while(BTSerial.read() >= 0){}  
  115.     }
  116.   }
  117.   return 0;
  118. }

  119. void colorRGB(int red, int green, int blue){
  120.   #ifdef COMMON_GND
  121.      analogWrite(PIN_RED,constrain(red,0,255));
  122.      analogWrite(PIN_GREEN,constrain(green,0,255));
  123.      analogWrite(PIN_BLUE,constrain(blue,0,255));
  124.   #else
  125.      analogWrite(PIN_RED,constrain(255-red,0,255));
  126.      analogWrite(PIN_GREEN,constrain(255-green,0,255));
  127.      analogWrite(PIN_BLUE,constrain(255-blue,0,255));
  128.   #endif
  129. }
复制代码


四、总结

其实可以做的东西还是很多,比如我也可以把蓝牙多彩灯改成Wifi多彩灯,通过Wifi形式来控制。各位也可以做成各种好看的灯罩哈哈哈
好了,祝各位圣诞快乐
回复

使用道具 举报

 楼主| 发表于 2017-7-5 08:35:56 | 显示全部楼层

是不是你禁止掉什么权限呢 去app应用权限那里设置一下
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-12-25 12:28:09 | 显示全部楼层
楼主 做楼顶喝西北风
回复 支持 反对

使用道具 举报

发表于 2017-1-3 10:13:05 | 显示全部楼层
想要楼主的APP玩,不知可否发我 [email protected] 邮箱吗?谢了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-3 10:29:54 | 显示全部楼层
xinhoujue 发表于 2017-1-3 10:13
想要楼主的APP玩,不知可否发我  邮箱吗?谢了!

已经发送过去了  请查收
回复 支持 反对

使用道具 举报

发表于 2017-1-4 18:39:24 | 显示全部楼层
关注博哥好久了,博哥的APP也给我个吧。谢谢[email protected]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-5 08:05:43 | 显示全部楼层
死磕单片机 发表于 2017-1-4 18:39
关注博哥好久了,博哥的APP也给我个吧。谢谢

已经发过去了
回复 支持 反对

使用道具 举报

发表于 2017-1-5 20:26:24 | 显示全部楼层

谢谢谢谢谢谢
回复 支持 反对

使用道具 举报

发表于 2017-1-6 11:45:26 | 显示全部楼层

程序编译出错

blue_light.ino: In function 'void setup()':
blue_light.ino:7:18: error: 'Serial1' was not declared in this scope
blue_light.ino:33:3: note: in expansion of macro 'BTSerial'
blue_light.ino: In function 'int ReceiveBTMessage()':
blue_light.ino:7:18: error: 'Serial1' was not declared in this scope
blue_light.ino:68:7: note: in expansion of macro 'BTSerial'
编译有误。
回复 支持 反对

使用道具 举报

发表于 2017-1-6 12:00:16 | 显示全部楼层
楼主这是我的邮箱[email protected] 麻烦给我发下你的APP,谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-6 14:06:56 | 显示全部楼层
死磕单片机 发表于 2017-1-6 11:45
程序编译出错

blue_light.ino: In function 'void setup()':

我这个是基于mega2560  你是不是用uno
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-6 14:07:35 | 显示全部楼层
死磕单片机 发表于 2017-1-6 11:45
程序编译出错

blue_light.ino: In function 'void setup()':

我这个是基于mega2560  你是不是用uno
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-6 14:07:55 | 显示全部楼层
jdt 发表于 2017-1-6 12:00
楼主这是我的邮箱 麻烦给我发下你的APP,谢谢。

已经发过去了
回复 支持 反对

使用道具 举报

发表于 2017-1-6 14:08:37 | 显示全部楼层

程序编译不过什么原因?
回复 支持 反对

使用道具 举报

发表于 2017-1-6 14:09:48 | 显示全部楼层
单片机菜鸟 发表于 2017-1-6 14:07
我这个是基于mega2560  你是不是用uno

是的,我用的uno
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-6 18:46:28 | 显示全部楼层

所以你要修改一下源码
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 13:12 , Processed in 0.048635 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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