唯倚社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1236|回复: 1

[学习教程] 安卓手机APP内网控制两路继电器

[复制链接]

132

主题

302

帖子

3693

积分

LV3

Rank: 3Rank: 3

积分
3693

最佳新人

发表于 2017-11-18 23:10:22 | 显示全部楼层 |阅读模式

轻松玩转社区

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
安卓手机APP内网控制两路继电器
本次实验硬件采用唯倚科技WIOT-2两路继电器,手机为安卓机。
注意本次所有用到的工程不能存在中文目录下,否则无法正常使用。
首先讲解的是WIOT-2的程序
首先我们将工程导入编译器,在这里导入工程步骤我就不讲解了,这里有个讲解导入工程的帖子。
将工程导入之后,打开user_main.c,找到user_init()函数。这里我们初始化了GPIO0 GPIO9 GPIO0GPIO10 GPIO12,注意我们在这里上拉使能了GPIO9GPIO10,因为这两个IO口是ESP8285独有的两个IO口,需要程序上拉才能使用。本工程还设置了ESP8285的工作方式,为路由模式。初始化了串口,波特率为115200。

HF@NZ{36@$$EE4JOHXV${RX.png

BI]{309$J%BV$C)OC1_(G9F.png

部分代码注释可能将ESP8285误写成了ESP8266,这并不影响代码的运行,因为ESP8285和ESP8266的代码编写几乎一样。

T4J(N0Y(`W3AI~@6V1C[QAM.png

这是继电器与LED灯全开和全关函数,于此同时向TCP发送了相应指令,以便当按键按下时,会与APP同步相应操作。下面是按键扫描函数,也向TCP发送了相应指令。
[C++] 纯文本查看 复制代码
void KeyScan()//按键扫描函数
{
		if(GPIO_INPUT_GET(9)==0)
		{
			if(!flg)
			{
			flg=true;
			if(zt==true)
			{
				PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);
				GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);//开继电器
				PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);
				GPIO_OUTPUT_SET(13,1);
				SendData("O1",2);//当前继电器状态为开
				zt=false;
			}else
			{
				PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);
				GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);//关继电器
				PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);
				GPIO_OUTPUT_SET(13,0);
				SendData("C1",2);//当前继电器状态为开
				zt=true;
			}
			}
		}else
		if(GPIO_INPUT_GET(10)==0)
		{
			if(!flg)
			{
			flg=true;
			if(zt==true)
			{
				PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5);
				GPIO_OUTPUT_SET(GPIO_ID_PIN(5),1);//开继电器
				PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);
				GPIO_OUTPUT_SET(14,1);
				SendData("O2",2);//当前继电器状态为开
				zt=false;
			}else
			{
				PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5);
				GPIO_OUTPUT_SET(GPIO_ID_PIN(5),0);//关继电器
				PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);
				GPIO_OUTPUT_SET(14,0);
				SendData("C2",2);//当前继电器状态为开
				zt=true;
			}
			}
		}else
		if(GPIO_INPUT_GET(12)==0)
		{
			if(!flg)
			{
			flg=true;
			if(zt==true)
			{
				SetSwitchOFF();
			}else
			{
				SetSwitchON();
			}
			}
		}
		else
			flg=false;
}

我们打开TCPServer.c文件

CA_XWWM5EQ)7@M$}_COI6UQ.png

这里我们固定了端口号为60000
且在程序当中固定了IP地址为192.168.4.1
下面是我们的TCP接收函数,我们在操作APP时会给模块下发相应指令,包过当手机连接模块时,会向模块询问当前相应IO的状态,得到相应状态后并做相应处理。而连接完毕之后会判断APP下发的数据并对IO口做相应动作。
[C++] 纯文本查看 复制代码
/******************************************************************************
 * FunctionName : tcp_server_recv_cb
 * Description  : receive callback.
 * Parameters   : arg -- Additional argument to pass to the callback function
 * Returns      : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
tcp_server_recv_cb(void *arg, char *pusrdata, unsigned short length)  //TCPServer 接收
{
	if(pusrdata[0]=='0')//当APP应用连上TCP服务器时会向ESP8266下发查询当前继电器状态
	{
		if(GPIO_INPUT_GET(4) == 0 )
			SendData("O1",2);//当前继电器状态为开
		else
			SendData("C1",2);//当前继电器状态为关

		if(GPIO_INPUT_GET(5) == 0 )
			SendData("O2",2);//当前继电器状态为开
		else
			SendData("C2",2);//当前继电器状态为关

		if(GPIO_INPUT_GET(4) == 0 && GPIO_INPUT_GET(5) == 0)
			SendData("OAll",4);//当前继电器状态为开
		else
			SendData("CAll",4);//当前继电器状态为关

	}



	if(pusrdata[0]=='1')//APP应用下发开继电器指令
	{
		GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);//开继电器1
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);
		GPIO_OUTPUT_SET(13,0);
		SendData("ON1",3);
	}
	if(pusrdata[0]=='2')//APP应用下发关继电器指令
	{
		GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);//关继电器1
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);
		GPIO_OUTPUT_SET(13,1);
		SendData("OFF1",4);
	}

	if(pusrdata[0]=='3')//APP应用下发开继电器指令
	{
		GPIO_OUTPUT_SET(GPIO_ID_PIN(5),0);//开继电器2
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);
		GPIO_OUTPUT_SET(14,0);
		SendData("ON2",3);
	}
	if(pusrdata[0]=='4')//APP应用下发关继电器指令
	{
		GPIO_OUTPUT_SET(GPIO_ID_PIN(5),1);//关继电器2
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);
		GPIO_OUTPUT_SET(14,1);
		SendData("OFF2",4);
	}


	if(pusrdata[0]=='5')//APP应用下发开继电器指令
	{
		GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);//开继电器
		GPIO_OUTPUT_SET(GPIO_ID_PIN(5),0);//开继电器
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);
		GPIO_OUTPUT_SET(13,0);
		GPIO_OUTPUT_SET(14,0);
		SendData("ON All",6);
	}
	if(pusrdata[0]=='6')//APP应用下发关继电器指令
	{
		GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);//关继电器
		GPIO_OUTPUT_SET(GPIO_ID_PIN(5),1);//开继电器
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);
		PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);
		GPIO_OUTPUT_SET(13,1);
		GPIO_OUTPUT_SET(14,1);
		SendData("OFF All",7);
	}
}
其余代码为芯片搭建TCP连接函数,用户可以参照ESP8266SDK编程手册,芯手册有详细讲解,这里不做过多讲解。模块源码到此讲解完毕。
将工程编译并下载,下载完成之后记得重新上电
ESP8266SDK编程手册分享链接:http://pan.baidu.com/s/1slhu9lj 密码:aeem
现在讲解安卓APP源码
首先我们还是先将工程导入eclipse安卓编译器。

_O{VS0KRBR}@@1}HIN0700B.png

打开MainActivity.java

4PZXY`@FE8_XLD{AQWZYYFG.png

首先我们在这里声明了我们要的按键和显示文本框。

}1`M@J(G[{S)NP6]11DGYAB.png

这里我们注册了按键等事件,且固定了TCP目标端口号为60000,因为IP固定为192.168.4.1,所以我们在界面布局那边就已经固定了IP当APP一打开的时候,IP输入框就已经有了IP,可以更改。

59TDC8]2_`47}5[}_HNL{IT.png

此为TCP连接按键点击事件,当断开时点击按钮则为连接,否则相反。

QT78[8IZKIRNITS(H_B3}(5.png

此为第一个开关按钮设置关或开的事件。先判断是否连接上设备,如果连接上为开时向模块发送字符串1作为指令,为关时发送字符串2作为指令。否则提示未连接设备。其余按键事件于此类推。

6%C[RNTO`D57L`KWP%CJ%ZN.png

这里我们出力了TCP连接成功之后向模块发送请求当前相应IO状态,指令我0。还有TCP接受处理,当接受到C1和O1时对按钮1做了相应处理。其余依次类推。
打开TcpSocketsClient.java,这里我们固定了端口号为60000。此文件里面包含太多TCP连接函数,已经相当稳定,用户无需更改。

5[ZKO2{4`VPCULR8][CY524.png

其余代码不做过多讲解,至此所有代码讲解完毕。
下面演示APP控制继电器操作
首先我们先将手机连接模块的WiFi,WiFi无密码。

J9N4L0MKWJ{~R(O4R_93(JO.png

WiFi名称有点类似途中这个。一定要确保连接上次WiFi,否则无法正常控制。

2X1%RG7@]}H74KM77_Y4$}5.png

程序分享连接
链接:http://pan.baidu.com/s/1nuXtx13 密码:gdpd





*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|weiecn ( 湘ICP备14002058号 )

GMT+8, 2018-8-18 08:57 , Processed in 0.074457 second(s), 13 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表