本帖最后由 单片机菜鸟 于 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》- 蓝牙七彩灯 来写的,没有看过的麻烦先去看看这篇,毕竟原理已经讲了很清楚。
多彩灯效果:
(为了看出效果,楼主把一个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[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
- }
复制代码
四、总结
其实可以做的东西还是很多,比如我也可以把蓝牙多彩灯改成Wifi多彩灯,通过Wifi形式来控制。各位也可以做成各种好看的灯罩哈哈哈
好了,祝各位圣诞快乐 |