本帖最后由 单片机菜鸟 于 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[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));
- }
复制代码
最后,有图有真相:
以及用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 (出处: 极客工坊) |