找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6583|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

arduino與微信遠程控制LED

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:394509 發(fā)表于 2018-9-6 13:41 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 lfb532 于 2018-9-13 05:29 編輯

遠程控制LED

例如在微信界面按下按鈕時,微信界面發(fā)送字符“$LED,S11,S21,S30,L1100,L2050,L3000#”至下位機,下位機根據(jù)程序判斷打開L1和L2燈,并且燈1亮度100,燈2亮度50。
解釋協(xié)議:燈1打開;燈2打開;燈3關(guān)閉;燈1亮度100;燈2亮度50;燈3亮度0。
然后下位機給微信界面返回數(shù)據(jù)包$LED,(0-2),#
解釋協(xié)議:$LED,0,#:成功;
                  $LED,1,#:失;
                  $LED,2,#:不匹配當前

單片機源程序如下:
  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物聯(lián)網(wǎng)套件
  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 = "";         // 用來儲存接收到的內(nèi)容
  18. boolean newLineReceived = false; // 前一次數(shù)據(jù)結(jié)束標志
  19. boolean startBit  = false;  //協(xié)議開始標志


  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通訊設(shè)定波特率)
  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         按照接收的數(shù)據(jù)根據(jù)協(xié)議完成相應(yīng)的功能
  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”沒有出現(xiàn)
  60.        {
  61.            returntemp = "$LED,2,#";    //返回不匹配
  62.            Serial.print(returntemp); //返回協(xié)議數(shù)據(jù)包      
  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");   //從接收到的數(shù)據(jù)中檢索字符串“L1”出現(xiàn)的位置
  71.           int ii = inputString.indexOf(",", i); //從接收到的數(shù)據(jù)中以i為起始位置檢索字符串“,”的位置
  72.           if(ii > i && ii > 0 && i > 0 )   //如果ii和i的順序?qū)α瞬⑶覚z索到ii與i存在
  73.           {
  74.             String sRedPWM = inputString.substring(i + 2, ii);//提取字符串中介于指定下標i+2到ii之間的字符賦值給sRedPWM
  75.             int iRedPWM = sRedPWM.toInt();                    //將字符串sRedPWM轉(zhuǎn)為整型
  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); //返回協(xié)議數(shù)據(jù)包      
  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");      //從接收到的數(shù)據(jù)中檢索字符串“L2”出現(xiàn)的位置
  96.           int ii = inputString.indexOf(",", i);   //從接收到的數(shù)據(jù)中以i為起始位置檢索字符串“,”的位置
  97.           if(ii > i && ii > 0 && i > 0 )          //如果ii和i的順序?qū)α瞬⑶覚z索到ii與i存在
  98.           {
  99.             String sGreenPWM = inputString.substring(i + 2, ii);    //提取字符串中介于指定下標i+2到ii之間的字符賦值給sGreenPWM
  100.             int iGreenPWM = sGreenPWM.toInt();                      //將字符串sGreenPWM轉(zhuǎn)為整型
  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); //返回協(xié)議數(shù)據(jù)包      
  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");         //從接收到的數(shù)據(jù)中檢索字符串“L3”出現(xiàn)的位置  
  121.           int ii = inputString.indexOf("#", i);      //從接收到的數(shù)據(jù)中以i為起始位置檢索字符串“#”的位置   
  122.           if(ii > i && ii > 0 && i > 0 )             //如果ii和i的順序?qū)α瞬⑶覚z索到ii與i存在
  123.           {
  124.             String sYellowPWM = inputString.substring(i + 2, ii);    //提取字符串中介于指定下標i+2到ii之間的字符賦值給sYellowPWM
  125.             int iYellowPWM = sYellowPWM.toInt();                     //將字符串sYellowPWM轉(zhuǎn)為整型
  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); //返回協(xié)議數(shù)據(jù)包      
  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); //返回協(xié)議數(shù)據(jù)包      
  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())                   //如果串口接收到數(shù)據(jù)則進入循環(huán)
  163.   {   
  164.     incomingByte = Serial.read();              //一個字節(jié)一個字節(jié)地讀,下一句是讀到的放入字符串數(shù)組中組成一個完成的數(shù)據(jù)包
  165.     if(incomingByte == '


  166. )                    //如果到來的字節(jié)是'



  167. ,開始讀取
  168.     {
  169.       startBit= true;                          
  170.     }
  171.     if(startBit == true)
  172.     {
  173.        inputString += (char) incomingByte;     // 全雙工串口可以不用在下面加延時,半雙工則要加的//
  174.     }  
  175.     if (incomingByte == '#')                   //如果到來的字節(jié)是'#',讀取結(jié)束
  176.     {
  177.        newLineReceived = true;
  178.        startBit = false;
  179.     }
  180.   }
  181. }



復(fù)制代碼
所有資料51hei提供下載:
1.遠程控制LED.zip (2.75 MB, 下載次數(shù): 26)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表