51单片机+ESP8266实现局域网内WiFi控制LED

写在前面

  这篇博客是我初探物联网,东西简陋代码简陋,让各位看官见笑了哈。话不多说直接进入正题。

  首先大致介绍下ESP8266,我用的是ESP-01这款,安信可的,具体参数大家可以直接上安信可官网找到资料,非常详细。ESP8266文档中心:安信可ESP8266文档中心
  ESP-01原理图:
  51单片机+ESP8266实现局域网内WiFi控制LED_第1张图片
  这个应该是正视图,就是天线那一面朝上,然后孔位对应如上图。
  
  接线方面,GND要跟51板共地,VCC的额定电压为3.3V,CH-PD即上图EN脚需要接到VCC,RXD和TXD对应接到51板子上的TXD和RXD一般为P3.1和P3.0。这个模块我目前遇到一个问题无法解决,模块正常工作的时候芯片发热非常严重,已经属于烫手的程度,我看芯片手册上写着工作温度最高只能到85度,长期高温工作下去不知道会不会坏,安信可FAE让我EN脚串联一个10K的电阻在接到VCC上,但是实测发现发热有所缓解但还是烫手,而且串联电阻之后模块接收指令正常,但是不发WiFi了,拆掉之后恢复正常,所以只能让模块超温工作。
  
  还有需要注意的是模块的额定电压是3.3v,51板子上供的是5V,需要经过降压处理之后才能接到模块上,不然模块必然会烧!而且51板子上的RXD和TXD也需要经过转换,这点我看到很多其他博主都没有详细写,我这里写出来给大家做个参考,很多时候诡异的问题就是在于硬件部分没有处理好。
  
  降压电路:
  51单片机+ESP8266实现局域网内WiFi控制LED_第2张图片
  用到的是LDO稳压,公司有现成的AMS1117-3.3V和其他元件,全都借用了~
  TXD和RXD的降压使用的是安信可芯片手册给出来的降压电路,在ESP-12S的手册最后面。
  焊接好之后成品如下:
  51单片机+ESP8266实现局域网内WiFi控制LED_第3张图片
  (打码的地方是我废弃的ESP-12S模块…辛辛苦苦搭的电路结果因为ESP-12s的脚位间距与我焊盘不符搞得线都走不进去)
  然后就可以把51板子上的VCC、GND、RXD、TXD接到插针上,首先测量下电压对不对,看看电路有没有问题。我这里测量数据是输入电压4.6V,1117的Vout出来的电压为3.29V。输入的RXD电压为4.7V?(记不清了),经过降压之后是2.9V。然后可以放心把模块插上了。
  
  模块这边在插上前我预先用USB-TTL模块接到电脑上做了些处理。
  首先保证模块和电脑可以通信,然后可以先发个 AT 指令看看模块正不正常,一般来说电脑端串口助手会收到OK。
  然后可以开始设置模块,指令如下:
  AT+CWMODE=2 // 模块工作在AP模式,1为station模式,3为AP+station模式
  AT+CWSAP=“ESP8266”,“666666”,11,3 //设置WiFi名称,密码,通道号,加密方式。通道号是参照别的博主写的,3是WPA2_PSK 加密
  AT+RST // 重启模块
  
  一般到这就设置好了,但是代码中我让单片机产生的是9600的波特率,所以我这里也把模块的波特率改为9600。
  AT+UART = 9600,8,1,0,0 //9600-波特率 8-8bit数据位 1-1bit停止位 0-none校验位 0-不使能流控。
  我查资料的时候发现有小伙伴把流控打开了,而USB-TTL模块上没有流控,导致设置完之后就不能通信了,然后只能重刷固件。我这里没有遇到这个问题,刷固件倒是刷了一次,一开始按照其他博主的指令死活修改不了波特率,后来换了上述之后才行,估计跟我的固件无关。刷固件的教程有不少,这里就不写了。
  
  做完上面的操作之后,可以把串口助手波特率改为9600,先看下跟电脑通信是否正常,如果没问题的话用手机连上ESP8266,然后手机下载一个TCP助手,连上WiFi,然后串口助手再发送以下两条指令:
  == AT+CIPMUX=1 //开启多连接
  AT+CIPSERVER=1,8080 //建立服务器,端口号8080 ==
  注意这两条指令在每次模块重启之后都要设置一遍,不然是无法远程连接到模块的。
  
  然后手机端打开TCP助手,建立一个连接,模块的IP地址一般为192.168.4.1,也可以串口助手发送AT+CIFSR来查询。端口号填上之前设置的8080,随便发点什么,如果一切正常的话,在串口助手可以收到类似 +IPD,0,3:111 这样的信息,我们只需要冒号后面的数据,前面的数据不细说了。
  下一步就是写单片机里面的程序了,要让单片机实现我们之前进行的操作。
  代码如下:

