標題:
arduino與微信遠程控制LED
[打印本頁]
作者:
lfb532
時間:
2018-9-6 13:41
標題:
arduino與微信遠程控制LED
本帖最后由 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#”至下位機,下位機根據程序判斷打開L1和L2燈,并且燈1亮度100,燈2亮度50。
解釋協(xié)議:燈1打開;燈2打開;燈3關閉;燈1亮度100;燈2亮度50;燈3亮度0。
然后下位機給微信界面返回數(shù)據包$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)網套件
* @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 = ""; // 用來儲存接收到的內容
boolean newLineReceived = false; // 前一次數(shù)據結束標志
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通訊設定波特率)
//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ù)據根據協(xié)議完成相應的功能
* @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ù)據包
inputString = ""; // clear the string
newLineReceived = false;
break;
}
if(inputString[7] == '1') //RED
{
int i = inputString.indexOf("L1"); //從接收到的數(shù)據中檢索字符串“L1”出現(xiàn)的位置
int ii = inputString.indexOf(",", i); //從接收到的數(shù)據中以i為起始位置檢索字符串“,”的位置
if(ii > i && ii > 0 && i > 0 ) //如果ii和i的順序對了并且檢索到ii與i存在
{
String sRedPWM = inputString.substring(i + 2, ii);//提取字符串中介于指定下標i+2到ii之間的字符賦值給sRedPWM
int iRedPWM = sRedPWM.toInt(); //將字符串sRedPWM轉為整型
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ù)據包
inputString = ""; // clear the string
newLineReceived = false;
break;
}
}
else
{
analogWrite(RED_LED_Pin, 0);//紅燈滅
}
if(inputString[11] == '1') //Green
{
int i = inputString.indexOf("L2"); //從接收到的數(shù)據中檢索字符串“L2”出現(xiàn)的位置
int ii = inputString.indexOf(",", i); //從接收到的數(shù)據中以i為起始位置檢索字符串“,”的位置
if(ii > i && ii > 0 && i > 0 ) //如果ii和i的順序對了并且檢索到ii與i存在
{
String sGreenPWM = inputString.substring(i + 2, ii); //提取字符串中介于指定下標i+2到ii之間的字符賦值給sGreenPWM
int iGreenPWM = sGreenPWM.toInt(); //將字符串sGreenPWM轉為整型
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ù)據包
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ù)據中檢索字符串“L3”出現(xiàn)的位置
int ii = inputString.indexOf("#", i); //從接收到的數(shù)據中以i為起始位置檢索字符串“#”的位置
if(ii > i && ii > 0 && i > 0 ) //如果ii和i的順序對了并且檢索到ii與i存在
{
String sYellowPWM = inputString.substring(i + 2, ii); //提取字符串中介于指定下標i+2到ii之間的字符賦值給sYellowPWM
int iYellowPWM = sYellowPWM.toInt(); //將字符串sYellowPWM轉為整型
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ù)據包
inputString = ""; // clear the string
newLineReceived = false;
break;
}
}
else
{
analogWrite(YELLOW_LED_Pin, 0);
}
returntemp = "$LED,0,#"; //返回匹配成功
Serial.print(returntemp); //返回協(xié)議數(shù)據包
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ù)據則進入循環(huán)
{
incomingByte = Serial.read(); //一個字節(jié)一個字節(jié)地讀,下一句是讀到的放入字符串數(shù)組中組成一個完成的數(shù)據包
if(incomingByte == '
) //如果到來的字節(jié)是'
,開始讀取
{
startBit= true;
}
if(startBit == true)
{
inputString += (char) incomingByte; // 全雙工串口可以不用在下面加延時,半雙工則要加的//
}
if (incomingByte == '#') //如果到來的字節(jié)是'#',讀取結束
{
newLineReceived = true;
startBit = false;
}
}
}
復制代碼
所有資料51hei提供下載:
1.遠程控制LED.zip
(2.75 MB, 下載次數(shù): 26)
2018-9-6 13:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1