本章介绍基于Android studio设计的APP通过esp8266WiFi控制51单片机LED灯的亮灭实现过程。
对ESP8266WiFi模块进行设置
1、ESP8266WiFi特点: ①支持 STA/AP/STA+AP 工作模式; ②支持安卓、IOS 的 Smart Config(APP)/AirKiss(微信)一键配网; ③支持串口本地升级固件; ④通用 AT 指令可快速上手; ⑤支持二次开发,集成了 Windows、Linux 开发环境;
2、对ESP8266WiFi模块进行设置 ①AT+CWMODE=2(将ESP8266设置为AP模式) ②AT+RST(重启ESP8266) ③AT+CWSAP=“xxx”,“xxxxxxxx”,1,4(设置WiFi账号和密码,密码不得少于8位) ④AT+CIPMUX=1(设置连接类型,“1”为多连接模式) ⑤AT+CIPSERVER=1,8080(建立TCP服务器) ⑥选用,非必需AT+UART=115200,8,1,0,0(设置波特率)
编写Android studio代码
1、UI界面设计流程 界面布局采用线性布局,即LinearLayout。控件分布使用垂直分布,即android:orientation=“vertical”。 界面最上方使用TextView控件设计系统名称并将其居中显示。在其下方设计两个TextView和两个EditText,TextView分别显示“IP号:”和“端口号:”,EditText用于使用者输入IP号和端口号。接下来设计三个Button,分别用于连接、开灯和关灯。界面设计如图所示。 2、Java关键代码设计 JAVA控制需监听三个Button事件,点击连接按钮后,系统检查IP号与端口号是否已填,若有一项为空,则Socket连接失败。连接按钮的事件监听程序如下所示
case R.id.btn_lj:
url = et_1.getText().toString().trim();
String text = et_2.getText().toString().trim();
if (TextUtils.isEmpty(url))
{
Toast.makeText(context, "ip地址不能为空",
Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(text))
{
Toast.makeText(context, "端口不能为空",
Toast.LENGTH_SHORT).show();
return;
}
dk = Integer.parseInt(text);
str = "";
new ServerThreadTCP().start();
break;
当Socket连接成功后方可点击开灯与关灯按钮,若Socket未连接,则提示“请先建立Socket连接”。若连接成功,点击开灯按钮,则发送“K”字符,点击关灯按钮,则发送“G”字符。开关灯按钮关键代码如下所示。
case R.id.btn_kai:
if (socket != null)
{
str = "K";
new ServerThreadTCP().start();
}else
{
Toast.makeText(context, "请先建立socket连接",
Toast.LENGTH_SHORT).show();
}
break;
case R.id.btn_guan:
if (socket != null)
{
str = "G";
new ServerThreadTCP().start();
}else
{
Toast.makeText(context, "请先建立socket连接",
Toast.LENGTH_SHORT).show();
}
break;
重中之重 重要 重要 重要 TCP线程如下所示
class ServerThreadTCP extends Thread
{public void run()
{OutputStream outputStream = null;
InputStream inputStream = null;
try {
if (socket == null){
socket = new Socket(url, dk);
}
outputStream = socket.getOutputStream();
inputStream = socket.getInputStream();
byte data[] = str.getBytes();
outputStream.write(data, 0, data.length);
outputStream.flush();
byte buffer[] = new byte[1024 * 4];
int temp = 0;
while ((temp = inputStream.read(buffer)) != -1)
{System.out.println(new String(buffer, 0, temp));}
} catch (Exception e)
{System.out.println(e);} finally
{
try {
inputStream.close();
outputStream.close();
socket.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
}
编写89C51单片机代码
相比起Android studio,本部分单片机代码最为简单,只需将以下代码新建一个工程烧写进单片机即可使用。注:不同型号单片机LED的引脚不同,所以要改为对应引脚。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P2^0;
void SerialInti()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void Uart1Sends(uchar *str)
{
while(*str!='\0')
{
SBUF=*str;
while(!TI);
TI=0;
str++;
}
}
void delay(uint ttt)
{
while(ttt--);
}
void esp8266_init()
{ delay(50000);
Uart1Sends("AT+CWMODE=2\n");
delay(50000);
Uart1Sends("AT+RST\n");
delay(50000);
Uart1Sends("AT+CIPMUX=1\r\n");
delay(50000);
Uart1Sends("AT+CIPSERVER=1,8080\r\n");
delay(50000);
}
void main()
{
SerialInti();
esp8266_init();
led1=1;
while(1){}
}
void Serial_interrupt() interrupt 4
{
if(RI)
{
RI=0;
if(SBUF=='K')
{
P2=0x00;
}
if(SBUF=='G')
{
P2=0XFF;
}
}
}
获取源码,请点击👉本项目源码
|