单片机菜鸟 发表于 2016-11-25 22:04:36

《博哥玩Arduino》- 蓝牙七彩灯基础版

本帖最后由 单片机菜鸟 于 2017-6-14 16:20 编辑

一、前言

app 下载路径:http://sj.qq.com/myapp/detail.htm?apkName=com.wty.app.wifirgb
       前些时间做了蓝牙小车

       《博哥玩Arduino》-蓝牙小车-基础篇
                http://www.geek-workshop.com/thread-27767-1-1.html   (出处: 极客工坊)

      《博哥玩Arduino》-蓝牙小车-实操篇
                http://www.geek-workshop.com/thread-27777-1-1.html   (出处: 极客工坊)

       后面又研究了一下ESP8266 wifi模块,然后发现在买ESP8266模块时发现商家提供了app+RGB灯,app可以控制RGB显示颜色。感觉还是有点意思,所以就考虑一下要不咱也做一个蓝牙版本的RGB灯。

       由于我这里修改了蓝牙模块的名字,需要自己命名的可以看这篇:

       《博哥玩Arduino》- 蓝牙模块HC06 重命名
                http://www.geek-workshop.com/thread-27897-1-1.html(出处: 极客工坊)

       注意:Arduino板子是Mega2560,由于楼主没有RGB模块,所以以下都是讲解原理以及实际效果,楼主会通过 串口打印讲解实际效果(毕竟RGB其实就是收到0-255数字量而已,这个很多资料)

二、设计原理

        1.概念图
       

         手机App扫描附近蓝牙设备,找到”蓝牙台灯“,点击连接,然后随意点击圆盘颜色选择器,就会把选择的颜色发送到HC06蓝牙模块,arduino再读取串口数据缓冲区拿到协议数据,再解析并控制RGB灯

      2.电路连接
         HC06--->串口1(serial1)
         

        3.RGB LED原理
          
          

         之所以叫RGB,是因为这个LED是由红(Red)、绿(Green)和蓝(Blue)三色组成。我们电脑的显示器也是由一个个小的红、绿、蓝点组成的。可以通过调整三个LED中每个灯的亮度就能产生不同的颜色。

          RGB灯有4个引脚,R、G、B三个引脚连接到LED灯的一端,还有一个引脚是共用的正极(vcc)或者共用的阴极(gnd)。假设这里选用的是共阴RGB。R、G、B其实就是三个LED的正极,把它们的负极拉到一个公共引脚上了,它们公共引脚是负极,所以称之为共阴RGB。

       RGB灯如何使用呢?如何实现变色呢?
       RGB只是简单的把三个颜色的LED灯封装在一个LED中。只要当做三个灯使用就可以了。我们都知道红色、绿色、蓝色是三原色,Arduino通过PWM口对三种颜色明暗的调节,也就analogWrite(value)语句,就能让LED调出任何你想要的颜色。
      使用PWM可以产生0~255之间的全部颜色,共16777216种颜色(256×256×256),市面上那些说自己有1000万种颜色的灯就是这个原理。

      共阳RGB与共阴RGB的区别(需要去试验):
      (1)接线中的改变,共阳的话,共用端需要接5V,共阴需要接GND。
      (2)第二点就是,在颜色的调配上,与共阴是完全相反的。
               举个例子:共阴RGB显示红色为R-255,G-0,B-0。然而共阳则完全相反,RGB数值是R-0,G-255,B-255。


三、材料

          配件如下:
   ARDUINO 开发板                1块(我这里使用mega)
   HC06 蓝牙模块                   1个
   安卓手机                            1部      
   杜邦线                              若干
   RGB模块                           1个(楼主资金短缺,当做它存在就可以了)
四、调试过程

          1.测试RGB模块

             R引脚 ----> 引脚9
             G引脚 ----> 引脚10         
             B引脚 ----> 引脚11

             int redPin = 9;
int greenPin = 10;
int bluePin = 11;

void setup(){
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}

void loop(){
//R:0-255 G:0-255 B:0-255
colorRGB(random(0,255),random(0,255),random(0,255));
delay(1000);
}

void colorRGB(int red, int green, int blue){
analogWrite(redPin,constrain(red,0,255));
analogWrite(greenPin,constrain(green,0,255));
analogWrite(bluePin,constrain(blue,0,255));
}

   没错的话,应该可以看到LED颜色呈现随机的变化。(constrain()函数需要3个参数:x、a和b。这里x是一个被约束的数,a是最小值,b是最大值。如果值小于a,则返回a。如果大于b,则返回b。random()函数用于生成一个随机数,min随机数的最小值,max随机数的最大值。)

      2.app+arduino调试(干货来了)

      需要app的麻烦在帖子留言楼主自助app,自测没有什么问题,如发现什么明显错误,烦请在本帖子留言。
      
      然后,附上Arduino代码:
      
