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

1.前言

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

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

  • 《博哥玩Arduino》- 蓝牙模块HC06 重命名

2.设计内容

2.1 设计概念图

在这里插入图片描述

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

2.2 电路连接

  • HC06—>串口1(serial1)
    在这里插入图片描述

2.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的区别(需要去试验):

  • 接线中的改变,共阳的话,共用端需要接5V,共阴需要接GND。
  • 第二点就是,在颜色的调配上,与共阴是完全相反的。

举个例子:共阴RGB显示红色为R-255,G-0,B-0。然而共阳则完全相反,RGB数值是R-0,G-255,B-255。

3.材料

配件数量
ARDUINO 开发板1(我这里用mega)
HC06 蓝牙模块1
安卓手机1
杜邦线若干
RGB模块1

4.调试过程

4.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随机数的最大值。)

4.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[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));
}

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

注意点

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

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

5.总结

  • 重要是理解RGB灯的原理,其次就是蓝牙模块的使用。
  • 最重要是 一步一步调试 不能急躁。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

单片机菜鸟哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值