本帖最后由 lfb532 于 2018-9-13 05:30 編輯
遠程控制RGB燈
0.png (129.6 KB, 下載次數(shù): 75)
下載附件
2018-9-13 05:14 上傳
例如在微信界面點擊發(fā)送,微信界面發(fā)送字符“$RGB,R255,G125,B000#”至下位機,下位機根據(jù)程序判斷打開燈R亮度255,燈G亮度125,B燈亮度0。
解釋協(xié)議:R燈亮度255;G燈亮度125;B燈亮度0。
然后下位機給微信界面返回數(shù)據(jù)包$RGB,(0-2),#
解釋協(xié)議:$RGB,0,#:成功;
$RGB,1,#:失敗;
$RGB,2,#:不匹配當前
0.jpg (67.6 KB, 下載次數(shù): 78)
下載附件
2018-9-13 05:14 上傳
0.jpg (38.48 KB, 下載次數(shù): 77)
下載附件
2018-9-13 05:14 上傳
單片機源程序如下:
- /**
- * @par Copyright (C): 2010-2019, Shenzhen Yahboom Tech
- * @file 2、遠程控制RGB燈
- * @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 BLUE_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(BLUE_LED_Pin, OUTPUT);
-
- Serial.begin(9600); //波特率9600 (Wifi通訊設(shè)定波特率)
- //LED初始化低電平
- digitalWrite(RED_LED_Pin, LOW);
- digitalWrite(GREEN_LED_Pin, LOW);
- digitalWrite(BLUE_LED_Pin, LOW);
-
- }
- /**
- * Function loop
- * @author liusen
- * @date 2017.11.14
- * @brief 按照接收的數(shù)據(jù)根據(jù)協(xié)議完成相應的功能
- * @param[in] void
- * @retval void
- * @par History 無
- */
- void loop()
- {
- //$RGB,R255,G125,B000#
- while (newLineReceived)
- {
- if(inputString.indexOf("RGB") == -1) //如果要檢索的字符串值“RGB”沒有出現(xiàn)
- {
- returntemp = "$RGB,2,#"; //返回不匹配
- Serial.print(returntemp); //返回協(xié)議數(shù)據(jù)包
- inputString = ""; // clear the string
- newLineReceived = false;
- break;
- }
- //紅色解析
- int i = inputString.indexOf("R", 2); //從接收到的數(shù)據(jù)中以2為起始位置檢索字符串“R”的位置
- 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 + 1, ii); //提取字符串中介于指定下標i+1到ii之間的字符賦值給sRedPWM
- int iRedPWM = sRedPWM.toInt(); //將字符串sRedPWM轉(zhuǎn)為整型
- analogWrite(RED_LED_Pin, iRedPWM);
- }
- else //檢索到ii和i的順序不對或者沒有檢索到ii或者i
- {
- returntemp = "$RGB,1,#"; //返回匹配失敗
- Serial.print(returntemp); //返回協(xié)議數(shù)據(jù)包
- inputString = ""; // clear the string
- newLineReceived = false;
- break;
- }
- //綠色解析
- i = inputString.indexOf("G", ii); //從接收到的數(shù)據(jù)中以ii為起始位置檢索字符串“G”的位置
- 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 + 1, ii); //提取字符串中介于指定下標i+1到ii之間的字符賦值給sGreenPWM
- int iGreenPWM = sGreenPWM.toInt(); //將字符串sGreenPWM轉(zhuǎn)為整型
- analogWrite(GREEN_LED_Pin, iGreenPWM);
- }
- else //檢索到ii和i的順序不對或者沒有檢索到ii或者i
- {
- returntemp = "$RGB,1,#"; //返回匹配失敗
- Serial.print(returntemp); //返回協(xié)議數(shù)據(jù)包
- inputString = ""; // clear the string
- newLineReceived = false;
- break;
- }
- //藍色解析
- i = inputString.indexOf("B", ii); //從接收到的數(shù)據(jù)中以ii為起始位置檢索字符串“B”的位置
- ii = inputString.indexOf("#", i); //從接收到的數(shù)據(jù)中以i為起始位置檢索字符串“#”的位置
- if(ii > i && ii > 0 && i > 0 ) //如果ii和i的順序?qū)α瞬⑶覚z索到ii與i存在
- {
- String sBluePWM = inputString.substring(i + 1, ii); //提取字符串中介于指定下標i+1到ii之間的字符賦值給sBluePWM
- int iBluePWM = sBluePWM.toInt(); //將字符串sBluePWM轉(zhuǎn)為整型
- analogWrite(BLUE_LED_Pin, iBluePWM);
- }
- else
- {
- returntemp = "$RGB,1,#"; //返回匹配失敗
- Serial.print(returntemp); //返回協(xié)議數(shù)據(jù)包
- inputString = ""; // clear the string
- newLineReceived = false;
- break;
- }
-
-
- returntemp = "$RGB,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;
- }
- }
- }
復制代碼
0.png (44.19 KB, 下載次數(shù): 76)
下載附件
2018-9-13 05:15 上傳
所有資料51hei提供下載:
2.遠程控制RGB燈.zip
(2.83 MB, 下載次數(shù): 85)
2018-9-6 13:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|