找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6659|回复: 7
打印 上一主题 下一主题
收起左侧

微信+arduino远程控制RGB灯的设计

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 lfb532 于 2018-9-13 05:30 编辑

远程控制RGB灯

例如在微信界面点击发送,微信界面发送字符“$RGB,R255,G125,B000#”至下位机,下位机根据程序判断打开灯R亮度255,灯G亮度125,B灯亮度0。
解释协议:R灯亮度255;G灯亮度125;B灯亮度0。
然后下位机给微信界面返回数据包$RGB,(0-2),#
解释协议:$RGB,0,#:成功;
                  $RGB,1,#:失败;
                  $RGB,2,#:不匹配当前



单片机源程序如下:
  1. /**
  2. * @par Copyright (C): 2010-2019, Shenzhen Yahboom Tech
  3. * @file         2、远程控制RGB灯
  4. * @author       liusen
  5. * @version      V1.0
  6. * @date         2017.11.14
  7. * @brief        AR物联网套件
  8. * @details
  9. * @par History  见如下说明
  10. *
  11. */


  12. //定义引脚
  13. int RED_LED_Pin = 3;              //红色LED
  14. int GREEN_LED_Pin = 10;           //绿色LED
  15. int BLUE_LED_Pin = 11;          //黄色LED


  16. int incomingByte = 0;       // 接收到的 data byte
  17. String inputString = "";         // 用来储存接收到的内容
  18. boolean newLineReceived = false; // 前一次数据结束标志
  19. boolean startBit  = false;  //协议开始标志


  20. String returntemp = ""; //存储返回值
  21. /**
  22. * Function       setup
  23. * @author        liusen
  24. * @date          2017.11.14
  25. * @brief         初始化配置
  26. * @param[in]     void
  27. * @retval        void
  28. * @par History   无
  29. */
  30. void setup()
  31. {
  32.    //初始化LEDIO口为输出方式
  33.    pinMode(RED_LED_Pin, OUTPUT);   
  34.    pinMode(GREEN_LED_Pin, OUTPUT);
  35.    pinMode(BLUE_LED_Pin, OUTPUT);
  36.   
  37.    Serial.begin(9600);        //波特率9600 (Wifi通讯设定波特率)
  38.    //LED初始化低电平
  39.   digitalWrite(RED_LED_Pin, LOW);   
  40.   digitalWrite(GREEN_LED_Pin, LOW);  
  41.   digitalWrite(BLUE_LED_Pin, LOW);  

  42.   
  43. }
  44. /**
  45. * Function       loop
  46. * @author        liusen
  47. * @date          2017.11.14
  48. * @brief         按照接收的数据根据协议完成相应的功能
  49. * @param[in]     void
  50. * @retval        void
  51. * @par History   无
  52. */
  53. void loop()
  54. {     
  55.     //$RGB,R255,G125,B000#
  56.     while (newLineReceived)
  57.     {
  58.        if(inputString.indexOf("RGB") == -1)  //如果要检索的字符串值“RGB”没有出现
  59.        {
  60.            returntemp = "$RGB,2,#";   //返回不匹配
  61.            Serial.print(returntemp); //返回协议数据包      
  62.            inputString = "";   // clear the string
  63.            newLineReceived = false;
  64.            break;   
  65.        }
  66.        //红色解析
  67.        int i = inputString.indexOf("R", 2);   //从接收到的数据中以2为起始位置检索字符串“R”的位置
  68.        int ii = inputString.indexOf(",", i);  //从接收到的数据中以i为起始位置检索字符串“,”的位置
  69.        if(ii > i && ii > 0 && i > 0 )         //如果ii和i的顺序对了并且检索到ii与i存在
  70.        {
  71.           String sRedPWM = inputString.substring(i + 1, ii);  //提取字符串中介于指定下标i+1到ii之间的字符赋值给sRedPWM
  72.           int iRedPWM = sRedPWM.toInt();                      //将字符串sRedPWM转为整型
  73.           analogWrite(RED_LED_Pin, iRedPWM);                  
  74.         }
  75.         else     //检索到ii和i的顺序不对或者没有检索到ii或者i
  76.         {
  77.           returntemp = "$RGB,1,#";   //返回匹配失败
  78.           Serial.print(returntemp); //返回协议数据包      
  79.           inputString = "";   // clear the string
  80.           newLineReceived = false;
  81.           break;   
  82.         }
  83.         //绿色解析
  84.         i = inputString.indexOf("G", ii);    //从接收到的数据中以ii为起始位置检索字符串“G”的位置
  85.         ii = inputString.indexOf(",", i);    //从接收到的数据中以i为起始位置检索字符串“,”的位置
  86.         if(ii > i && ii > 0 && i > 0 )       //如果ii和i的顺序对了并且检索到ii与i存在
  87.         {
  88.           String sGreenPWM = inputString.substring(i + 1, ii);   //提取字符串中介于指定下标i+1到ii之间的字符赋值给sGreenPWM
  89.           int iGreenPWM = sGreenPWM.toInt();                     //将字符串sGreenPWM转为整型
  90.           analogWrite(GREEN_LED_Pin, iGreenPWM);                 
  91.         }
  92.         else      //检索到ii和i的顺序不对或者没有检索到ii或者i
  93.         {
  94.           returntemp = "$RGB,1,#";   //返回匹配失败
  95.           Serial.print(returntemp); //返回协议数据包      
  96.           inputString = "";   // clear the string
  97.           newLineReceived = false;
  98.           break;   
  99.         }
  100.         //蓝色解析
  101.         i = inputString.indexOf("B", ii);       //从接收到的数据中以ii为起始位置检索字符串“B”的位置
  102.         ii = inputString.indexOf("#", i);        //从接收到的数据中以i为起始位置检索字符串“#”的位置
  103.         if(ii > i && ii > 0 && i > 0 )          //如果ii和i的顺序对了并且检索到ii与i存在
  104.         {
  105.           String sBluePWM = inputString.substring(i + 1, ii);    //提取字符串中介于指定下标i+1到ii之间的字符赋值给sBluePWM
  106.           int iBluePWM = sBluePWM.toInt();                       //将字符串sBluePWM转为整型
  107.           analogWrite(BLUE_LED_Pin, iBluePWM);
  108.         }
  109.         else
  110.         {
  111.           returntemp = "$RGB,1,#";   //返回匹配失败
  112.           Serial.print(returntemp); //返回协议数据包      
  113.           inputString = "";   // clear the string
  114.           newLineReceived = false;
  115.           break;   
  116.         }
  117.      
  118.       
  119.        returntemp = "$RGB,0,#";    //返回匹配成功

  120.        Serial.print(returntemp); //返回协议数据包      
  121.        inputString = "";   // clear the string
  122.        newLineReceived = false;   

  123.     }
  124.    
  125. }
  126. /**
  127. * Function       serialEvent
  128. * @author        liusen
  129. * @date          2017.11.14
  130. * @brief         串口接收中断   serialEvent()是IDE1.0及以后版本新增的功能,不清楚为什么大部份人不愿意用,这个可是相当于中断功能一样的啊!
  131. * @param[in]     void
  132. * @retval        void
  133. * @par History   无
  134. */
  135. void serialEvent()
  136. {
  137.   while (Serial.available())                    //如果串口接收到数据则进入循环
  138.   {   
  139.     incomingByte = Serial.read();              //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包
  140.     if(incomingByte ==



  141. )                    //如果到来的字节是'



  142. ,开始读取
  143.     {
  144.       startBit= true;
  145.     }
  146.     if(startBit == true)
  147.     {
  148.        inputString += (char) incomingByte;     // 全双工串口可以不用在下面加延时,半双工则要加的//
  149.     }  
  150.     if (incomingByte == '#')                  //如果到来的字节是'#',读取结束
  151.     {
  152.        newLineReceived = true;
  153.        startBit = false;
  154.     }
  155.   }
  156. }



复制代码

所有资料51hei提供下载:
2.远程控制RGB灯.zip (2.83 MB, 下载次数: 85)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:440971 发表于 2018-12-6 15:43 | 只看该作者
看上去不错!
回复

使用道具 举报

板凳
ID:441662 发表于 2018-12-9 09:53 | 只看该作者
我觉得不错!
回复

使用道具 举报

地板
ID:442737 发表于 2018-12-10 13:23 | 只看该作者
一直想做这个
回复

使用道具 举报

5#
ID:382457 发表于 2018-12-17 12:56 | 只看该作者

一直想做这个
回复

使用道具 举报

6#
ID:452731 发表于 2019-1-12 23:42 | 只看该作者
一直想做远程控制的东西,这个给了很好的思路
回复

使用道具 举报

7#
ID:513617 发表于 2019-11-12 10:54 | 只看该作者
请问WIFI模块用的是那个型号的
回复

使用道具 举报

8#
ID:55085 发表于 2020-9-20 15:40 | 只看该作者
这个需要专用的物联网设备吗???
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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