ESP8266 Wi-Fi 收發器提供了一種將微控制器連接到網絡的方法。它被廣泛用于物聯網項目,因為它便宜、小巧且易于使用。
在本教程中,我們將ESP8266 Wi-Fi 模塊與 ARM7-LPC2148 微控制器連接,并創建一個網絡服務器來控制連接到 LPC2148 的 LED。工作流程將如下所示:
從 LPC2148 向 ESP8266 發送 AT 命令以將 ESP8266 配置為 AP 模式
將筆記本電腦或計算機 Wi-Fi 連接到 ESP8266 接入點
使用 ESP8266 網絡服務器的接入點 IP 地址在 PC 中創建 HTML 網頁
根據從 ESP8266 接收到的值,為 LPC2148 創建一個程序來控制 LED
所需組件
硬件:
ARM7-LPC2148
ESP8266 Wi-Fi 模塊
引領
3.3V穩壓IC
面包板
軟件:
KEIL uVision
閃光魔法工具
油灰
ESP8266 Wi-Fi 模塊
ESP8266 是一款低成本、廣泛用于嵌入式項目的 Wi-Fi 模塊,需要 3.3V 的低功耗。它僅使用兩條線 TX 和 RX 在 ESP8266 和任何具有 UART 端口的微控制器之間進行串行通信和數據傳輸。
ESP8266 Wi-Fi 模塊引腳圖
設置 ESP8266 電路板
ESP8266 需要恒定的 3.3V 電源,它對面包板不友好。所以在我們之前關于 ESP8266 的教程中,我們為 ESP8266 制作了一個電路板,帶有 3.3V 穩壓器、一個 RESET 按鈕和用于切換模式(AT 命令或閃光模式)的跳線設置。它也可以在不使用 perf board 的情況下在面包板上設置。
在這里,我們焊接了面包板上的所有組件以制作我們自己的 ESP8266 Wi-Fi 板
連接LPC2148和ESP8266進行串行通信
為了將ESP8266 與 LPC2148 連接,我們必須在這兩個設備之間建立 UART 串??行通信,以將 AT 命令從 LPC2148 發送到 ESP8266 以配置 ESP8266 Wi-Fi 模塊。
因此,為了在 LPC2148 中使用 UART 通信,我們需要在 LPC2148 中初始化 UART 端口。LPC2148 有兩個內置的 UART 端口(UART0 和 UART1)。
LPC2148中的 UART 引腳
在 LPC2148 中初始化 UART0
我們知道 LPC2148 的引腳是通用引腳,所以我們需要使用 PINSEL0 寄存器來使用 UART0。在初始化 UART0 之前,讓我們了解 LPC2148 中用于使用 UART 功能的這些 UART 寄存器。
LPC2148 中的 UART 寄存器
下表顯示了編程中使用的一些重要寄存器。在我們未來的教程中,我們將簡要介紹 LPC2148 中用于 UART 的其他寄存器。
UART0 的 x-0 和 UART1 的 x-1:
電路圖和連接
LPC2148、ESP8266和FTDI之間的連接如下圖所示
ESP8266 通過 3.3V 穩壓器供電,FTDI 和 LPC2148 通過 USB 供電。
為什么FTDI在這里?
在本教程中,我們將 FTDI(USB 轉 UART TTL)的 RX 引腳連接到 ESP8266 TX 引腳,該引腳進一步連接到 LPC2148 RX 引腳,以便我們可以使用任何終端軟件(如 putty、Arduino IDE)看到 ESP8266 模塊的響應。 但為此,請根據 ESP8266 Wi-Fi 模塊的波特率設置波特率。(我的波特率是 9600)。
在 LPC2148 中對 UART0 進行編程以連接 ESP8266 的步驟
以下是將 ESP8266 與 LPC2148 連接的編程步驟,這將使其與物聯網兼容。
第 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 的波特率。
波特率計算公式:
在哪里,
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 步:- 對于 Transmitting a Character,將要發送的字節加載到 U0THR 中,并等待字節發送完畢,這由 THRE 變為 HIGH 表示。
無效 UART0_TxChar(char ch)
{
U0THR = ch;
而((U0LSR & 0x40)== 0);
}
第 6 步:- 對于傳輸字符串,使用以下函數。為了一一發送字符串數據,我們使用了上述步驟中的字符函數。
無效 UART0_SendString(char* str)
{
uint8_t i = 0;
而( str[i] != ‘\0’ )
{
UART0_TxChar(str[i]);
我++;
}
}
第 7 步:- 對于接收字符串,此處使用中斷服務程序函數,因為每當我們發送 AT 命令或每當 ESP8266 向 LPC2148 發送數據時,ESP8266 Wi-Fi 模塊都會將數據發送回 LPC2148 的 RX 引腳,就像我們發送數據到 ESP8266 的網絡服務器。
示例:當我們從 LPC2148(“AT\r\n”)向 ESP8266 發送 AT 命令時,我們會從 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;
IIR 值 = U0IIR; IIR 值 》》=1; IIR值&=0x02; if(IIRValue == IIR_RDA) { UART_BUFFER[uart0_count]=U0RBR; uart0_count++; 如果(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”);
延遲_毫秒(3000);
2. 發送 AT+CWMODE=2(設置 ESP8266 為 AP 模式)。
UART0_SendString(“AT+CWMODE=2\r\n”);
延遲_毫秒(3000);
3.發送AT+CIFSR(獲取AP的IP)
UART0_SendString(“AT+CIFSR\r\n”);
延遲_毫秒(3000);
4. 發送 AT+CIPMUX=1(用于多連接)
UART0_SendString(“AT+CIPMUX=1\r\n”);
延遲_毫秒(3000);
5. 發送 AT+CIPSERVER=1,80(用于啟用 ESP8266 SERVER with OPEN PORT)
UART0_SendString(“AT+CIPSERVER=1,80\r\n”);
延遲_毫秒(3000);
將十六進制文件編程和閃存到 LPC2148
要對 ARM7-LPC2148 進行編程,我們需要 keil uVision 和 Flash Magic 工具。此處使用 USB 電纜通過微型 USB 端口對 ARM7 Stick 進行編程。我們使用 Keil 編寫代碼并創建一個 hex 文件,然后使用 Flash Magic 將 HEX 文件閃存到 ARM7 棒。要了解有關安裝 keil uVision 和 Flash Magic 以及如何使用它們的更多信息,請點擊鏈接 Getting Started With ARM7 LPC2148 Microcontroller and Program it using Keil uVision。
完整的程序在教程的最后給出。
注意:將 HEX 文件上傳到 LPC2148 時,不得為 ESP8266 Wi-Fi 模塊和與 LPC2148 連接的 FTDI 模塊供電。
使用帶有 LPC2148 的 ESP8266 IoT Webserver 控制 LED
步驟 1:-將 HEX 文件上傳到 LPC2148 后,通過 USB 線將 FTDI 模塊連接到 PC,然后打開 putty 終端軟件。
選擇Serial,然后根據您的PC或LAPTOP我的選擇COM端口(COM3)。波特率為 9600。
步驟 2:-現在重置 ESP8266 Wi-Fi 模塊或關閉電源并重新上電,putty 終端將顯示 ESP8266 Wi-Fi 模塊的響應,如下圖所示。\
第 3 步:-現在按下 LPC2148 上的 RESET 按鈕。之后 LPC2148 開始向 ESP8266 發送 AT 命令。我們可以在 putty 終端中看到它的響應。
第 4 步:-如上圖所示,ESP8266 設置為 MODE 2,即 AP 模式,APIP 的地址為 192.168.4.1。請注意此地址,因為此地址將被硬編碼在網頁 HTML 代碼中,以控制連接到 LPC2148 的 LED。
重要提示:當 ESP8266 處于 AP 模式時,您必須將 PC 連接到 ESP8266 AP。見下圖,我的 ESP8266 模塊顯示 AP 名稱為 ESP_06217B(它已打開且沒有密碼)。
最后將記事本文檔保存為 .html擴展名
該網頁將在網絡瀏覽器中顯示如下。
這里的地址是 AP IP 地址 192.168.4.1,我們使用 LPC2148 中的以下邏輯發送值 @ 和 % 來打開和關閉 LED。
while(1)
{
if(uart0_count !=0)
{
COMMAND[0]=UART0_BUFFER[uart0_count-1];
if(COMMAND[0] == LEDON) //根據從 ESP8266 接收到的值設置 LED 亮或滅的邏輯
{
IOSET1=(1《《20); //設置輸出
高 delay_ms(100);
}
else if(COMMAND[0]==LEDOFF)
{
IOCLR1=(1《《20); //設置輸出低
delay_ms(100);
}
}
}
這就是使用 ESP8266 和 ARM7 微控制器 LPC2148 遠程控制設備的方式。
#include
#include
#define IER_RBR 0X01
#define IIR_RDA 0X02
#define BUFFER_SIZE 0X40
無符號字符 UART0_BUFFER[BUFFER_SIZE];
無符號整數 uart0_count;
無符號字符命令[1];
無符號字符 LEDON='@',LEDOFF='%';
void UART0_ISR() __irq //ISR中斷服務程序函數
{
無符號字符 IIR 值;
IIR 值 = U0IIR;
IIR 值 >>=1;
IIR值&=0x02;
如果(IIRValue == IIR_RDA)
{
UART0_BUFFER[uart0_count]=U0RBR;
uart0_count++;
如果(uart0_count == BUFFER_SIZE)
{
uart0_count=0;
}
}
VICVectAddr = 0x0;
}
void delay_ms(uint16_t j) // 以毫秒為單位的延遲函數
{
uint16_t x,i;
for(i=0;i
{
對于(x=0;x<6000;x++);// 循環生成 1 毫秒延遲,Cclk = 60MHz
}
}
無效 UART0_initilize(無效)
{
VPBDIV = 0x00;
PINSEL0 = PINSEL0 | 0x00000005; // 使能 UART0 的 UART0 Rx0 和 Tx0 引腳
U0LCR = 0x83;// DLAB = 1,1 個停止位,8 位字符長度
U0DLM = 0x00;// 對于 9600 的波特率,Pclk = 15MHz
U0DLL = 0x61;// 我們從公式中得到這些 U0DLL 和 U0DLM 的值
U0LCR &= 0x0F; // DLAB = 0
VICIntEnable |= (1<<6); //開啟UART0中斷
VICVectCntl0 = (1<<5) | 6;//啟用UART IRQ插槽
VICVectAddr0 =(無符號)UART0_ISR;//UART ISR函數地址
U0IER=IER_RBR;//啟用RBR中斷
}
void UART0_TxChar(char ch) //在UART0上發送一個字節的函數
{
U0THR = 通道;
而((U0LSR & 0x40)== 0);//等到THRE位變為1表示傳輸完成
}
void UART0_SendString(char* str) //在UART0上發送字符串的函數
{
uint8_t 我 = 0;
而( str[i] != '\0' )
{
UART0_TxChar(str[i]);
我++;
}
}
無效 wifi_sendATcommands(無效)
{
延遲毫秒(5000);
UART0_SendString("AT\r\n"); //發送AT到ESP8266
延遲_毫秒(3000);
UART0_SendString("AT+CWMODE=2\r\n"); //發送 AT+CWMODE=2(設置 ESP8266 為 AP 模式)
延遲_毫秒(3000);
UART0_SendString("AT+CIFSR\r\n"); //發送AT+CIFSR(獲取AP的IP)
延遲_毫秒(3000);
UART0_SendString("AT+CIPMUX=1\r\n"); //發送 AT+CIPMUX=1 (用于多連接)
延遲_毫秒(3000);
UART0_SendString("AT+CIPSERVER=1,80\r\n"); //發送 AT+CIPSERVER=1,80 (用于啟用 ESP8266 SERVER with OPEN PORT)
延遲_毫秒(3000);
}
詮釋主要(無效)
{
IODIR1=(1<<20); //將引腳P1.20設置為輸出引腳
UART0_initilize(); //函數調用初始化UART0
wifi_sendATcommands(); //向ESP8266發送AT指令的函數調用
而(1)
{ if(uart0_count !=0)
{
命令[0]=UART0_BUFFER[uart0_count-1];
if(COMMAND[0] == LEDON) //根據從 ESP8266 接收到的值設置 LED 開或關的邏輯
{
IOSET1=(1<<20); //設置輸出高
延遲毫秒(100);
}
否則如果(命令 [0]==LEDOFF)
{
IOCLR1=(1<<20); //設置輸出低
延遲毫秒(100);
}
}
}
}
;i++)
-
微控制器
+關注
關注
48文章
7496瀏覽量
151086 -
led
+關注
關注
242文章
23153瀏覽量
658623 -
wi-fi
+關注
關注
14文章
2114瀏覽量
124342 -
ESP8266
+關注
關注
50文章
962瀏覽量
44852
發布評論請先 登錄
相關推薦
評論