文章目录

  • 1.前言
  • 2.遇到问题以及解决方案
  • 3.调试代码

1.前言

上一篇说到还有两个未优化事项,如下:

  • 未优化事项:可以考虑后期加入记录上一次灯颜色状态,下一次开灯就默认是该颜色
  • 未优化事项:是否可以在板子上加入一个按钮,可以切换常用颜色,不一定每次都用app

2.遇到问题以及解决方案

  • 未优化事项:可以考虑后期加入记录上一次灯颜色状态,下一次开灯就默认是该颜色
    这里就要用到EEPROM这个掉电保存;
  • 未优化事项:是否可以在板子上加入一个按钮,可以切换常用颜色,不一定每次都用app
    本来想加入红外遥控的,但是红外遥控影响了PWM,所以只能用按键;

3.调试代码

/**
* 日期:2016/12/30
* 功能:蓝牙台灯
* 作者:单片机菜鸟
**/
#include<EEPROM.h>#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 MAX  7
#define KEY  7
#define PIN_RED 9
#define PIN_GREEN 10
#define PIN_BLUE 11#define RED_ADDR 0  //红色 eeprom地址
#define BLUE_ADDR 1 //蓝色 eeprom地址
#define GREEN_ADDR 2 //绿色 eeprom地址int red = 0;//红色
int green = 0;//绿色
int blue = 0;//蓝色
boolean isNeedtoSave = false;//是否需要保存
int saveCountX = 0;//统计当前次数
int saveCountY = 0;//统计当前次数// 定义记录按键当前状态的变量
int state_btn;
// 定义记录按键最近一次状态变化的变量,并初始化状态为LOW。
int lastButtonState = LOW;
// 定义记录最近一次抖动的时间变量,并初始化时间为0毫秒。
long lastDebounceTime = 0;
// 定义延迟抖动的时间变量
long debouncdDelay = 60;int currentcode = 0;//rgb编码
unsigned int rgb_code[MAX][3] = {{255,255,255},//白光{255,0,0},//红光{0,255,0},//绿光{0,0,255},//蓝光{255,255,0},//黄光{0,255,255},//浅蓝{255,0,255}//浅紫
};void setup() {pinMode(PIN_RED, OUTPUT);pinMode(PIN_GREEN, OUTPUT);pinMode(PIN_BLUE, OUTPUT);//配置10号引脚为输入引脚 如果是自己连接普通按键 pinMode(KEY,INPUT_PULLUP),弱上拉pinMode(KEY,INPUT);BTSerial.begin(9600);#ifdef DEBUGMyDebugSerial.begin(9600);#endifinit_RGB();
}void loop() {int leng = ReceiveBTMessage();if(leng>0){//收到了新RGB数值colorRGB(red,green,blue);}changeRGBbyButton();saveEEPROM();
}/**
* 初始化RGB灯
*/
void init_RGB(){red = EEPROM.read(RED_ADDR);DBGLN(red);delay(10);green = EEPROM.read(GREEN_ADDR);delay(10);DBGLN(green);blue = EEPROM.read(BLUE_ADDR);delay(10);DBGLN(blue);colorRGB(red,green,blue);
}void saveEEPROM(){//以下这段代码是为了存储eeprom  因为定时中断不能用 所以就用了这么猥琐的代码if(saveCountX == 30){if(saveCountY == 30000){saveCountX = 0;saveCountY = 0;if(isNeedtoSave){isNeedtoSave = false;saveRGBtoEEPROM();}}else{saveCountY ++;}}else{if(saveCountY == 30000){saveCountX ++;saveCountY = 0;}else{saveCountY ++;}}
}/**
* 把rgb数据保存到EEPROM上去
*/
void saveRGBtoEEPROM(){DBGLN("saveRGBtoEEPROM");DBGLN(red);DBGLN(green);DBGLN(blue);EEPROM.write(RED_ADDR,red);delay(50);EEPROM.write(GREEN_ADDR,green);delay(50);EEPROM.write(BLUE_ADDR,blue);delay(50);
}/**
* 读取串口缓冲区里面的数据
*/
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;boolean data_right = false;while (millis()-start<200) {if (BTSerial.available()>0){c = BTSerial.read();delay(1);data += c;}if (c==';'){data_right = true;break;}}DBGLN(data);if(!data_right)return;int sLen = strlen(data.c_str());int i,r,g,b;for (i = 0; i <= sLen; i++){if (data[i] == ':'){break;}}int iSize;//"+C,10:100,255,60;"    String _size = data.substring(2, i);iSize = _size.toInt();//"+C,10:1,1,1;"if(iSize!=sLen-i-2)return;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);isNeedtoSave = true;//变成0saveCountX = 0;saveCountY = 0;return iSize;}else{while(BTSerial.read() >= 0){}  }}return 0;
}/**
* 控制RGB颜色
*/
void colorRGB(int red, int green, int blue){#ifdef COMMON_GNDanalogWrite(PIN_RED,constrain(red,0,255));analogWrite(PIN_GREEN,constrain(green,0,255));analogWrite(PIN_BLUE,constrain(blue,0,255));#elseanalogWrite(PIN_RED,constrain(255-red,0,255));analogWrite(PIN_GREEN,constrain(255-green,0,255));analogWrite(PIN_BLUE,constrain(255-blue,0,255));#endif
}/**
* 按键切换显示(应用于无app情景)
*/
void changeRGBbyButton(){int buttonState = digitalRead(KEY);//读取当前按键状态if(buttonState != lastButtonState){//如果按键发生了变化  则重新设置最近一次抖动的时间//方法millis()可以获取当前时间,单位统一为毫秒。lastDebounceTime = millis();  }// 判断按键按下或抬起的状态时间间隔是否大于延迟抖动的时间长度。if(millis()-lastDebounceTime>debouncdDelay){// 判断当前的按键状态是否和之前有所变化if(buttonState != state_btn){// 如果发生了变化,// 则更新按键状态变量。state_btn = buttonState;if(state_btn == HIGH){//再次确认是否真的按下了按键,是的话currentcode++;if(currentcode == MAX){currentcode = 0;}red = rgb_code[currentcode][0];green = rgb_code[currentcode][1];blue = rgb_code[currentcode][2];colorRGB(red,green,blue);isNeedtoSave = true;//变成0saveCountX = 0;saveCountY = 0;}}}// 更新按键最近一次状态变化的变量lastButtonState = buttonState;
}

