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灯的原理,其次就是蓝牙模块的使用。
- 最重要是 一步一步调试 不能急躁。