Android studio开发APP通过esp8266WiFi控制51单片机LED灯亮灭

本章介绍基于Android studio设计的APP通过esp8266WiFi控制51单片机LED灯的亮灭实现过程。

目录

  • 对ESP8266WiFi模块进行设置
    • 编写Android studio代码
      • 编写89C51单片机代码

对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开发APP通过esp8266WiFi控制51单片机LED灯亮灭_第1张图片

编写Android studio代码

1、UI界面设计流程
界面布局采用线性布局,即LinearLayout。控件分布使用垂直分布,即android:orientation=“vertical”。
界面最上方使用TextView控件设计系统名称并将其居中显示。在其下方设计两个TextView和两个EditText,TextView分别显示“IP号:”和“端口号:”,EditText用于使用者输入IP号和端口号。接下来设计三个Button,分别用于连接、开灯和关灯。界面设计如图所示。
Android studio开发APP通过esp8266WiFi控制51单片机LED灯亮灭_第2张图片
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 
#define uchar unsigned char
#define uint unsigned int
sbit led1=P2^0;
void SerialInti() //初始化程序(必须使用,否则无法收发)
{
TMOD=0x20; //定时器 1 操作模式 2;8 位自动重载定时器
TH1=0xfd; //装入初值
TL1=0xfd;
TR1=1; //打开定时器
SM0=0; //设置串行通讯工作模式
SM1=1;
REN=1; //串行接收允许位(要先设置 sm0sm1 再开串行允许)
EA=1; //开总中断
ES=1; //开串行口中断
}
void Uart1Sends(uchar *str) //串行口连续发送 char 型数组
{
while(*str!='\0')
{
SBUF=*str;
while(!TI);//等待发送完成信号(TI=1)出现
TI=0;
str++;
}
}
void delay(uint ttt) //延时函数
{
while(ttt--);
}
void esp8266_init() //ESP8266 上电初始化,必须初始化否则 WiFi 不工作
{ 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; //P2口置低电平驱动灯亮
}
if(SBUF=='G')
{
P2=0XFF; //P2 口置高电平驱动灯亮
}
}
}

获取源码,请点击本项目源码

你可能感兴趣的