admin管理员组

文章数量:1794759

51单片机+ESP8266+Android APP实现局域网内控制LED灯

51单片机+ESP8266+Android APP实现局域网内控制LED灯

一、硬件设计

1.硬件选型

        主控芯片:选用STC15W104。这款MCU比较小巧,控制3个LED灯的亮灭只需要3个IO即可,不足之处是没有串口,与ESP8266通信只能使用模拟串口,买了挺多的,先将就用着先吧。

        LDO: 选用AMS1117-3.3V,ESP8266模块需要使用3.3V电源,使用1117-3.3V将常用的5V转成3.3V。

2.原理图设计

        原理图比较简单,注意ESP8266模块的TX和RX引脚需要连接到STC15W104的P3.0和P3.1引脚上以及EN引脚连接到3.3V即可。原理图如下:

 3.PCB设计

        PCB设计的话,我设计成板上焊接一个8P的母座,然后将ESP8266模块插上去就可以正常使用。PCB图和效果如下:

二|、软件设计

1. 51单片机程序设计

        1.1 单片机要和ESP8266正常通信,需要设置通信波特率相同。如:51单片机使用的波特率为9600,ESP8266也需要设置为9600,否则无法正常通信,而ESP8266模块默认波特率为115200。修改ESP8266波特率的方法:ESP8266和USB-TTL连接好线后,使用串口助手发送AT+UART=9600,8,1,0,0指令即可。

ESP8266和USB-TTL连接方式
ESP8266USB-TTL
3V33V3
EN3V3
RXTX
TXRX
GNDGND

         1.2 模拟串口这部分程序参考官方文档,程序中为收到字符A,开启LED2,收到字符B,关闭LED2,要控制多个LED灯的亮灭,根据收到的不同指令来区分即可。部分程序如下:

//发送一个字节 void sendChar(uchar a) { if(!TING) //发送空闲 { TBUF = a; TING = 1; } Delay10ms(); } //发送字符串 void sendString(uchar *s) { while(*s!='\\0') { sendChar(*s); s++; } } void esp8266_init() { Delay3000ms(); sendString("AT+CIPMUX=1\\r\\n"); //允许多连接 Delay3000ms(); sendString("AT+CIPSERVER=1,8080\\r\\n"); //建立服务器 Delay3000ms(); } //----------------------------------------- //UART模块的初始变量 initial UART module variable void UART_INIT() { TING = 0; RING = 0; REND = 0; TCNT = 0; RCNT = 0; } void main() { InternalRAM_enable(); Timer0_1T(); Timer0_AsTimer(); Timer0_16bitAutoReload(); Timer0_Load(Timer0_Reload); Timer0_InterruptEnable(); Timer0_Run(); EA = 1; //打开总中断 open global interrupt switch UART_INIT(); //UART模块的初始变量 esp8266_init(); LED3 = 1; while (1) { if (REND) //如果接收完,把接收到的值存入接收buff { REND = 0; temp = RBUF; //取出接收到的数据 if(temp=='A'){ LED2 = 0; } if (temp == 'B') { LED2 = 1; } } } }

2. Android APP程序设计

        Android APP我是使用Android Studio来编写的,首先设计好界面,页面布局如下:

         代码部分的话,需要注意的地方是连接esp8266需要有网络权限,在AndroidManifest.xml文件中添加

<uses-permission android:name="android.permission.INTERNET" />

        MainActivity代码如下:

package com.lili.esp8266; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity { public ImageView ledImageView; public Button connectButton; // 连接esp8266 public Button openOrCloseLEDButton; // 打开或者关闭LED按钮 private ConnectThread connectThread; public boolean isConnected; public boolean isOpenLED; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); connectThread = new ConnectThread(this, "192.168.4.1", 8080); // 开启连接线程 connectThread.start(); } private void initView() { // LED灯图标 ledImageView = (ImageView) findViewById(R.id.image); connectButton = findViewById(R.id.button_connect); openOrCloseLEDButton = findViewById(R.id.openOrCloseLED); } // 连接esp8266 public void connect(View view) { // 如果没有连接 if (!isConnected) { connectThread.startConnect = true; } else { try { connectThread.closeConnect(); } catch (Exception e) { e.printStackTrace(); } } } // 打开或者关闭LED public void openOrCloseLED(View view) { // 如果已经连接到esp8266 if (isConnected) { // 如果已经打开LED if (isOpenLED) { // 关闭LED connectThread.closeLED(); } else { // 开启LED connectThread.openLED(); } } else { Toast.makeText(this, "未连接到服务器!", Toast.LENGTH_SHORT).show(); } } }

        最后,有需要的小伙伴们可以使用“单片机项目设计”小程序获取下载链接。

 

本文标签: 单片机网内ledappandroid