/**
* @par Copyright (C): 2010-2019, Shenzhen Yahboom Tech
* @file 3、远程继电器控制电灯
* @author zhoujie
* @version V1.0
* @date 2017.11.14
* @brief arduino物联网实验
* @details
* @par History 见如下说明
*
*/
//定义引脚
int RELAY_Pin = 9; //继电器信号端S
int incomingByte = 0; // 接收到的 data byte
String inputString = ""; // 用来储存接收到的内容
boolean newLineReceived = false; // 前一次数据结束标志
boolean startBit = false; //协议开始标志
String returntemp = ""; //存储返回值
void setup()
{
pinMode(RELAY_Pin, OUTPUT); //初始化RELAY IO口为输出方式
Serial.begin(9600); //波特率9600 (Wifi通讯设定波特率)
digitalWrite(RELAY_Pin, LOW); //RELAY初始化低电平
}
/**
* Function loop
* @author zhoujie
* @date 2017.11.14
* @brief 按照接收的数据根据协议完成相应的功能
* @param[in] void
* @retval void
* @par History 无
*/
void loop()
{
//$RELAY,1#
while (newLineReceived)
{
if(inputString.indexOf("RELAY") == -1) //如果要检索的字符串值“RELAY”没有出现
{
returntemp = "$RELAY,2,#"; //返回不匹配
Serial.print(returntemp); //返回协议数据包
inputString = ""; // clear the string
newLineReceived = false;
break;
}
if(inputString[7] == '1') //继电器开关闭合
{
int i = inputString.indexOf(","); //从接收到的数据中检索字符串“,”出现的位置
int ii = inputString.indexOf("#", i); //从接收到的数据中以i为起始位置检索字符串“#”的位置
if(ii > i && ii > 0 && i > 0 ) //如果ii和i的顺序对了并且检索到ii与i存在
{
digitalWrite(RELAY_Pin, HIGH); //向继电器S信号端输出高电平,继电器开关闭合
}
else //检索到ii和i的顺序不对或者没有检索到ii或者i
{
returntemp = "$RELAY,1,#"; //返回匹配失败
Serial.print(returntemp); //返回协议数据包
inputString = ""; // clear the string
newLineReceived = false;
break;
}
}
else //继电器开关打开
{
digitalWrite(RELAY_Pin, LOW); //向继电器S信号端输出低电平
}
returntemp = "$RELAY,0,#"; //返回匹配成功
Serial.print(returntemp); //返回协议数据包
inputString = ""; // clear the string
newLineReceived = false;
}
}
/**
* Function serialEvent
* @author zhoujie
* @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;
}
}
}