本帖最后由 lfb532 于 2018-9-13 05:29 編輯
遠程控制LED
0.png (185.65 KB, 下載次數(shù): 57)
下載附件
2018-9-13 05:10 上傳
例如在微信界面按下按鈕時,微信界面發(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,#:不匹配當前
0.jpg (54.2 KB, 下載次數(shù): 57)
下載附件
2018-9-13 05:10 上傳
單片機源程序如下:
- /**
- * @par Copyright (C): 2010-2019, Shenzhen Yahboom Tech
- * @file 1、遠程控制LED
- * @author liusen
- * @version V1.0
- * @date 2017.11.14
- * @brief AR物聯(lián)網(wǎng)套件
- * @details
- * @par History 見如下說明
- *
- */
- //定義引腳
- int RED_LED_Pin = 3; //紅色LED
- int GREEN_LED_Pin = 10; //綠色LED
- int YELLOW_LED_Pin = 11; //黃色LED
- int incomingByte = 0; // 接收到的 data byte
- String inputString = ""; // 用來儲存接收到的內(nèi)容
- boolean newLineReceived = false; // 前一次數(shù)據(jù)結(jié)束標志
- boolean startBit = false; //協(xié)議開始標志
- String returntemp = ""; //存儲返回值
- /**
- * Function setup
- * @author liusen
- * @date 2017.11.14
- * @brief 初始化配置
- * @param[in] void
- * @retval void
- * @par History 無
- */
- void setup()
- {
- //初始化LEDIO口為輸出方式
- pinMode(RED_LED_Pin, OUTPUT);
- pinMode(GREEN_LED_Pin, OUTPUT);
- pinMode(YELLOW_LED_Pin, OUTPUT);
-
- Serial.begin(9600); //波特率9600 (Wifi通訊設(shè)定波特率)
-
- //LED初始化低電平
- digitalWrite(RED_LED_Pin, LOW);
- digitalWrite(GREEN_LED_Pin, LOW);
- digitalWrite(YELLOW_LED_Pin, LOW);
-
- }
- /**
- * Function loop
- * @author liusen
- * @date 2017.11.14
- * @brief 按照接收的數(shù)據(jù)根據(jù)協(xié)議完成相應(yīng)的功能
- * @param[in] void
- * @retval void
- * @par History 無
- */
- void loop()
- {
- //$LED,S11,S21,S30,L1100,L2050,L3000,#
- while (newLineReceived)
- {
- if(inputString.indexOf("LED") == -1)//如果要檢索的字符串值“LED”沒有出現(xiàn)
- {
- returntemp = "$LED,2,#"; //返回不匹配
- Serial.print(returntemp); //返回協(xié)議數(shù)據(jù)包
- inputString = ""; // clear the string
- newLineReceived = false;
- break;
- }
-
- if(inputString[7] == '1') //RED
- {
- int i = inputString.indexOf("L1"); //從接收到的數(shù)據(jù)中檢索字符串“L1”出現(xiàn)的位置
- int ii = inputString.indexOf(",", i); //從接收到的數(shù)據(jù)中以i為起始位置檢索字符串“,”的位置
- if(ii > i && ii > 0 && i > 0 ) //如果ii和i的順序?qū)α瞬⑶覚z索到ii與i存在
- {
- String sRedPWM = inputString.substring(i + 2, ii);//提取字符串中介于指定下標i+2到ii之間的字符賦值給sRedPWM
- int iRedPWM = sRedPWM.toInt(); //將字符串sRedPWM轉(zhuǎn)為整型
- int outputValue = map(iRedPWM, 0, 100, 0, 255); //遍歷,定義outputValue等于iRedPWM按2.55的比例擴大的值
- analogWrite(RED_LED_Pin, outputValue); //紅燈亮
- }
- else //如果檢索到ii和i的順序不對或者沒有檢索到ii或者i
- {
- returntemp = "$LED,1,#"; //返回匹配失敗
- Serial.print(returntemp); //返回協(xié)議數(shù)據(jù)包
- inputString = ""; // clear the string
- newLineReceived = false;
- break;
- }
- }
- else
- {
- analogWrite(RED_LED_Pin, 0);//紅燈滅
- }
-
- if(inputString[11] == '1') //Green
- {
- int i = inputString.indexOf("L2"); //從接收到的數(shù)據(jù)中檢索字符串“L2”出現(xiàn)的位置
- int ii = inputString.indexOf(",", i); //從接收到的數(shù)據(jù)中以i為起始位置檢索字符串“,”的位置
- if(ii > i && ii > 0 && i > 0 ) //如果ii和i的順序?qū)α瞬⑶覚z索到ii與i存在
- {
- String sGreenPWM = inputString.substring(i + 2, ii); //提取字符串中介于指定下標i+2到ii之間的字符賦值給sGreenPWM
- int iGreenPWM = sGreenPWM.toInt(); //將字符串sGreenPWM轉(zhuǎn)為整型
- int outputValue = map(iGreenPWM, 0, 100, 0, 255); //遍歷,定義outputValue等于iGreenPWM按2.55的比例擴大的值
- analogWrite(GREEN_LED_Pin, outputValue);
- }
- else //如果檢索到ii和i的順序不對或者沒有檢索到ii或者i
- {
- returntemp = "$LED,1,#"; //返回匹配失敗
- Serial.print(returntemp); //返回協(xié)議數(shù)據(jù)包
- inputString = ""; // clear the string
- newLineReceived = false;
- break;
- }
- }
- else
- {
- analogWrite(GREEN_LED_Pin, 0);//control);
- }
-
- if(inputString[15] == '1') //Yellow
- {
- int i = inputString.indexOf("L3"); //從接收到的數(shù)據(jù)中檢索字符串“L3”出現(xiàn)的位置
- int ii = inputString.indexOf("#", i); //從接收到的數(shù)據(jù)中以i為起始位置檢索字符串“#”的位置
- if(ii > i && ii > 0 && i > 0 ) //如果ii和i的順序?qū)α瞬⑶覚z索到ii與i存在
- {
- String sYellowPWM = inputString.substring(i + 2, ii); //提取字符串中介于指定下標i+2到ii之間的字符賦值給sYellowPWM
- int iYellowPWM = sYellowPWM.toInt(); //將字符串sYellowPWM轉(zhuǎn)為整型
- int outputValue = map(iYellowPWM, 0, 100, 0, 255); //遍歷,定義outputValue等于iYellowPWM按2.55的比例擴大的值
- analogWrite(YELLOW_LED_Pin, outputValue);
- }
- else //如果檢索到ii和i的順序不對或者沒有檢索到ii或者i
- {
- returntemp = "$LED,1,#"; //返回匹配失敗
- Serial.print(returntemp); //返回協(xié)議數(shù)據(jù)包
- inputString = ""; // clear the string
- newLineReceived = false;
- break;
- }
- }
- else
- {
- analogWrite(YELLOW_LED_Pin, 0);
- }
-
-
- returntemp = "$LED,0,#"; //返回匹配成功
- Serial.print(returntemp); //返回協(xié)議數(shù)據(jù)包
- inputString = ""; // clear the string
- newLineReceived = false;
-
- }
-
- }
- /**
- * Function serialEvent
- * @author liusen
- * @date 2017.11.14
- * @brief 串口接收中斷 serialEvent()是IDE1.0及以后版本新增的功能,不清楚為什么大部份人不愿意用,這個可是相當于中斷功能一樣的啊!
- * @param[in] void
- * @retval void
- * @par History 無
- */
-
- void serialEvent()
- {
- while (Serial.available()) //如果串口接收到數(shù)據(jù)則進入循環(huán)
- {
- incomingByte = Serial.read(); //一個字節(jié)一個字節(jié)地讀,下一句是讀到的放入字符串數(shù)組中組成一個完成的數(shù)據(jù)包
- if(incomingByte == '
- ) //如果到來的字節(jié)是'
- ,開始讀取
- {
- startBit= true;
- }
- if(startBit == true)
- {
- inputString += (char) incomingByte; // 全雙工串口可以不用在下面加延時,半雙工則要加的//
- }
- if (incomingByte == '#') //如果到來的字節(jié)是'#',讀取結(jié)束
- {
- newLineReceived = true;
- startBit = false;
- }
- }
- }
復(fù)制代碼 所有資料51hei提供下載:
1.遠程控制LED.zip
(2.75 MB, 下載次數(shù): 26)
2018-9-6 13:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|