《博哥玩Arduino》- 蓝牙七彩灯优化版V2.0
文章目录
- 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相关推荐
- 《博哥玩Arduino》- 蓝牙七彩灯优化版V1.0
文章目录 1.前言 2.优化事项 3.优化版代码 3.总结 1.前言 很久以前在其他平台发布了一些帖子,趁着有时间就同步到一起.这里主要是做一个蓝牙版本的RGB灯. 欢迎点赞关注博主. 2.优化事项 ...
- 《博哥玩Arduino》- 蓝牙七彩灯基础版
文章目录 1.前言 2.设计内容 2.1 设计概念图 2.2 电路连接 2.3 RGB LED原理 3.材料 4.调试过程 4.1 测试RGB模块 4.2 app+arduino调试(干货来了) 5. ...
- VS模板 孤狼优化版v1.0
您的位置:首页 > cocos2d-x > VS模板 孤狼优化版v1.0 作者:完颜家斌 时间:2013-07-28 08:54:08 一直使用官方默认的模板创建项目都有一系列的头疼问题, ...
- 百度官方SEO搜索引擎优化指南V2.0版本发布
百度互联网创业俱乐部发布了<百度SEO搜索引擎优化指南V2.0>版本了,大家快来下载, 较之第一个版本的基础知识介绍,第二个版本更注重了网站性能和网站可用性,以及网站运营,数据分析方面, ...
- Android 系统性能优化(53)---功耗优化battery-historian V2.0的数据获取
battery-historian V2.0的数据获取及参数分析 单来说,Battery historian是一款通过上传bugreport文件分析用户手机中App的电池耗电情况的工具. 那bugre ...
- 360极速浏览器去广告优化版 v13.0.2101.0
每台电脑都会安装那么一个或者多个浏览器共同使用,但是有一个好的浏览器能够带给用户很好的体验,今天为大家带来的是360极速浏览器去广告优化版,这是星空优化而来的版本,已删除360医生.升级库.反馈.36 ...
- html标签助手,TidExpress(HTML代码编辑优化助手)V2.0.2.1 正式版
TidExpress(HTML代码编辑优化助手)是一款很优秀好用的Web代码编辑的辅助工具.如果你需要一款好用的代码编辑工具,不妨试试小编带来的这款TidExpress软件,功能强大全面,使用后可以帮 ...
- 小米8se账号锁_小米 8SE MIUI10_9.9.3 解除账户锁_屏幕锁 纯净ROM ROOT优化版V4.0
解除手机账号锁/屏幕锁,独家优化技术,不含任何内置推广. 注意事项: 请在刷机前取出sim手机卡,如果未取出会导致开机向导报错且无法进入系统 切记不要在开机向导连接WIFI,如果已经连接WIFI请重新 ...
- 小米8se账号锁_小米8SE MIUI11_9.11.21解账户锁_屏幕锁 纯净ROM ROOT优化版V1.0
注意事项: 请在刷机前取出sim手机卡,如果未取出会导致开机向导报错且无法进入系统 首次开机时不要在开机向导连接WIFI和移动网络,如果已经连接,请重新刷机 使用此刷机包后将不能使用小米账号所有功能 ...
最新文章
- 【实用】SAP Call Transaction下钻功能大全
- 关于线程的执行顺序,可能真的只是你以为的你以为
- mysql_数据备份和迁移(Windows)
- Q88:全局光照(Global Illumination)——Path Tracing
- python考勤系统_python – 使用Django的考勤系统
- 范数、损失函数、标准差
- 走访名校名企,助力生涯规划
- Java编程基础19——Map集合斗地主案例
- ffmpeg 4.2.1 版本升级日志 APIChanges
- cmd 中清空当前行的快捷键
- 二十万字带你入门C语言-史上最强C语言教程(汇总篇)
- 游戏编程中的人工智能技术
- 【Multisim仿真】LM339过零电路仿真
- 计算机技术与软件证书用处,【考计算机技术与软件专业资格水平考试有什么用,各级别证书有什么用?】- 环球网校...
- html css 中浮动影响与浮动问题的解决
- 百度沈抖:建设新型基础设施,让中小企业尝到数字化的甜头
- 第61章 如何获得完美腹肌?
- AI行业精选日报_人工智能(12·23)
- zip的使用--组合坐标
- 2019北航6系考研一点点分享
热门文章
- 百度webgis-api-mapv可视化开源库
- java.util.ConcurrentModificationException 	at java.util.ArrayList$Itr.checkForComodification
- 双弧脉冲 MIG 焊嵌入式控制系统设计及试验分析
- 新手入门学习SAP,SAP初级实施顾问入门学习难点重点及建议
- Linux:文件权限管理小案例2:西游记师徒四人叛变记
- 自动生成文章的AI伪原创app下载安装教程
- RBAC权限管理系统
- 模拟商场优惠打折 华为OD真题 100
- python No dq3d python package, filterreg deformation model not available.
- android7 init,Android7.0 init.rc流程分析