极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16861|回复: 9

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

[复制链接]
发表于 2016-12-30 22:19:53 | 显示全部楼层 |阅读模式
本帖最后由 单片机菜鸟 于 2017-6-14 16:22 编辑

一、前言

app 下载路径:http://sj.qq.com/myapp/detail.htm?apkName=com.wty.app.wifirgb

    前篇帖子
    《博哥玩Arduino》- 蓝牙七彩灯优化版V1.0
        http://www.geek-workshop.com/thread-28073-1-1.html(出处: 极客工坊)
     有讲到有两个未优化事项,如下:
     未优化事项:可以考虑后期加入记录上一次灯颜色状态,下一次开灯就默认是该颜色
     未优化事项:是否可以在板子上加入一个按钮,可以切换常用颜色,不一定每次都用app

二、遇到问题以及解决方案

     1.未优化事项:可以考虑后期加入记录上一次灯颜色状态,下一次开灯就默认是该颜色
        这里就要用到EEPROM这个掉电保存,EEPROM讲解可以参考
       《博哥Arduino学习笔记系列》- 第七课 EEPROM断电保存数据
                http://www.geek-workshop.com/thread-28080-1-1.html(出处: 极客工坊)

     2.未优化事项:是否可以在板子上加入一个按钮,可以切换常用颜色,不一定每次都用app
         本来想加入红外遥控的,但是红外遥控影响了PWM,所以只能用按键,按键讲解可以参考
      《博哥Arduino学习笔记系列》- 第四课 经典按键实验
                http://www.geek-workshop.com/thread-27958-1-1.html  (出处: 极客工坊)

        本来想上个视频的,但是其实跟V1.0很像,所以就不上了。