代码经过测试可行。。。

《博哥玩Arduino》- 蓝牙七彩灯优化版V2.0相关推荐

  1. 《博哥玩Arduino》- 蓝牙七彩灯优化版V1.0

    文章目录 1.前言 2.优化事项 3.优化版代码 3.总结 1.前言 很久以前在其他平台发布了一些帖子,趁着有时间就同步到一起.这里主要是做一个蓝牙版本的RGB灯. 欢迎点赞关注博主. 2.优化事项 ...

  2. 《博哥玩Arduino》- 蓝牙七彩灯基础版

    文章目录 1.前言 2.设计内容 2.1 设计概念图 2.2 电路连接 2.3 RGB LED原理 3.材料 4.调试过程 4.1 测试RGB模块 4.2 app+arduino调试(干货来了) 5. ...

  3. VS模板 孤狼优化版v1.0

    您的位置:首页 > cocos2d-x > VS模板 孤狼优化版v1.0 作者:完颜家斌 时间:2013-07-28 08:54:08 一直使用官方默认的模板创建项目都有一系列的头疼问题, ...

  4. 百度官方SEO搜索引擎优化指南V2.0版本发布

    百度互联网创业俱乐部发布了<百度SEO搜索引擎优化指南V2.0>版本了,大家快来下载,  较之第一个版本的基础知识介绍,第二个版本更注重了网站性能和网站可用性,以及网站运营,数据分析方面, ...

  5. Android 系统性能优化(53)---功耗优化battery-historian V2.0的数据获取

    battery-historian V2.0的数据获取及参数分析 单来说,Battery historian是一款通过上传bugreport文件分析用户手机中App的电池耗电情况的工具. 那bugre ...

  6. 360极速浏览器去广告优化版 v13.0.2101.0

    每台电脑都会安装那么一个或者多个浏览器共同使用,但是有一个好的浏览器能够带给用户很好的体验,今天为大家带来的是360极速浏览器去广告优化版,这是星空优化而来的版本,已删除360医生.升级库.反馈.36 ...

  7. html标签助手,TidExpress(HTML代码编辑优化助手)V2.0.2.1 正式版

    TidExpress(HTML代码编辑优化助手)是一款很优秀好用的Web代码编辑的辅助工具.如果你需要一款好用的代码编辑工具,不妨试试小编带来的这款TidExpress软件,功能强大全面,使用后可以帮 ...

  8. 小米8se账号锁_小米 8SE MIUI10_9.9.3 解除账户锁_屏幕锁 纯净ROM ROOT优化版V4.0

    解除手机账号锁/屏幕锁,独家优化技术,不含任何内置推广. 注意事项: 请在刷机前取出sim手机卡,如果未取出会导致开机向导报错且无法进入系统 切记不要在开机向导连接WIFI,如果已经连接WIFI请重新 ...

  9. 小米8se账号锁_小米8SE MIUI11_9.11.21解账户锁_屏幕锁 纯净ROM ROOT优化版V1.0

    注意事项: 请在刷机前取出sim手机卡,如果未取出会导致开机向导报错且无法进入系统 首次开机时不要在开机向导连接WIFI和移动网络,如果已经连接,请重新刷机 使用此刷机包后将不能使用小米账号所有功能 ...

最新文章

  1. 【实用】SAP Call Transaction下钻功能大全
  2. 关于线程的执行顺序,可能真的只是你以为的你以为
  3. mysql_数据备份和迁移(Windows)
  4. Q88:全局光照(Global Illumination)——Path Tracing
  5. python考勤系统_python – 使用Django的考勤系统
  6. 范数、损失函数、标准差
  7. 走访名校名企,助力生涯规划
  8. Java编程基础19——Map集合斗地主案例
  9. ffmpeg 4.2.1 版本升级日志 APIChanges
  10. cmd 中清空当前行的快捷键
  11. 二十万字带你入门C语言-史上最强C语言教程(汇总篇)
  12. 游戏编程中的人工智能技术
  13. 【Multisim仿真】LM339过零电路仿真
  14. 计算机技术与软件证书用处,【考计算机技术与软件专业资格水平考试有什么用,各级别证书有什么用?】- 环球网校...
  15. html css 中浮动影响与浮动问题的解决
  16. 百度沈抖:建设新型基础设施,让中小企业尝到数字化的甜头
  17. 第61章 如何获得完美腹肌?
  18. AI行业精选日报_人工智能(12·23)
  19. zip的使用--组合坐标
  20. 2019北航6系考研一点点分享

热门文章

  1. 百度webgis-api-mapv可视化开源库
  2. java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification
  3. 双弧脉冲 MIG 焊嵌入式控制系统设计及试验分析
  4. 新手入门学习SAP,SAP初级实施顾问入门学习难点重点及建议
  5. Linux:文件权限管理小案例2:西游记师徒四人叛变记
  6. 自动生成文章的AI伪原创app下载安装教程
  7. RBAC权限管理系统
  8. 模拟商场优惠打折 华为OD真题 100
  9. python No dq3d python package, filterreg deformation model not available.
  10. android7 init,Android7.0 init.rc流程分析