找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6241|回复: 0
收起左侧

arduino与微信远程控制LED

[复制链接]
ID:394509 发表于 2018-9-6 13:41 | 显示全部楼层 |阅读模式
本帖最后由 lfb532 于 2018-9-13 05:29 编辑

远程控制LED
0.png
例如在微信界面按下按钮时,微信界面发送字符“$LED,S11,S21,S30,L1100,L2050,L3000#”至下位机,下位机根据程序判断打开L1和L2灯,并且灯1亮度100,灯2亮度50。
解释协议:灯1打开;灯2打开;灯3关闭;灯1亮度100;灯2亮度50;灯3亮度0。
然后下位机给微信界面返回数据包$LED,(0-2),#
解释协议:$LED,0,#:成功;
                  $LED,1,#:失败;
                  $LED,2,#:不匹配当前
0.jpg
单片机源程序如下:
  1. /**
  2. * @par Copyright (C): 2010-2019, Shenzhen Yahboom Tech
  3. * @file         1、远程控制LED
  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 YELLOW_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(YELLOW_LED_Pin, OUTPUT);
  36.   
  37.    Serial.begin(9600);        //波特率9600 (Wifi通讯设定波特率)
  38.    
  39.    //LED初始化低电平
  40.    digitalWrite(RED_LED_Pin, LOW);   
  41.    digitalWrite(GREEN_LED_Pin, LOW);  
  42.    digitalWrite(YELLOW_LED_Pin, LOW);  

  43.   
  44. }

  45. /**
  46. * Function       loop
  47. * @author        liusen
  48. * @date          2017.11.14
  49. * @brief         按照接收的数据根据协议完成相应的功能
  50. * @param[in]     void
  51. * @retval        void
  52. * @par History   无
  53. */
  54. void loop()
  55. {     
  56.     //$LED,S11,S21,S30,L1100,L2050,L3000,#
  57.     while (newLineReceived)
  58.     {
  59.        if(inputString.indexOf("LED") == -1)//如果要检索的字符串值“LED”没有出现
  60.        {
  61.            returntemp = "$LED,2,#";    //返回不匹配
  62.            Serial.print(returntemp); //返回协议数据包      
  63.            inputString = "";   // clear the string
  64.            newLineReceived = false;
  65.            break;   
  66.        }
  67.       
  68.        if(inputString[7] == '1')  //RED
  69.        {
  70.           int i = inputString.indexOf("L1");   //从接收到的数据中检索字符串“L1”出现的位置
  71.           int ii = inputString.indexOf(",", i); //从接收到的数据中以i为起始位置检索字符串“,”的位置
  72.           if(ii > i && ii > 0 && i > 0 )   //如果ii和i的顺序对了并且检索到ii与i存在
  73.           {
  74.             String sRedPWM = inputString.substring(i + 2, ii);//提取字符串中介于指定下标i+2到ii之间的字符赋值给sRedPWM
  75.             int iRedPWM = sRedPWM.toInt();                    //将字符串sRedPWM转为整型
  76.             int outputValue = map(iRedPWM, 0, 100, 0, 255);   //遍历,定义outputValue等于iRedPWM按2.55的比例扩大的值
  77.             analogWrite(RED_LED_Pin, outputValue);            //红灯亮
  78.           }
  79.           else   //如果检索到ii和i的顺序不对或者没有检索到ii或者i
  80.           {
  81.             returntemp = "$LED,1,#";    //返回匹配失败
  82.             Serial.print(returntemp); //返回协议数据包      
  83.             inputString = "";   // clear the string
  84.             newLineReceived = false;
  85.             break;   
  86.           }
  87.        }
  88.        else
  89.        {
  90.           analogWrite(RED_LED_Pin, 0);//红灯灭
  91.        }
  92.       
  93.        if(inputString[11] == '1')  //Green
  94.        {
  95.           int i = inputString.indexOf("L2");      //从接收到的数据中检索字符串“L2”出现的位置
  96.           int ii = inputString.indexOf(",", i);   //从接收到的数据中以i为起始位置检索字符串“,”的位置
  97.           if(ii > i && ii > 0 && i > 0 )          //如果ii和i的顺序对了并且检索到ii与i存在
  98.           {
  99.             String sGreenPWM = inputString.substring(i + 2, ii);    //提取字符串中介于指定下标i+2到ii之间的字符赋值给sGreenPWM
  100.             int iGreenPWM = sGreenPWM.toInt();                      //将字符串sGreenPWM转为整型
  101.             int outputValue = map(iGreenPWM, 0, 100, 0, 255);       //遍历,定义outputValue等于iGreenPWM按2.55的比例扩大的值
  102.             analogWrite(GREEN_LED_Pin, outputValue);
  103.           }
  104.           else   //如果检索到ii和i的顺序不对或者没有检索到ii或者i
  105.           {
  106.             returntemp = "$LED,1,#";    //返回匹配失败
  107.             Serial.print(returntemp); //返回协议数据包      
  108.             inputString = "";   // clear the string
  109.             newLineReceived = false;
  110.             break;   
  111.           }
  112.        }
  113.        else
  114.       {
  115.          analogWrite(GREEN_LED_Pin, 0);//control);
  116.        }
  117.       
  118.        if(inputString[15] == '1')  //Yellow
  119.        {
  120.           int i = inputString.indexOf("L3");         //从接收到的数据中检索字符串“L3”出现的位置  
  121.           int ii = inputString.indexOf("#", i);      //从接收到的数据中以i为起始位置检索字符串“#”的位置   
  122.           if(ii > i && ii > 0 && i > 0 )             //如果ii和i的顺序对了并且检索到ii与i存在
  123.           {
  124.             String sYellowPWM = inputString.substring(i + 2, ii);    //提取字符串中介于指定下标i+2到ii之间的字符赋值给sYellowPWM
  125.             int iYellowPWM = sYellowPWM.toInt();                     //将字符串sYellowPWM转为整型
  126.             int outputValue = map(iYellowPWM, 0, 100, 0, 255);       //遍历,定义outputValue等于iYellowPWM按2.55的比例扩大的值
  127.             analogWrite(YELLOW_LED_Pin, outputValue);
  128.           }
  129.           else    //如果检索到ii和i的顺序不对或者没有检索到ii或者i
  130.           {
  131.             returntemp = "$LED,1,#";    //返回匹配失败
  132.             Serial.print(returntemp); //返回协议数据包      
  133.             inputString = "";   // clear the string
  134.             newLineReceived = false;
  135.             break;   
  136.           }
  137.        }
  138.        else
  139.        {
  140.            analogWrite(YELLOW_LED_Pin, 0);
  141.        }
  142.       
  143.       
  144.        returntemp = "$LED,0,#";    //返回匹配成功

  145.        Serial.print(returntemp); //返回协议数据包      
  146.        inputString = "";   // clear the string
  147.        newLineReceived = false;   

  148.     }
  149.    
  150. }
  151. /**
  152. * Function       serialEvent
  153. * @author        liusen
  154. * @date          2017.11.14
  155. * @brief         串口接收中断   serialEvent()是IDE1.0及以后版本新增的功能,不清楚为什么大部份人不愿意用,这个可是相当于中断功能一样的啊!
  156. * @param[in]     void
  157. * @retval        void
  158. * @par History   无
  159. */


  160. void serialEvent()
  161. {
  162.   while (Serial.available())                   //如果串口接收到数据则进入循环
  163.   {   
  164.     incomingByte = Serial.read();              //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包
  165.     if(incomingByte == '


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



  167. ,开始读取
  168.     {
  169.       startBit= true;                          
  170.     }
  171.     if(startBit == true)
  172.     {
  173.        inputString += (char) incomingByte;     // 全双工串口可以不用在下面加延时,半双工则要加的//
  174.     }  
  175.     if (incomingByte == '#')                   //如果到来的字节是'#',读取结束
  176.     {
  177.        newLineReceived = true;
  178.        startBit = false;
  179.     }
  180.   }
  181. }



复制代码
所有资料51hei提供下载:
1.远程控制LED.zip (2.75 MB, 下载次数: 26)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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