三、调试代码
  
  1. /**
  2. * 日期:2016/12/30
  3. * 功能:蓝牙台灯
  4. * 作者:单片机菜鸟
  5. **/
  6. #include<EEPROM.h>

  7. #define BTSerial Serial1
  8. #define MyDebugSerial Serial

  9. //该条语句用于使能DEBUG输出信息,屏蔽掉就不会输出debug调试信息
  10. //#define DEBUG
  11. //该条语句用于使能是共阴RGB  屏蔽掉就是共阳RGB
  12. //#define COMMON_GND

  13. #ifdef DEBUG
  14. #define DBGLN(message)    MyDebugSerial.println(message)
  15. #else
  16. #define DBGLN(message)
  17. #endif

  18. #define MAX  7
  19. #define KEY  7
  20. #define PIN_RED 9
  21. #define PIN_GREEN 10
  22. #define PIN_BLUE 11

  23. #define RED_ADDR 0  //红色 eeprom地址
  24. #define BLUE_ADDR 1 //蓝色 eeprom地址
  25. #define GREEN_ADDR 2 //绿色 eeprom地址

  26. int red = 0;//红色
  27. int green = 0;//绿色
  28. int blue = 0;//蓝色
  29. boolean isNeedtoSave = false;//是否需要保存
  30. int saveCountX = 0;//统计当前次数
  31. int saveCountY = 0;//统计当前次数

  32. // 定义记录按键当前状态的变量
  33. int state_btn;
  34. // 定义记录按键最近一次状态变化的变量,并初始化状态为LOW。
  35. int lastButtonState = LOW;
  36. // 定义记录最近一次抖动的时间变量,并初始化时间为0毫秒。
  37. long lastDebounceTime = 0;
  38. // 定义延迟抖动的时间变量
  39. long debouncdDelay = 60;

  40. int currentcode = 0;

  41. //rgb编码
  42. unsigned int rgb_code[MAX][3] = {
  43.   {255,255,255},//白光
  44.   {255,0,0},//红光
  45.   {0,255,0},//绿光
  46.   {0,0,255},//蓝光
  47.   {255,255,0},//黄光
  48.   {0,255,255},//浅蓝
  49.   {255,0,255}//浅紫
  50. };

  51. void setup() {
  52.   pinMode(PIN_RED, OUTPUT);
  53.   pinMode(PIN_GREEN, OUTPUT);
  54.   pinMode(PIN_BLUE, OUTPUT);
  55.   //配置10号引脚为输入引脚 如果是自己连接普通按键 pinMode(KEY,INPUT_PULLUP),弱上拉
  56.   pinMode(KEY,INPUT);
  57.   BTSerial.begin(9600);
  58.   #ifdef DEBUG
  59.     MyDebugSerial.begin(9600);
  60.   #endif
  61.   init_RGB();
  62. }

  63. void loop() {
  64.   int leng = ReceiveBTMessage();
  65.   if(leng>0){
  66.     //收到了新RGB数值
  67.     colorRGB(red,green,blue);
  68.   }
  69.   changeRGBbyButton();
  70.   saveEEPROM();
  71. }

  72. /**
  73. * 初始化RGB灯
  74. */
  75. void init_RGB(){
  76.   red = EEPROM.read(RED_ADDR);
  77.   DBGLN(red);
  78.   delay(10);
  79.   green = EEPROM.read(GREEN_ADDR);
  80.   delay(10);
  81.    DBGLN(green);
  82.   blue = EEPROM.read(BLUE_ADDR);
  83.   delay(10);
  84.   DBGLN(blue);
  85.   colorRGB(red,green,blue);
  86. }

  87. void saveEEPROM(){
  88.   //以下这段代码是为了存储eeprom  因为定时中断不能用 所以就用了这么猥琐的代码
  89.   if(saveCountX == 30){

  90.     if(saveCountY == 30000){
  91.       saveCountX = 0;
  92.       saveCountY = 0;
  93.       if(isNeedtoSave){
  94.         isNeedtoSave = false;
  95.         saveRGBtoEEPROM();
  96.       }
  97.     }else{
  98.       saveCountY ++;
  99.     }
  100.   }else{
  101.     if(saveCountY == 30000){
  102.       saveCountX ++;
  103.       saveCountY = 0;
  104.     }else{
  105.       saveCountY ++;
  106.     }
  107.   }
  108. }

  109. /**
  110. * 把rgb数据保存到EEPROM上去
  111. */
  112. void saveRGBtoEEPROM(){
  113.   DBGLN("saveRGBtoEEPROM");
  114.   DBGLN(red);
  115.   DBGLN(green);
  116.   DBGLN(blue);
  117.   EEPROM.write(RED_ADDR,red);
  118.   delay(50);
  119.   EEPROM.write(GREEN_ADDR,green);
  120.   delay(50);
  121.   EEPROM.write(BLUE_ADDR,blue);
  122.   delay(50);
  123. }

  124. /**
  125. * 读取串口缓冲区里面的数据
  126. */
  127. int ReceiveBTMessage(){
  128.   /**
  129.      * @Desc 把RGB组合成协议内的数据格式
  130.      *  开始符+长度+rgb+结束符
  131.      * "+C,n:rgbString;"
  132.      * 例子:"+C,10:100,255,60;"
  133.      **/
  134.   String data = "";
  135.   if (BTSerial.available()>0){
  136.     unsigned long start;
  137.     start = millis();
  138.     char c0 = BTSerial.read();
  139.     if (c0 == '+'){
  140.       char c;
  141.       boolean data_right = false;
  142.       while (millis()-start<200) {
  143.         if (BTSerial.available()>0){
  144.           c = BTSerial.read();
  145.           delay(1);
  146.           data += c;
  147.         }
  148.         if (c==';'){
  149.           data_right = true;
  150.           break;
  151.         }
  152.       }
  153.       DBGLN(data);
  154.       if(!data_right)return;

  155.       int sLen = strlen(data.c_str());
  156.       int i,r,g,b;
  157.       for (i = 0; i <= sLen; i++){
  158.         if (data[i] == ':'){
  159.           break;
  160.         }
  161.       }
  162.       int iSize;
  163.       //"+C,10:100,255,60;"   
  164.       String _size = data.substring(2, i);
  165.       iSize = _size.toInt();

  166.       //"+C,10:1,1,1;"
  167.       if(iSize!=sLen-i-2)return;

  168.       for(r=i+1;r<=sLen;r++){
  169.          if(data[r]==','){
  170.            break;
  171.           }  
  172.       }

  173.       for(g=r+1;g<=sLen;g++){
  174.          if(data[g]==','){
  175.            break;
  176.           }  
  177.       }

  178.       for(b=g+1;b<=sLen;b++){
  179.          if(data[b]==';'){
  180.            break;
  181.           }  
  182.       }

  183.       String sred = data.substring(i+1,r);
  184.       String sgreen = data.substring(r+1,g);
  185.       String sblue = data.substring(g+1,b);

  186.       red = sred.toInt();
  187.       green = sgreen.toInt();
  188.       blue = sblue.toInt();

  189.       DBGLN("red:"+sred);
  190.       DBGLN("green:"+sgreen);
  191.       DBGLN("blue:"+sblue);

  192.       isNeedtoSave = true;
  193.       //变成0
  194.       saveCountX = 0;
  195.       saveCountY = 0;
  196.       
  197.       return iSize;
  198.     }else{
  199.       while(BTSerial.read() >= 0){}  
  200.     }
  201.   }
  202.   return 0;
  203. }

  204. /**
  205. * 控制RGB颜色
  206. */
  207. void colorRGB(int red, int green, int blue){
  208.   #ifdef COMMON_GND
  209.      analogWrite(PIN_RED,constrain(red,0,255));
  210.      analogWrite(PIN_GREEN,constrain(green,0,255));
  211.      analogWrite(PIN_BLUE,constrain(blue,0,255));
  212.   #else
  213.      analogWrite(PIN_RED,constrain(255-red,0,255));
  214.      analogWrite(PIN_GREEN,constrain(255-green,0,255));
  215.      analogWrite(PIN_BLUE,constrain(255-blue,0,255));
  216.   #endif
  217. }

  218. /**
  219. * 按键切换显示(应用于无app情景)
  220. */
  221. void changeRGBbyButton(){
  222.   int buttonState = digitalRead(KEY);//读取当前按键状态

  223.   if(buttonState != lastButtonState){
  224.      //如果按键发生了变化  则重新设置最近一次抖动的时间
  225.      //方法millis()可以获取当前时间,单位统一为毫秒。
  226.      lastDebounceTime = millis();  
  227.   }
  228.   
  229.   // 判断按键按下或抬起的状态时间间隔是否大于延迟抖动的时间长度。
  230.   if(millis()-lastDebounceTime>debouncdDelay){
  231.     // 判断当前的按键状态是否和之前有所变化
  232.     if(buttonState != state_btn){
  233.        // 如果发生了变化,
  234.        // 则更新按键状态变量。
  235.        state_btn = buttonState;
  236.        if(state_btn == HIGH){
  237.         //再次确认是否真的按下了按键,是的话
  238.          currentcode++;
  239.          if(currentcode == MAX){
  240.              currentcode = 0;
  241.          }
  242.          red = rgb_code[currentcode][0];
  243.          green = rgb_code[currentcode][1];
  244.          blue = rgb_code[currentcode][2];
  245.          colorRGB(red,green,blue);
  246.          isNeedtoSave = true;
  247.         //变成0
  248.         saveCountX = 0;
  249.         saveCountY = 0;
  250.        }
  251.     }
  252.   }
  253.   // 更新按键最近一次状态变化的变量
  254.      lastButtonState = buttonState;
  255. }
