51单片机通过WIFI模块ESP8266控制LED灯

51单片机通过WIFI模块ESP8266控制LED灯一 系统方案手机 APP 通过 ESP8266WIFI 模块与 51 单片机通信控制 LED 灯的开关 下位机由单片机 ESP8266 模块和 LED 灯组成 上位机由 Android 手机 APP 承担 我们在 APP 上发送 LED 灯的开关控制指令 ESP8266 将收到的数据发送给单片机 从而实现对 LED 灯进行开关控制 设计好的实物是这个样子 二 硬件设计 ESP8266 模块作为一个透传模块使用 RXD

完整源码下载地址:https://download.csdn.net/download/tongxin082/

一、系统方案

手机APP通过ESP8266 WIFI模块与51单片机通信控制LED灯的开关。下位机由单片机、ESP8266模块和LED灯组成,上位机由Android手机APP承担。我们在APP上发送LED灯的开关控制指令,ESP8266将收到的数据发送给单片机,从而实现对LED灯进行开关控制。

51单片机通过WIFI模块ESP8266控制LED灯

设计好的实物是这个样子:

51单片机通过WIFI模块ESP8266控制LED灯

二、硬件设计

ESP8266模块作为一个透传模块使用,RXD、TXD分别连接51单片机的TXD和RXD,VCC和CH_PD管脚接3.3V电压,GND接地,只需要连接这些管脚,ESP8266模块就可以正常工作了。在单片机P2口上连接了三个5mm的LED灯,分别是红黄蓝三种颜色,我们的目的是通过手机APP上的开关控制着三个LED灯的亮灭。

51单片机通过WIFI模块ESP8266控制LED灯

ESP8266实物管脚图

51单片机通过WIFI模块ESP8266控制LED灯

三、单片机软件设计

硬件的连接不复杂,接下来主要是单片机和手机APP代码的编写。

单片机代码主要是串口初始化、串口中断和ESP8266的初始化。首先是串口初始化:

 TMOD=0x20; //定时器1工作在方式2 TH1 = 0xfd; //波特率9600 TL1 = 0xfd; SM0=0;                  //串口工作在方式1 SM1=1; EA = 1; //开总中断 REN = 1; //使能串口 TR1 = 1; //定时器1开始计时

然后是ESP8266初始化:

 delayms(1000);                        //延时 sendString("AT+CWMODE=2\r\n");        //设置ESP8266工作在AP模式下 delayms(1000); sendString("AT+CIPMUX=1\r\n");        //允许多连接 delayms(1000); sendString("AT+CIPSERVER=1\r\n");     //建立服务器 delayms(1000); ES = 1;       //esp8266初始化之后开串口中断

贴上51单片机负责串口发送的两个函数:

//发送一个字节 void sendChar(uchar a) { SBUF = a; while(TI==0); TI=0; } //发送字符串 void sendString(uchar *s) { while(*s!='\0') { sendChar(*s); s++; } }

在串口中断中处理接收到的数据:

1:打开红色灯    2:关闭红色灯

3:打开黄色灯    4:关闭黄色灯

5:打开蓝色灯    6:关闭蓝色灯

esp8266在收到数据并转发给单片机时的数据格式:+IPD,<client号>,<收到的字符长度>:收到的字符,比如+IPD,0,5:hello,其中+PID是固定的;0代表的是TCP客户端编号,esp8266最多支持5个客户端同时连接,也就是说客户端编号是0到4,在本设计中由于只有一个客户端与esp8266相连,所以客户端编号是0;5代表收到的字符长度;hello是收到的字符。在本例中esp8266发送给单片机的数据是+IPD,0,1:1,我们把接收到的字符串缓存到字符数组中,所以在处理收到的数据逻辑中,首先判断是否是以’+’开始的,否则视作无效数据,然后判断数组中的第十个数据,因为第十个数据才是上位机发送过来的数据。

