《博哥玩Arduino》- 蓝牙七彩灯优化版V1.0
本帖最后由 单片机菜鸟 于 2017-6-14 16:21 编辑一、前言
app 下载路径:http://sj.qq.com/myapp/detail.htm?apkName=com.wty.app.wifirgb
前段时间写了个帖子
《博哥玩Arduino》- 蓝牙七彩灯
http://www.geek-workshop.com/thread-27892-1-1.html(出处: 极客工坊)
不过当时因为没有RGB模块,所以就讲了一下基本原理以及调试过程。后面虽然RGB模块回来了,但楼主因为要评测公司高级工程师(需要考笔试,可惜楼主没有考过,想想有点小失落),所以并没有写最终效果的帖子。趁着这好日子(虽然不怎么过圣诞节,还是祝各位圣诞节快乐),出门前就把早上的调试结果总结一下,以供大家参考。
这篇文章是基于《博哥玩Arduino》- 蓝牙七彩灯 来写的,没有看过的麻烦先去看看这篇,毕竟原理已经讲了很清楚。
多彩灯效果:
http://v.youku.com/v_show/id_XMTg4MjIwNTUxMg==.html
(为了看出效果,楼主把一个xxx风油精的瓶子放在RGB灯上面,各位也可以DIY各种灯罩效果哈哈哈哈)
二、优化事项
优化事项1:多彩灯颜色切换不够平滑,会闪烁。同时修改了arduino代码以及app代码(需要最新版app 麻烦在帖子下面留言)
优化事项2:arduino 代码没有考虑共阴还是共阳(最新版代码加入这个考虑事项)
未优化事项:可以考虑后期加入记录上一次灯颜色状态,下一次开灯就默认是该颜色
未优化事项:是否可以在板子上加入一个按钮,可以切换常用颜色,不一定每次都用app
.......
三、优化版代码
具体优化的地方可以对比两份代码
旧代码:
/**
* 日期: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));
}
优化版代码:
/**
* 日期:2016/11/24
* 功能:蓝牙台灯
* 作者:单片机菜鸟
**/
#define BTSerial Serial1
#define MyDebugSerial Serial
//该条语句用于使能DEBUG输出信息,屏蔽掉就不会输出debug调试信息
//#define DEBUG
//该条语句用于使能是共阴RGB屏蔽掉就是共阳RGB
//#define COMMON_GND
#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);
}
}
/**
* 初始化RGB灯(后面可以考虑加入一个记录之前状态的功能,下次打开就取出来显示)
*/
void init_RGB(){
#ifdef COMMON_GND
colorRGB(255,255,255);
#else
colorRGB(0,0,0);
#endif
}
/**
* 读取串口缓冲区里面的数据
*
*/
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<100)
{
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){
#ifdef COMMON_GND
analogWrite(PIN_RED,constrain(red,0,255));
analogWrite(PIN_GREEN,constrain(green,0,255));
analogWrite(PIN_BLUE,constrain(blue,0,255));
#else
analogWrite(PIN_RED,constrain(255-red,0,255));
analogWrite(PIN_GREEN,constrain(255-green,0,255));
analogWrite(PIN_BLUE,constrain(255-blue,0,255));
#endif
}
四、总结
其实可以做的东西还是很多,比如我也可以把蓝牙多彩灯改成Wifi多彩灯,通过Wifi形式来控制。各位也可以做成各种好看的灯罩哈哈哈
好了,祝各位圣诞快乐 快乐每一天 发表于 2017-7-4 16:33
为什么装好后闪退
是不是你禁止掉什么权限呢 去app应用权限那里设置一下 楼主 做楼顶喝西北风 想要楼主的APP玩,不知可否发我 [email protected] 邮箱吗?谢了! xinhoujue 发表于 2017-1-3 10:13
想要楼主的APP玩,不知可否发我邮箱吗?谢了!
已经发送过去了请查收 关注博哥好久了,博哥的APP也给我个吧。谢谢[email protected] 死磕单片机 发表于 2017-1-4 18:39
关注博哥好久了,博哥的APP也给我个吧。谢谢
已经发过去了 单片机菜鸟 发表于 2017-1-5 08:05
已经发过去了
谢谢谢谢谢谢 单片机菜鸟 发表于 2017-1-5 08:05
已经发过去了
程序编译出错
blue_light.ino: In function 'void setup()':
blue_light.ino:7:18: error: 'Serial1' was not declared in this scope
blue_light.ino:33:3: note: in expansion of macro 'BTSerial'
blue_light.ino: In function 'int ReceiveBTMessage()':
blue_light.ino:7:18: error: 'Serial1' was not declared in this scope
blue_light.ino:68:7: note: in expansion of macro 'BTSerial'
编译有误。
楼主这是我的邮箱[email protected] 麻烦给我发下你的APP,谢谢。 死磕单片机 发表于 2017-1-6 11:45
程序编译出错
blue_light.ino: In function 'void setup()':
我这个是基于mega2560你是不是用uno 死磕单片机 发表于 2017-1-6 11:45
程序编译出错
blue_light.ino: In function 'void setup()':
我这个是基于mega2560你是不是用uno jdt 发表于 2017-1-6 12:00
楼主这是我的邮箱 麻烦给我发下你的APP,谢谢。
已经发过去了 单片机菜鸟 发表于 2017-1-6 14:07
已经发过去了
程序编译不过什么原因? 单片机菜鸟 发表于 2017-1-6 14:07
我这个是基于mega2560你是不是用uno
是的,我用的uno 死磕单片机 发表于 2017-1-6 14:09
是的,我用的uno
所以你要修改一下源码