复制代码


     代码经过测试可行。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2017-1-4 18:48:22 | 显示全部楼层
博哥你的APP分享下吧[email protected]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-4 09:14:55 | 显示全部楼层
死磕单片机 发表于 2017-1-4 18:48
博哥你的APP分享下吧

已经发过去给你
回复 支持 反对

使用道具 举报

发表于 2017-2-4 16:31:16 | 显示全部楼层
厉害了。我的大博哥!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-5 13:08:15 | 显示全部楼层
ignore 发表于 2017-2-4 16:31
厉害了。我的大博哥!!

哈哈哈哈哈哈
回复 支持 反对

使用道具 举报

发表于 2017-2-8 21:20:27 | 显示全部楼层
楼主这是我的邮箱[email protected] 麻烦给我发下你的APP,谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-9 15:54:23 | 显示全部楼层
ZDY110 发表于 2017-2-8 21:20
楼主这是我的邮箱 麻烦给我发下你的APP,谢谢。

已经给你发过去了
回复 支持 反对

使用道具 举报

发表于 2017-2-9 16:08:57 | 显示全部楼层
3Q for sharing.
回复 支持 反对

使用道具 举报

发表于 2017-2-9 16:09:24 | 显示全部楼层
3Q for sharing.
回复 支持 反对

使用道具 举报

发表于 2017-5-7 02:51:54 | 显示全部楼层
我有个控制3爪彩灯的,配套带app,你要不
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 01:50 , Processed in 0.050128 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表