void uart() interrupt 4 {     if(RI == 1)   {     RI = 0; //清除串口接收标志位 receiveTable[i]=SBUF; if(receiveTable[0]=='+') { i++; } else { i=0; } if(i==10) { i=0; switch(receiveTable[9]) { case '1': RedLED=0; break; case '2': RedLED=1; break; case '3': YellowLED=0; break; case '4': YellowLED=1; break; case '5': BlueLED=0; break; case '6': BlueLED=1; break; } } } }

四、Android APP软件设计

Android APP是借助Android Studio来开发的,界面比较简单,通过编辑框输入esp8266的IP地址和端口号,esp8266默认的IP地址是192.168.4.1,端口号是333,这些都可以通过AT指令进行修改。布局页面的xml代码我们就不贴了,熟悉Android开发的读者很快就能根据截图编写出来,放上一个APP界面的截图:

51单片机通过WIFI模块ESP8266控制LED灯

我们主要看一下逻辑代码部分:

首先是控件的初始化和按钮点击事件回调的绑定

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtnConnect = (Button) findViewById(R.id.btn_connect); mEtIP = (EditText) findViewById(R.id.et_ip); mEtPort = (EditText) findViewById(R.id.et_port); mBtnRedOn = (Button) findViewById(R.id.btn_red_on); mBtnRedOff = (Button) findViewById(R.id.btn_red_off); mBtnYellowOn = (Button) findViewById(R.id.btn_yellow_on); mBtnYellowOff = (Button) findViewById(R.id.btn_yellow_off); mBtnBlueOn = (Button) findViewById(R.id.btn_blue_on); mBtnBlueOff = (Button) findViewById(R.id.btn_blue_off); mBtnConnect.setOnClickListener(this); mBtnRedOn.setOnClickListener(this); mBtnRedOff.setOnClickListener(this); mBtnYellowOn.setOnClickListener(this); mBtnYellowOff.setOnClickListener(this); mBtnBlueOn.setOnClickListener(this); mBtnBlueOff.setOnClickListener(this); }

按钮的点击回调方法:

 public void onClick(View v) { switch (v.getId()) { case R.id.btn_connect: //连接 if (mSocket == null || !mSocket.isConnected()) { String ip = mEtIP.getText().toString(); int port = Integer.valueOf(mEtPort.getText().toString()); mConnectThread = new ConnectThread(ip, port); mConnectThread.start(); } if (mSocket != null && mSocket.isConnected()) { try { mSocket.close(); mBtnConnect.setText("连接"); } catch (IOException e) { e.printStackTrace(); } } break; case R.id.btn_red_on:         //开红灯 if (out != null) { out.print("1"); out.flush(); } break; case R.id.btn_red_off:        //关红灯 if (out != null) { out.print("2"); out.flush(); } break; case R.id.btn_yellow_on: if (out != null) { out.print("3"); out.flush(); } break; case R.id.btn_yellow_off: if (out != null) { out.print("4"); out.flush(); } break; case R.id.btn_blue_on: if (out != null) { out.print("5"); out.flush(); } break; case R.id.btn_blue_off: if (out != null) { out.print("6"); out.flush(); } break; } }
 

负责连接esp8266的线程:

private class ConnectThread extends Thread { private String ip; private int port; public ConnectThread(String ip, int port) { this.ip = ip; this.port = port; } @Override public void run() { try { mSocket = new Socket(ip, port); out = new PrintStream(mSocket.getOutputStream()); runOnUiThread(new Runnable() { @Override public void run() { mBtnConnect.setText("断开"); } }); new HeartBeatThread().start(); } catch (IOException e) { e.printStackTrace(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show(); } }); } } }

完整源码下载地址:https://download.csdn.net/download/tongxin082/

本文完!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233534.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • babel es6转es5原理_vue用es6还是es5

    babel es6转es5原理_vue用es6还是es5npminstall–save-devbabel-preset-es2015babel-cli.babelrc文件”presets”:[“es2015”],

    2022年9月15日
    0
  • MyEclipse激活成功教程 CI-2018.9.0版本

    MyEclipse激活成功教程 CI-2018.9.0版本介绍myeclipse是eclipse进化版,有很强大的功能,但是,它是收费的。这也是阻碍大多数人使用它的原因。作为学生,想使用该工具进行学习,但苦于资金有限,只能进行激活成功教程后再学习。本人找了很多的激活成功教程教程,最初感觉很简单,就打算直接开搞;但是,按照教程一步一步来,结果发现,自己就是不能成功。为此,我还安装了很多不同的版本,但由于没有找到根本原因,全都以失败告终。后来,仔细研究后才知道原因…

    2022年9月26日
    0
  • ubuntu安装Qt creator

    ubuntu安装Qt creatorUbuntu安装Qtcreator#ubuntu版本16.04#Qt不限版本

    2022年10月15日
    0
  • 分配空间不足问题

    分配空间不足问题

    2021年8月26日
    54
  • Python机器学习的步骤

    Python机器学习的步骤原文出处:kdnuggets译文出处:数据工匠开始。这是最容易令人丧失斗志的两个字。迈出第一步通常最艰难。当可以选择的方向太多时,就更让人两腿发软了。从…

    2022年7月6日
    19
  • 什么是 SNI?_snidel中文

    什么是 SNI?_snidel中文参考:链接1链接2介绍是什么:SNI(ServerNameIndication)是TLS的扩展,这允许在握手过程开始时通过客户端告诉它正在连接的服务器的主机名称。作用:用来解决一个服

    2022年8月3日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号