标题:
arduino与微信远程控制LED
[打印本页]
作者:
lfb532
时间:
2018-9-6 13:41
标题:
arduino与微信远程控制LED
本帖最后由 lfb532 于 2018-9-13 05:29 编辑
远程控制LED
0.png
(185.65 KB, 下载次数: 57)
下载附件
2018-9-13 05:10 上传
例如在微信界面按下按钮时,微信界面发送字符“$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
(54.2 KB, 下载次数: 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物联网套件
* @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; // 前一次数据结束标志
boolean startBit = false; //协议开始标志
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 按照接收的数据根据协议完成相应的功能
* @param[in] void
* @retval void
* @par History 无
*/
void loop()
{
//$LED,S11,S21,S30,L1100,L2050,L3000,#
while (newLineReceived)
{
if(inputString.indexOf("LED") == -1)//如果要检索的字符串值“LED”没有出现
{
returntemp = "$LED,2,#"; //返回不匹配
Serial.print(returntemp); //返回协议数据包
inputString = ""; // clear the string
newLineReceived = false;
break;
}
if(inputString[7] == '1') //RED
{
int i = inputString.indexOf("L1"); //从接收到的数据中检索字符串“L1”出现的位置
int ii = inputString.indexOf(",", i); //从接收到的数据中以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); //返回协议数据包
inputString = ""; // clear the string
newLineReceived = false;
break;
}
}
else
{
analogWrite(RED_LED_Pin, 0);//红灯灭
}
if(inputString[11] == '1') //Green
{
int i = inputString.indexOf("L2"); //从接收到的数据中检索字符串“L2”出现的位置
int ii = inputString.indexOf(",", i); //从接收到的数据中以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); //返回协议数据包
inputString = ""; // clear the string
newLineReceived = false;
break;
}
}
else
{
analogWrite(GREEN_LED_Pin, 0);//control);
}
if(inputString[15] == '1') //Yellow
{
int i = inputString.indexOf("L3"); //从接收到的数据中检索字符串“L3”出现的位置
int ii = inputString.indexOf("#", i); //从接收到的数据中以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); //返回协议数据包
inputString = ""; // clear the string
newLineReceived = false;
break;
}
}
else
{
analogWrite(YELLOW_LED_Pin, 0);
}
returntemp = "$LED,0,#"; //返回匹配成功
Serial.print(returntemp); //返回协议数据包
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()) //如果串口接收到数据则进入循环
{
incomingByte = Serial.read(); //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包
if(incomingByte == '
) //如果到来的字节是'
,开始读取
{
startBit= true;
}
if(startBit == true)
{
inputString += (char) incomingByte; // 全双工串口可以不用在下面加延时,半双工则要加的//
}
if (incomingByte == '#') //如果到来的字节是'#',读取结束
{
newLineReceived = true;
startBit = false;
}
}
}
复制代码
所有资料51hei提供下载:
1.远程控制LED.zip
(2.75 MB, 下载次数: 26)
2018-9-6 13:40 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1