- 所需组件
- ESP8266 Wi-Fi模块
- 将LPC2148与ESP8266进行串行通信
- 电路图和连接
- 对LPC2148中的UART0进行编程以连接ESP8266的步骤
- 使用带LPC2148的ESP8266 IoT Web服务器控制LED
ESP8266 Wi-Fi收发器提供了一种将微控制器连接到网络的方法。它价格便宜,体积小且易于使用,因此已广泛用于物联网项目。我们以前曾使用它通过Raspberry Web服务器和Arduino Web服务器创建Web服务器。
在本教程中,我们将ESP8266 Wi-Fi模块与ARM7-LPC2148微控制器连接,并创建一个Web服务器来控制连接到LPC2148的LED。工作流程将如下所示:
- 从LPC2148向ESP8266发送AT指令,将ESP8266配置为AP模式
- 将笔记本电脑或计算机的Wi-Fi与ESP8266接入点连接
- 在PC上用ESP8266 Web服务器的接入点IP地址创建HTML网页
- 为LPC2148创建一个程序,根据从ESP8266接收的值来控制LED
如果您是ESP8266 Wi-Fi模块的全新用户,请访问以下链接以熟悉ESP8266 Wi-Fi模块。
- ESP8266 Wi-Fi收发器入门(第1部分)
- ESP8266入门(第2部分):使用AT命令
- ESP8266入门(第3部分):使用Arduino IDE编程ESP8266并刷新其内存
所需组件
硬件:
- ARM7-LPC2148
- ESP8266 Wi-Fi模块
- FTDI(USB至UART TTL)
- LED
- 3.3V稳压器IC
- 面包板
软件:
- KEIL uVision
- Flash魔术工具
- 油灰
ESP8266 Wi-Fi模块
ESP8266是一款低成本,广泛用于嵌入式项目的Wi-Fi模块,需要3.3V的低功耗。它仅使用两条线TX和RX在ESP8266和任何具有UART端口的微控制器之间进行串行通信和数据传输。
ESP8266 Wi-Fi模块引脚图
- GND,地(0 V)
- TX,发送数据位X
- GPIO 2,通用输入/输出2
- CH_PD,芯片掉电
- GPIO 0,通用输入/输出0
- RST,复位
- RX,接收数据位X
- VCC,电压(+3.3 V)
设置ESP8266电路板
ESP8266需要3.3V的恒定电源,并且不适合面包板。因此,在之前的ESP8266教程中,我们为ESP8266制作了一块带有3.3V稳压器,一个RESET按钮和用于切换模式(AT命令或闪光模式)的跳线设置的电路板。也可以在不使用穿孔板的情况下在面包板上进行设置。
在这里,我们将所有组件焊接在面包板上,以制作自己的ESP8266 Wi-Fi板
通过以下链接了解ESP8266与各种微控制器的接口:
- ESP8266入门(第3部分):使用Arduino IDE编程ESP8266并刷新其内存
- 将ESP8266与STM32F103C8连接:创建Web服务器
- 使用MSP430 Launchpad和ESP8266发送电子邮件
- ESP8266与PIC16F877A单片机的接口
- 使用Arduino和ESP8266的基于IOT的垃圾箱监控
所有基于ESP8266的项目都可以在这里找到。
将LPC2148与ESP8266进行串行通信
为了使ESP8266与LPC2148接口,我们必须在这两个设备之间建立UART串行通信,以将AT指令从LPC2148发送到ESP8266,以配置ESP8266 Wi-Fi模块。要了解有关ESP8266 AT命令的更多信息,请点击链接。
因此,为了在LPC2148中使用UART通信,我们需要在LPC2148中初始化UART端口。LPC2148具有两个内置的UART端口(UART0和UART1)。
LPC2148中的UART引脚
UART_端口 |
TX_PIN |
RX_PIN |
UART0 |
P0.0 |
P0.1 |
UART1 |
P0.8 |
P0.9 |
在LPC2148中初始化UART0
我们知道LPC2148的引脚是通用引脚,因此我们需要使用PINSEL0寄存器来使用UART0。在初始化UART0之前,请了解LPC2148中使用的这些UART寄存器,以使用UART功能。
LPC2148中的UART寄存器
下表显示了一些用于编程的重要寄存器。在以后的教程中,我们将简要介绍LPC2148中用于UART的其他寄存器。
UART0的x-0和UART1的x-1:
寄存器 |
登记人姓名 |
采用 |
UxRBR |
接收缓冲寄存器 |
包含最近收到的值 |
UxTHR |
传送保持寄存器 |
包含要传输的数据 |
UxLCR |
线路控制寄存器 |
包含UART帧格式(数据位数量,停止位) |
DLL文件 |
除数锁存器LSB |
UART波特率发生器值的LSB |
UxDLM |
除数锁存器MSB |
UART波特率发生器值的MSB |
优信 |
中断使能寄存器 |
用于使能UART0或UART1中断源 |
UxIIR |
中断识别寄存器 |
它包含具有优先级和待处理中断源的状态代码 |
电路图和连接
LPC2148,ESP8266和FTDI之间的连接如下所示
LPC2148 |
ESP8266 |
对外直接投资 |
TX(P0.0) |
接收 |
数控 |
接收(P0.1) |
德克萨斯州 |
接收 |
ESP8266通过3.3V稳压器供电,而FTDI和LPC2148通过USB供电。
为什么FTDI在这里?在本教程中,我们已将FTDI的RX引脚(USB至UART TTL)连接到ESP8266 TX引脚,该引脚进一步连接到LPC2148 RX引脚,以便我们可以使用腻子,Arduino IDE等任何终端软件查看ESP8266模块的响应。但为此,请根据ESP8266 Wi-Fi模块的波特率设置波特率。(我的波特率是9600)。
对LPC2148中的UART0进行编程以连接ESP8266的步骤
以下是将ESP8266与LPC2148连接的编程步骤,以使其与IoT兼容。
步骤1:-首先,我们需要初始化PINSEL0寄存器中的UART0 TX和RX引脚。
(P0.0作为TX,P0.1作为RX) PINSEL0 = PINSEL0-0x00000005;
步骤2:-接下来,在U0LCR(线路控制寄存器)中,将DLAB(除数锁存访问位)设置为1,以启用它们,然后将停止位的位数设置为1,并将数据帧长度设置为8位。
U0LCR = 0x83;
步骤3:-现在要注意的重要步骤是根据PCLK值和所需的波特率设置U0DLL和U0DLM的值。通常,对于ESP8266,我们使用9600的波特率。因此,让我们看看如何为UART0设置9600的波特率。
波特率计算公式:
哪里,
PLCK:外围时钟频率(MHz)
U0DLM,U0DLL:波特率发生器分频器寄存器
MULVAL,DIVADDVAL:这些寄存器是分数发生器值
对于PCLK = 15MHZ时的波特率9600
MULVAL = 1&DIVADDVAL = 0
256 * U0DLM + U0DLL = 97.65
因此,U0DLM = 0,我们得到U0DLL = 97(不允许分数)
因此,我们使用以下代码:
U0DLM = 0x00; U0DLL = 0x61; (十六进制值为97)
步骤4:-最后,我们必须在LCR中将DLA(除数锁存访问)禁用设置为0。
所以我们有
U0LCR&= 0x0F;
步骤5:- 对于发送字符,将要发送的字节装入U0THR,然后等待直到发送字节为止,这由THRE变为高电平表示。
无效UART0_TxChar(char ch) { U0THR = ch; while((U0LSR&0x40)== 0); }
步骤6:- 对于传输字符串,使用下面的函数。为了一一发送字符串数据,我们使用了上一步中的字符功能。
无效UART0_SendString(char * str) { uint8_t i = 0; while(str!='\ 0') { UART0_TxChar(str); i ++; } }
步骤7:- 为了接收字符串,此处使用了中断服务例程功能,因为每当我们发送AT指令或当ESP8266将数据发送到LPC2148时,ESP8266 Wi-Fi模块都会将数据发送回LPC2148的RX引脚,就像我们发送的一样数据发送到ESP8266的Web服务器。
例:当我们从LPC2148向ESP8266发送AT指令(“ AT \ r \ n”)时,会从Wi-Fi模块收到应答“ OK”。
因此我们在此处使用一个中断来检查从ESP8266 Wi-Fi模块接收的值,因为ISR中断服务例程具有最高优先级。
因此,每当ESP8266将数据发送到LPC2148的RX引脚时,中断就会被置位并执行ISR功能。
步骤8:-要启用UART0的中断,请使用以下代码
该 VICintEnable 是矢量中断使能寄存器用于启用中断的UART0。
VICIntEnable-=(1 << 6);
所述 VICVecCnt10 是矢量中断控制寄存器,对于UART0分配槽。
VICVectCntl0 =(1 << 5)-6;
接下来, VICVectaddr0 是向量中断地址寄存器,具有中断服务程序ISR地址。
VICVectAddr0 =(无符号)UART0_ISR;
然后,我们必须为RBR接收缓冲寄存器分配中断。因此,在中断允许寄存器(U0IER)中,我们设置了RBR。因此,当我们接收数据时,将调用中断服务程序(ISR)。
U0IER = IER_RBR;
最后,当我们从ESP8266 Wi-Fi模块接收数据时,我们具有ISR功能需要执行某些任务。在这里,我们只读取U0RBR中存在的ESP8266的接收值,并将这些值存储在UART0_BUFFER中。最后,在ISR结束时, 应将VICVectAddr 设置为零或虚拟值。
void UART0_ISR()__irq { unsigned char IIRValue; IIRValue = U0IIR; IIRValue >> = 1;IIRValue&= 0x02; if(IIRValue == IIR_RDA){ UART_BUFFER = U0RBR; uart0_count ++; if(uart0_count == BUFFER_SIZE){ uart0_count = 0; } }那么VICVectAddr =为0x0; }
步骤9:-由于ESP8266 Wi-Fi模块应设置为AP模式,因此我们需要使用 UART0_SendString() 函数从LPC2148发送相关的AT指令。
从LPC2148发送到ESP8266的AT指令如下。发送每个AT指令后,ESP8266响应“ OK”
1.发送AT到ESP8266
UART0_SendString(“ AT \ r \ n”); delay_ms(3000);
2.发送AT + CWMODE = 2(设置ESP8266为AP模式)。
UART0_SendString(“ AT + CWMODE = 2 \ r \ n”); delay_ms(3000);
3.发送AT + CIFSR(用于获取AP的IP)
UART0_SendString(“ AT + CIFSR \ r \ n”); delay_ms(3000);
4.发送AT + CIPMUX = 1(用于多路连接)
UART0_SendString(“ AT + CIPMUX = 1 \ r \ n”); delay_ms(3000);
5.发送AT + CIPSERVER = 1,80(使能ESP8266 OPEN口服务器)
UART0_SendString(“ AT + CIPSERVER = 1,80 \ r \ n”); delay_ms(3000);
将十六进制文件编程并刷新到LPC2148
要编程ARM7-LPC2148,我们需要keil uVision和Flash Magic工具。此处使用USB电缆通过微型USB端口对ARM7 Stick进行编程。我们使用Keil编写代码并创建一个十六进制文件,然后使用Flash Magic将HEX文件闪存到ARM7 Stick。要了解有关安装keil uVision和Flash Magic以及如何使用它们的更多信息,请单击链接ARM7 LPC2148微控制器入门并使用Keil uVision对其进行编程。
本教程的末尾提供了完整的程序。
注意: 在将HEX文件上传到LPC2148时,不得为ESP8266 Wi-Fi模块和与LPC2148连接的FTDI模块供电。
使用带LPC2148的ESP8266 IoT Web服务器控制LED
步骤1:将HEX文件上传到LPC2148之后,通过USB电缆将FTDI模块连接到PC并打开腻子终端软件。
选择串行,然后根据您的PC或LAPTOP我的是(COM3)选择COM端口。波特率为9600。
步骤2:-现在重置ESP8266 Wi-Fi模块,或者仅将POWER OFF并重新上电,腻子终端将显示ESP8266 Wi-Fi模块的响应,如下所示。\
步骤3:-现在按LPC2148上的RESET按钮。之后,LPC2148开始向ESP8266发送AT指令。我们可以在腻子终端中看到该响应。
步骤4:-如上图所示,ESP8266在模式2中设置为AP模式,APIP的地址为192.168.4.1。请注意该地址,因为此地址将在网页HTML代码中进行硬编码,以控制连接到LPC2148的LED。
重要提示 :ESP8266处于AP模式时,必须将PC连接到ESP8266 AP。请参阅下面的图像,我的ESP8266模块以ESP_06217B的名称显示AP(它是打开的,没有密码)。
步骤5:-将PC连接到ESP8266 AP之后,打开记事本并复制粘贴以下HTML程序网页。确保根据您的ESP8266 Wi-Fi模块更改APIP地址
欢迎来到电路文摘
ESP8266与LPC2148的连接:创建用于控制LED的Web服务器
LED开 LED关在此HTML页面中,我们创建了两个超链接按钮来打开和关闭网页上的LED。
最后将记事本文档另存为.html扩展名
该网页将在网络浏览器中显示如下。
这里的地址是AP IP地址192.168.4.1,我们使用下面的LPC2148中的此逻辑发送@和%值以打开和关闭LED。
while(1) { if(uart0_count!= 0) { 命令= UART0_BUFFER; if(COMMAND == LEDON)//根据从ESP8266接收到的值来设置LED亮或灭的逻辑 { IOSET1 =(1 << 20); //设置OUTPUT HIGH delay_ms(100); } else if(COMMAND == LEDOFF) { IOCLR1 =(1 << 20); //设置OUTPUT LOW delay_ms(100); } } }
这就是使用ESP8266和ARM7微控制器LPC2148可以远程控制设备的方式。完整的代码和说明视频如下。