1.前言
很久以前在其他平台发布了一些帖子,趁着有时间就同步到一起。这里主要是做一个蓝牙版本的RGB灯。
欢迎点赞关注博主。
2.优化事项
- 优化事项1:多彩灯颜色切换不够平滑,会闪烁。同时修改了arduino代码以及app代码(需要最新版app 麻烦在帖子下面留言)
- 优化事项2:arduino 代码没有考虑共阴还是共阳(最新版代码加入这个考虑事项)
- 未优化事项:可以考虑后期加入记录上一次灯颜色状态,下一次开灯就默认是该颜色
- 未优化事项:是否可以在板子上加入一个按钮,可以切换常用颜色,不一定每次都用app
3.优化版代码
具体优化的地方可以对比两份代码
- 旧代码
/**
* 日期: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));
}
- 优化版代码
/**
* 日期: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[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){
#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
}
3.总结
其实可以做的东西还是很多,比如我也可以把蓝牙多彩灯改成Wifi多彩灯,通过Wifi形式来控制。各位也可以做成各种好看的灯罩哈哈哈