/**
* 日期: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));
}


   最后,有图有真相:
   

   

   

   

   以及用Arduino IDE 串口打印的结果(这个结果应该是跟app端显示的RGB值是一致的):

   

   使用的时候随意点击圆盘中的任意一个点(每个点就是一个RGB值),就会看到app 页面的四方块显示当前选择的颜色以及RGB值。

注意点:
   手机端以及Arduino的数据协议格式,我定义为:
      "+C,10:100,255,60;"
      含义:+C开始符
                10后面真正的数据长度(100,255,60)
                :   数据开始符
                ;   数据结束符
                ,   分隔符

      所以Arduino 程序的ReceiveBTMessage 就会去解析这个协议。

      好了,总结一下:

      1)重要是理解RGB灯的原理,其次就是蓝牙模块的使用。
      2)最重要是 一步一步调试 不能急躁。
      3)楼主由于穷,没去买RGB模块 只能模拟了,大伙谅解。

   优化版:
《博哥玩Arduino》- 蓝牙七彩灯优化版
http://www.geek-workshop.com/thread-28073-1-1.html
(出处: 极客工坊)

         
《博哥玩Arduino》-蓝牙小车-基础篇
   http://www.geek-workshop.com/thread-27767-1-1.html (出处: 极客工坊)
《博哥玩Arduino》-蓝牙小车-实操篇
   http://www.geek-workshop.com/thread-27777-1-1.html (出处: 极客工坊)
《博哥玩Arduino》-Arduino语法手册
   http://www.geek-workshop.com/thread-27843-1-1.html (出处: 极客工坊)
《博哥玩Arduino》-WIFI小车-基础篇
   http://www.geek-workshop.com/thread-27850-1-1.html (出处: 极客工坊)
《博哥玩Arduino》-WIFI小车-调试实操篇
   http://www.geek-workshop.com/thread-27853-1-1.html (出处: 极客工坊)
《博哥玩Arduino》- 蓝牙模块HC06 重命名
   http://www.geek-workshop.com/thread-27897-1-1.html (出处: 极客工坊)
《博哥玩Arduino》- 蓝牙RGB灯
    http://www.geek-workshop.com/thread-27892-1-1.html(出处: 极客工坊)

单片机菜鸟 发表于 2016-11-25 22:19:11

自己做第一个冷板凳

电磁波 发表于 2016-11-25 22:25:32

真不错。。

靳靳 发表于 2016-11-26 01:16:40

楼主软件怎么做的可以教一下嘛,这个教程,哈哈,谢谢楼主

单片机菜鸟 发表于 2016-11-26 07:11:26

靳靳 发表于 2016-11-26 01:16
楼主软件怎么做的可以教一下嘛,这个教程,哈哈,谢谢楼主

android应用开发

单片机菜鸟 发表于 2016-11-26 07:11:38

电磁波 发表于 2016-11-25 22:25
真不错。。

谢谢哈哈哈

ruan2570406 发表于 2016-11-26 16:26:20

:o:o:o:o:o:o:o

单片机菜鸟 发表于 2016-11-26 18:31:43

ruan2570406 发表于 2016-11-26 16:26


哈哈哈..........

164335413 发表于 2016-11-28 09:39:48

楼主可以把颜色码改成标准的8位颜色码,#FFFFFF,这样能在数据解析上变的更统一。

单片机菜鸟 发表于 2016-11-28 10:07:12

164335413 发表于 2016-11-28 09:39
楼主可以把颜色码改成标准的8位颜色码,#FFFFFF,这样能在数据解析上变的更统一。

我考虑的是 后面要数字就直接不用再转一次了

164335413 发表于 2016-11-29 09:18:22

单片机菜鸟 发表于 2016-11-28 10:07
我考虑的是 后面要数字就直接不用再转一次了

不过,Arduino收到的0,1,2,也是字符,因为用了一些转换的函数才识别成数字。

单片机菜鸟 发表于 2016-11-29 09:27:18

164335413 发表于 2016-11-29 09:18
不过,Arduino收到的0,1,2,也是字符,因为用了一些转换的函数才识别成数字。

其实无所谓了就看你定的协议是什么样而已

单片机菜鸟 发表于 2016-12-25 12:29:36

电磁波 发表于 2016-11-25 22:25
真不错。。

哈哈哈哈谢谢

单片机菜鸟 发表于 2016-12-25 12:30:02

ruan2570406 发表于 2016-11-26 16:26


:D:D:D:D哈哈哈

lllangxx 发表于 2016-12-25 12:48:26

赞:lol。。。。
页: [1] 2
查看完整版本: 《博哥玩Arduino》- 蓝牙七彩灯基础版