admin管理员组文章数量:1794759
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 |
3V3 | 3V3 |
EN | 3V3 |
RX | TX |
TX | RX |
GND | GND |
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(); } } }最后,有需要的小伙伴们可以使用“单片机项目设计”小程序获取下载链接。
版权声明:本文标题:51单片机+ESP8266+Android APP实现局域网内控制LED灯 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686472426a71324.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论