arduino微信远程继电器控制电灯设计
时间:2023-10-23 14:37:01
/**
* @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; //如果字节是‘#’,读取结束
sartBit = false;
}
}
}