#include

typedef unsigned char uint8;
typedef unsigned int uint16;
uint8 i,j,temp;
bit flag;
uint8 receive[4];
uint8 code table[]="AT+CIPMUX=1\r\n";
uint8 code table1[]="AT+CIPSERVER=1,8080\r\n";

void shortdelay(uint16 n){		//短延时
	uint16 i,j;
	for(i=n;i>0;i--){
		for(j=110;j>0;j--){;}
	}
}

void esp_init()
{
	uint8 a=0,b=0;
    while(table[a]!='\0')
    {
        SBUF=table[a];		//写入要发送的字符
        while(!TI);			//等待发送完成
        TI=0;				//发送
        a++;
    }
    shortdelay(50);			//延时函数
    while(table1[b]!='\0')
    {
		SBUF=table1[b];
		while(!TI);			//等待发送完成
		TI=0;
		b++;
    }
}

void int_init(){			//开启定时器1,产生9600波特率
	TMOD = 0x20;			//定时器1工作在方式2八位自动重装模式
	TH1 = 0xfd;
	TL1 = 0xfd;
	TR1 = 1;				//开启定时器1
	
	PCON = 0x00;			//波特率不加倍
	SM0 = 0;				//串口工作方式
	SM1 = 1;	
	REN = 1;				//串口接收允许
	EA = 1;					//打开全局中断
	ES = 1;					//允许串口中断
}

void Uart() interrupt 4
{
    temp=SBUF;				//取出接收到的数据
    RI=0;					//清除接收中断标志位
	if(temp==':'||i>0)
	{
		receive[i]=temp;
		i++;
		if(temp=='\n')
		{
			i=0;
		}
	}
}

void main(){
	int_init();								//中断初始化,定时器初始化
	esp_init_init();						//模块初始化,发送那两条指令
	while(1){
		if(receive[1]=='1'){				//收到1点亮所有LED
			P1 = 0x00;
		}
		else P1 = 0xff;						//否则熄灭所有LED
	}
}

  定时器1产生9600波特率这个我在之前的博客里面有介绍,不懂的可以看下 单片机与上位机的串行通信

  烧好程序后,可以用串口助手看下板子发送的指令正不正常,我这里按一下复位就会发送 AT+CIPMUX=1AT+CIPSERVER=1,8080 这两条指令,而且是分开两行的,证明发送指令正常,然后再用串口助手发 +IPD,0,3:1这条指令给单片机,如果小灯亮,那么51板子是没问题了。如果有异常请自己找下原因,我这里测试都是没有问题的。
  最后一步把模块与51开发板连接起来,VCC GND TXD RXD对应好,然后按一下板子的复位按钮,如果看到ESP模块上面蓝色小灯闪了,证明开发板跟ESP-01模块通信正常。然后用手机连上WIFI,打开TCP助手,建立一个新连接,IP地址192.168.4.1,端口8080,发送一个1,如果看到开发板上的小灯亮了,说明一切正常,如果没亮,还请再找找原因~
51单片机+ESP8266实现局域网内WiFi控制LED_第4张图片
  51单片机+ESP8266实现局域网内WiFi控制LED_第5张图片
  同理发送0,开发板上所有LED小灯熄灭。结束~
  花了两三天时间,一开始是ESP模块波特率改不了,然后是设计降压电路,焊接降压电路,芯片发热又想解决发热问题,遇到不少坑,最后看到这几个破灯点亮真是激动。
  下一篇可能会写让ESP-01接入互联网,然后手机端直接通过4G控制小灯亮灭,真正实现物联网的功能。希望别遇到太多困难…
  另外代码中还有一个没想通的问题,主函数while(1)中放的两行代码,如果放到串口中断服务函数里面的

		if(temp=='\n')
		{
			i=0;
		}

  就会出现这种情况:手机发1,板子没反应,再发1,LED亮。我还没试过先发1再发0。估计情况类似,可能LED会亮,然后下次再发1的话LED会灭。就是控制滞后一轮,具体原因分析不出来,路过的看官如果知道希望能在评论区告诉我~

你可能感兴趣的:(技术分享)