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

1.前言

很久以前在其他平台发布了一些帖子,趁着有时间就同步到一起。这里主要是做一个蓝牙版本的RGB灯。
欢迎点赞关注博主。

2.优化事项

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

3.优化版代码

具体优化的地方可以对比两份代码

  • 旧代码
/**
* 日期: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[i] == ':'){
          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[r]==','){
           break;
          }  
      }

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

      for(b=g+1;b<=sLen;b++){
         if(data[b]==';'){
           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[i] == ':'){
          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[r]==','){
           break;
          }  
      }

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

      for(b=g+1;b<=sLen;b++){
         if(data[b]==';'){
           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
}

3.总结

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

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机菜鸟哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值