android|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 开发环境;
【android|Android studio开发APP通过esp8266WiFi控制51单片机LED灯亮灭】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|Android studio开发APP通过esp8266WiFi控制51单片机LED灯亮灭
文章图片

编写Android studio代码 1、UI界面设计流程
界面布局采用线性布局,即LinearLayout。控件分布使用垂直分布,即android:orientation=“vertical”。
界面最上方使用TextView控件设计系统名称并将其居中显示。在其下方设计两个TextView和两个EditText,TextView分别显示“IP号:”和“端口号:”,EditText用于使用者输入IP号和端口号。接下来设计三个Button,分别用于连接、开灯和关灯。界面设计如图所示。
android|Android studio开发APP通过esp8266WiFi控制51单片机LED灯亮灭
文章图片

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 口置高电平驱动灯亮 } } }

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

    推荐阅读