本帖最后由 lfb532 于 2018-9-13 05:29 编辑
远程继电器控制电灯
大家都知道,继电器在电路中是作为一个开关,当继电器s端收到高电平时,开关闭合,电路流通。我们就可以使用以小电压控制大电压。当打开微信物联网模块继电器实验界面,按下继电器开关,继电器开关闭合,电路流通,就可以控制风扇啊,灯啊,电饭煲啊等等大功率电器。
例如在微信界面点击继电器标志,微信界面发送字符“$RELAY,1#”至下位机,下位机根据程序判断继电器开始工作,向继电器S信号端输入高电平。
解释协议:继电器开始工作。
然后下位机给微信界面返回数据包$RELAY,(0-2),#
解释协议:$RELAY,0,#:成功;
$RELAY,1,#:失败;
$RELAY,2,#:不匹配当前
注:由于面包板上下两排的中间是分隔的不导电的,所以尽量在面包板的左半边区域或者右半边区域使用,如果有使用到面包板的整个区域,需要在中间用杜邦线如图2连接。如图用红线模拟内部电路,图1的电路(红线)中间是断开的,图2连接后的面包板的电路(红线)是流畅的、连接的。
1.准备工作
在接好线后烧录程序,注意:烧录时需拔掉arduino上的0和1引脚的接线,否则会上传失败!在上传成功后将0和1引脚的线接上
2.WIFI配置环境
方式一: 因每个WIFI的名称和密码不同,WIFI模块在出厂时没有进行配置,因此需要配置WIFI模块。配置时手机必须连接到当前环境的WIFI网络并能正常访问互联网。PS: 仅能识别常规的2.4G-WIFI信号,无法识别5G-WIFI。
方式二: 若要在没有WIFI网络的户外环境中使用微信遥控,需要两台具备移动网络的手机,其中一台当热点提供网络,另一台手机连接到此热点,后续配置方法相同。(仅建议使用方式一,部分手机提供的WIFI热点可能无法被WIFI模块识别。)
源程序如下:
- /**
- * @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;
- }
- }
- }
复制代码
所有资料51hei提供下载:
3.远程继电器控制电灯.zip
(3 MB, 下载次数: 42)
|