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();
        }
    }

}

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

 

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lilihewo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值