单片机菜鸟 发表于 2016-12-25 12:27:34

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

本帖最后由 单片机菜鸟 于 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》- 蓝牙七彩灯 来写的,没有看过的麻烦先去看看这篇,毕竟原理已经讲了很清楚。

    多彩灯效果:

http://v.youku.com/v_show/id_XMTg4MjIwNTUxMg==.html

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


二、优化事项

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

三、优化版代码

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

#define BTSerial Serial1
#define MyDebugSerial Serial

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

#ifdef DEBUG
#define DBGLN(message)    MyDebugSerial.println(message)
#else
#define DBGLN(message)
#endif

#define PIN_RED 9
#define PIN_GREEN 10
#define PIN_BLUE 11

int red = 0;//红色
int green = 0;//绿色
int blue = 0;//蓝色

void setup() {
pinMode(PIN_RED, OUTPUT);
pinMode(PIN_GREEN, OUTPUT);
pinMode(PIN_BLUE, OUTPUT);
BTSerial.begin(9600);
MyDebugSerial.begin(9600);
}

void loop() {
int leng = ReceiveBTMessage();
if(leng>0){
    //收到了新RGB数值
    colorRGB(red,green,blue);
}
}

/**
* 读取串口缓冲区里面的数据
*
*/
int ReceiveBTMessage(){
/**
   * @Desc 把RGB组合成协议内的数据格式
   *开始符+长度+rgb+结束符
   * "+C,n:rgbString;"
   * 例子:"+C,10:100,255,60;"
   **/
String data = "";
if (BTSerial.available()>0){
    unsigned long start;
    start = millis();
    char c0 = BTSerial.read();
    if (c0 == '+')
    {
      char c;
      while (millis()-start<200)
      {
      if (BTSerial.available()>0)
      {
          c = BTSerial.read();
          data += c;
      }
      if (c==';')
          break;
      }

      int sLen = strlen(data.c_str());
      int i,r,g,b;
      for (i = 0; i <= sLen; i++){
      if (data == ':'){
          break;
      }
      }
      DBGLN(data);
      int iSize;
      //"+C,10:100,255,60;"   
      String _size = data.substring(2, i);
      iSize = _size.toInt();

      for(r=i+1;r<=sLen;r++){
         if(data==','){
         break;
          }
      }

      for(g=r+1;g<=sLen;g++){
         if(data==','){
         break;
          }
      }

      for(b=g+1;b<=sLen;b++){
         if(data==';'){
         break;
          }
      }

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

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

      DBGLN("red:"+sred);
      DBGLN("green:"+sgreen);
      DBGLN("blue:"+sblue);
      return iSize;
    }else{
      while(BTSerial.read() >= 0){}
    }
}
return 0;
}

void colorRGB(int red, int green, int blue){
analogWrite(PIN_RED,constrain(red,0,255));
analogWrite(PIN_GREEN,constrain(green,0,255));
analogWrite(PIN_BLUE,constrain(blue,0,255));
}


优化版代码:

/**
* 日期:2016/11/24
* 功能:蓝牙台灯
* 作者:单片机菜鸟
**/

#define BTSerial Serial1
#define MyDebugSerial Serial

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

#ifdef DEBUG
#define DBGLN(message)    MyDebugSerial.println(message)
#else
#define DBGLN(message)
#endif

#define PIN_RED 9
#define PIN_GREEN 10
#define PIN_BLUE 11

int red = 0;//红色
int green = 0;//绿色
int blue = 0;//蓝色

void setup() {
pinMode(PIN_RED, OUTPUT);
pinMode(PIN_GREEN, OUTPUT);
pinMode(PIN_BLUE, OUTPUT);
BTSerial.begin(9600);
MyDebugSerial.begin(9600);
}

void loop() {
int leng = ReceiveBTMessage();
if(leng>0){
    //收到了新RGB数值
    colorRGB(red,green,blue);
}
}

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

/**
* 读取串口缓冲区里面的数据
*
*/
int ReceiveBTMessage(){
/**
   * @Desc 把RGB组合成协议内的数据格式
   *开始符+长度+rgb+结束符
   * "+C,n:rgbString;"
   * 例子:"+C,10:100,255,60;"
   **/
String data = "";
if (BTSerial.available()>0){
    unsigned long start;
    start = millis();
    char c0 = BTSerial.read();
    if (c0 == '+')
    {
      char c;
      while (millis()-start<100)
      {
      if (BTSerial.available()>0)
      {
          c = BTSerial.read();
          data += c;
      }
      if (c==';')
          break;
      }

      int sLen = strlen(data.c_str());
      int i,r,g,b;
      for (i = 0; i <= sLen; i++){
      if (data == ':'){
          break;
      }
      }
      DBGLN(data);
      int iSize;
      //"+C,10:100,255,60;"   
      String _size = data.substring(2, i);
      iSize = _size.toInt();

      for(r=i+1;r<=sLen;r++){
         if(data==','){
         break;
          }
      }

      for(g=r+1;g<=sLen;g++){
         if(data==','){
         break;
          }
      }

      for(b=g+1;b<=sLen;b++){
         if(data==';'){
         break;
          }
      }

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

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

      DBGLN("red:"+sred);
      DBGLN("green:"+sgreen);
      DBGLN("blue:"+sblue);
      return iSize;
    }else{
      while(BTSerial.read() >= 0){}
    }
}
return 0;
}

void colorRGB(int red, int green, int blue){
#ifdef COMMON_GND
   analogWrite(PIN_RED,constrain(red,0,255));
   analogWrite(PIN_GREEN,constrain(green,0,255));
   analogWrite(PIN_BLUE,constrain(blue,0,255));
#else
   analogWrite(PIN_RED,constrain(255-red,0,255));
   analogWrite(PIN_GREEN,constrain(255-green,0,255));
   analogWrite(PIN_BLUE,constrain(255-blue,0,255));
#endif
}


四、总结

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

单片机菜鸟 发表于 2017-7-5 08:35:56

快乐每一天 发表于 2017-7-4 16:33
为什么装好后闪退

是不是你禁止掉什么权限呢 去app应用权限那里设置一下

单片机菜鸟 发表于 2016-12-25 12:28:09

楼主 做楼顶喝西北风

xinhoujue 发表于 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-5 08:05
已经发过去了

谢谢谢谢谢谢

死磕单片机 发表于 2017-1-6 11:45:26

单片机菜鸟 发表于 2017-1-5 08:05
已经发过去了

程序编译出错

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'
编译有误。

jdt 发表于 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:07
已经发过去了

程序编译不过什么原因?

死磕单片机 发表于 2017-1-6 14:09:48

单片机菜鸟 发表于 2017-1-6 14:07
我这个是基于mega2560你是不是用uno

是的,我用的uno

单片机菜鸟 发表于 2017-1-6 18:46:28

死磕单片机 发表于 2017-1-6 14:09
是的,我用的uno

所以你要修改一下源码
页: [1] 2 3 4 5
查看完整版本: 《博哥玩Arduino》- 蓝牙七彩灯优化版V1.0