600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 51单片机+ESP8266实现局域网内WiFi控制LED

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

时间:2019-07-11 19:26:37

相关推荐

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

写在前面

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

首先大致介绍下ESP8266,我用的是ESP-01这款,安信可的,具体参数大家可以直接上安信可官网找到资料,非常详细。ESP8266文档中心:安信可ESP8266文档中心

ESP-01原理图:

这个应该是正视图,就是天线那一面朝上,然后孔位对应如上图。

接线方面,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也需要经过转换,这点我看到很多其他博主都没有详细写,我这里写出来给大家做个参考,很多时候诡异的问题就是在于硬件部分没有处理好。

降压电路:

用到的是LDO稳压,公司有现成的AMS1117-3.3V和其他元件,全都借用了~

TXD和RXD的降压使用的是安信可芯片手册给出来的降压电路,在ESP-12S的手册最后面。

焊接好之后成品如下:

(打码的地方是我废弃的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<reg52.h>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;//开启定时器1PCON = 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点亮所有LEDP1 = 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,如果看到开发板上的小灯亮了,说明一切正常,如果没亮,还请再找找原因~

同理发送0,开发板上所有LED小灯熄灭。结束~

花了两三天时间,一开始是ESP模块波特率改不了,然后是设计降压电路,焊接降压电路,芯片发热又想解决发热问题,遇到不少坑,最后看到这几个破灯点亮真是激动。

下一篇可能会写让ESP-01接入互联网,然后手机端直接通过4G控制小灯亮灭,真正实现物联网的功能。希望别遇到太多困难…

另外代码中还有一个没想通的问题,主函数while(1)中放的两行代码,如果放到串口中断服务函数里面的

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。