极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 39969|回复: 24

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

[复制链接]
发表于 2016-11-25 22:04:36 | 显示全部楼层 |阅读模式
本帖最后由 单片机菜鸟 于 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

            
  1. int redPin = 9;
  2. int greenPin = 10;
  3. int bluePin = 11;

  4. void setup(){
  5. pinMode(redPin, OUTPUT);
  6. pinMode(greenPin, OUTPUT);
  7. pinMode(bluePin, OUTPUT);
  8. }

  9. void loop(){
  10. //R:0-255 G:0-255 B:0-255
  11. colorRGB(random(0,255),random(0,255),random(0,255));  
  12. delay(1000);
  13. }

  14. void colorRGB(int red, int green, int blue){
  15. analogWrite(redPin,constrain(red,0,255));
  16. analogWrite(greenPin,constrain(green,0,255));
  17. analogWrite(bluePin,constrain(blue,0,255));
  18. }
复制代码


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

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

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


     最后,有图有真相:
     

     

     

     

     以及用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  (出处: 极客工坊)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-11-25 22:19:11 | 显示全部楼层
自己做第一个冷板凳
回复 支持 反对

使用道具 举报

发表于 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-26 18:31:43 来自手机 | 显示全部楼层
ruan2570406 发表于 2016-11-26 16:26

哈哈哈..........
回复 支持 反对

使用道具 举报

发表于 2016-11-28 09:39:48 | 显示全部楼层
楼主可以把颜色码改成标准的8位颜色码,#FFFFFF,这样能在数据解析上变的更统一。
回复 支持 反对

使用道具 举报

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

我考虑的是 后面要数字  就直接不用再转一次了
回复 支持 反对

使用道具 举报

发表于 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-12-25 12:30:02 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-28 06:04 , Processed in 0.048566 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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