ESP8266 Wi-Fi 收發(fā)器提供了一種將微控制器連接到網(wǎng)絡(luò)的方法。它被廣泛用于物聯(lián)網(wǎng)項(xiàng)目,因?yàn)樗阋恕⑿∏汕乙子谑褂谩?/p>
在本教程中,我們將ESP8266 Wi-Fi 模塊與 ARM7-LPC2148 微控制器連接,并創(chuàng)建一個(gè)網(wǎng)絡(luò)服務(wù)器來控制連接到 LPC2148 的 LED。工作流程將如下所示:
從 LPC2148 向 ESP8266 發(fā)送 AT 命令以將 ESP8266 配置為 AP 模式
將筆記本電腦或計(jì)算機(jī) Wi-Fi 連接到 ESP8266 接入點(diǎn)
使用 ESP8266 網(wǎng)絡(luò)服務(wù)器的接入點(diǎn) IP 地址在 PC 中創(chuàng)建 HTML 網(wǎng)頁
根據(jù)從 ESP8266 接收到的值,為 LPC2148 創(chuàng)建一個(gè)程序來控制 LED
所需組件
硬件:
ARM7-LPC2148
ESP8266 Wi-Fi 模塊
引領(lǐng)
3.3V穩(wěn)壓IC
面包板
軟件:
KEIL uVision
閃光魔法工具
油灰
ESP8266 Wi-Fi 模塊
ESP8266 是一款低成本、廣泛用于嵌入式項(xiàng)目的 Wi-Fi 模塊,需要 3.3V 的低功耗。它僅使用兩條線 TX 和 RX 在 ESP8266 和任何具有 UART 端口的微控制器之間進(jìn)行串行通信和數(shù)據(jù)傳輸。
ESP8266 Wi-Fi 模塊引腳圖
設(shè)置 ESP8266 電路板
ESP8266 需要恒定的 3.3V 電源,它對(duì)面包板不友好。所以在我們之前關(guān)于 ESP8266 的教程中,我們?yōu)?ESP8266 制作了一個(gè)電路板,帶有 3.3V 穩(wěn)壓器、一個(gè) RESET 按鈕和用于切換模式(AT 命令或閃光模式)的跳線設(shè)置。它也可以在不使用 perf board 的情況下在面包板上設(shè)置。
在這里,我們焊接了面包板上的所有組件以制作我們自己的 ESP8266 Wi-Fi 板
連接LPC2148和ESP8266進(jìn)行串行通信
為了將ESP8266 與 LPC2148 連接,我們必須在這兩個(gè)設(shè)備之間建立 UART 串??行通信,以將 AT 命令從 LPC2148 發(fā)送到 ESP8266 以配置 ESP8266 Wi-Fi 模塊。
因此,為了在 LPC2148 中使用 UART 通信,我們需要在 LPC2148 中初始化 UART 端口。LPC2148 有兩個(gè)內(nèi)置的 UART 端口(UART0 和 UART1)。
LPC2148中的 UART 引腳
在 LPC2148 中初始化 UART0
我們知道 LPC2148 的引腳是通用引腳,所以我們需要使用 PINSEL0 寄存器來使用 UART0。在初始化 UART0 之前,讓我們了解 LPC2148 中用于使用 UART 功能的這些 UART 寄存器。
LPC2148 中的 UART 寄存器
下表顯示了編程中使用的一些重要寄存器。在我們未來的教程中,我們將簡(jiǎn)要介紹 LPC2148 中用于 UART 的其他寄存器。
UART0 的 x-0 和 UART1 的 x-1:
電路圖和連接
LPC2148、ESP8266和FTDI之間的連接如下圖所示
ESP8266 通過 3.3V 穩(wěn)壓器供電,F(xiàn)TDI 和 LPC2148 通過 USB 供電。
為什么FTDI在這里?
在本教程中,我們將 FTDI(USB 轉(zhuǎn) UART TTL)的 RX 引腳連接到 ESP8266 TX 引腳,該引腳進(jìn)一步連接到 LPC2148 RX 引腳,以便我們可以使用任何終端軟件(如 putty、Arduino IDE)看到 ESP8266 模塊的響應(yīng)。 但為此,請(qǐng)根據(jù) ESP8266 Wi-Fi 模塊的波特率設(shè)置波特率。(我的波特率是 9600)。
在 LPC2148 中對(duì) UART0 進(jìn)行編程以連接 ESP8266 的步驟
以下是將 ESP8266 與 LPC2148 連接的編程步驟,這將使其與物聯(lián)網(wǎng)兼容。
第 1 步:-首先我們需要初始化 PINSEL0 寄存器中的 UART0 TX 和 RX 引腳。
(P0.0 作為 TX,P0.1 作為 RX)
PINSEL0 = PINSEL0 | 0x00000005;
第 2 步:-接下來在 U0LCR(行控制寄存器)中,將 DLAB(除數(shù)鎖存器訪問位)設(shè)置為 1,因?yàn)樗鼏⒂盟鼈儯缓髮⑼V刮辉O(shè)置為 1,數(shù)據(jù)幀長(zhǎng)度設(shè)置為 8 位。
U0LCR = 0x83;
第 3 步:-現(xiàn)在要注意的重要步驟是根據(jù) PCLK 值和所需的波特率設(shè)置 U0DLL 和 U0DLM 的值。通常對(duì)于 ESP8266,我們使用 9600 的波特率。所以讓我們看看如何為 UART0 設(shè)置 9600 的波特率。
波特率計(jì)算公式:
在哪里,
U0DLM、U0DLL:波特率發(fā)生器分頻器寄存器
MULVAL、DIVADDVAL:這些寄存器是小數(shù)發(fā)生器值
對(duì)于 PCLK=15MHZ 的波特率 9600
MULVAL =1 & DIVADDVAL=0
256*U0DLM+U0DLL=97.65
所以 U0DLM=0,我們得到 U0DLL=97(不允許分?jǐn)?shù))
所以我們使用以下代碼:
U0DLM = 0x00;
U0DLL = 0x61;(十六進(jìn)制值 97)
第 4 步:-最后,我們必須在 LCR 中將 DLA(除數(shù)鎖存訪問)禁用設(shè)置為 0。
所以我們有
U0LCR &= 0x0F;
第 5 步:- 對(duì)于 Transmitting a Character,將要發(fā)送的字節(jié)加載到 U0THR 中,并等待字節(jié)發(fā)送完畢,這由 THRE 變?yōu)?HIGH 表示。
無效 UART0_TxChar(char ch)
{
U0THR = ch;
而((U0LSR & 0x40)== 0);
}
第 6 步:- 對(duì)于傳輸字符串,使用以下函數(shù)。為了一一發(fā)送字符串?dāng)?shù)據(jù),我們使用了上述步驟中的字符函數(shù)。
無效 UART0_SendString(char* str)
{
uint8_t i = 0;
而( str[i] != ‘\0’ )
{
UART0_TxChar(str[i]);
我++;
}
}
第 7 步:- 對(duì)于接收字符串,此處使用中斷服務(wù)程序函數(shù),因?yàn)槊慨?dāng)我們發(fā)送 AT 命令或每當(dāng) ESP8266 向 LPC2148 發(fā)送數(shù)據(jù)時(shí),ESP8266 Wi-Fi 模塊都會(huì)將數(shù)據(jù)發(fā)送回 LPC2148 的 RX 引腳,就像我們發(fā)送數(shù)據(jù)到 ESP8266 的網(wǎng)絡(luò)服務(wù)器。
示例:當(dāng)我們從 LPC2148(“AT\r\n”)向 ESP8266 發(fā)送 AT 命令時(shí),我們會(huì)從 Wi-Fi 模塊收到“OK”回復(fù)。
所以我們?cè)谶@里使用中斷來檢查從 ESP8266 Wi-Fi 模塊接收到的值,因?yàn)?ISR 中斷服務(wù)程序具有最高優(yōu)先級(jí)。
因此,每當(dāng) ESP8266 向 LPC2148 的 RX 引腳發(fā)送數(shù)據(jù)時(shí),都會(huì)設(shè)置中斷并執(zhí)行 ISR 功能。
第 8 步:-要為 UART0 啟用中斷,請(qǐng)使用以下代碼
VICintEnable是向量中斷使能寄存器,用于使能 UART0 的中斷。
VICIntEnable |= (1《《6);
VICVecCnt10是為 UART0 分配插槽的向量中斷控制寄存器。
VICVectCntl0 = (1《《5) | 6;
接下來,VICVectaddr0是向量中斷地址寄存器,它具有中斷服務(wù)程序 ISR 地址。
VICVectAddr0 =(無符號(hào))UART0_ISR;
然后我們必須為 RBR 接收緩沖寄存器分配中斷。所以在中斷使能寄存器(U0IER)中我們?yōu)?RBR 設(shè)置。這樣當(dāng)我們接收到數(shù)據(jù)時(shí),就會(huì)調(diào)用中斷服務(wù)程序(ISR)。
U0IER=IER_RBR;
最后,當(dāng)我們從 ESP8266 Wi-Fi 模塊接收數(shù)據(jù)時(shí),我們需要執(zhí)行某些任務(wù)的 ISR 功能。在這里,我們只是從 U0RBR 中的 ESP8266 讀取接收到的值,并將這些值存儲(chǔ)在 UART0_BUFFER 中。最后,在 ISR 結(jié)束時(shí),應(yīng)該將VICVectAddr設(shè)置為零或虛擬值。
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 模塊應(yīng)設(shè)置為 AP 模式,我們需要使用UART0_SendString()函數(shù)從 LPC2148 發(fā)送相應(yīng)的 AT 命令。
從 LPC2148 發(fā)送到 ESP8266的AT 命令如下所述。發(fā)送每個(gè) AT 命令后,ESP8266 響應(yīng)“OK”
1. 發(fā)送 AT 到 ESP8266
UART0_SendString(“AT\r\n”);
延遲_毫秒(3000);
2. 發(fā)送 AT+CWMODE=2(設(shè)置 ESP8266 為 AP 模式)。
UART0_SendString(“AT+CWMODE=2\r\n”);
延遲_毫秒(3000);
3.發(fā)送AT+CIFSR(獲取AP的IP)
UART0_SendString(“AT+CIFSR\r\n”);
延遲_毫秒(3000);
4. 發(fā)送 AT+CIPMUX=1(用于多連接)
UART0_SendString(“AT+CIPMUX=1\r\n”);
延遲_毫秒(3000);
5. 發(fā)送 AT+CIPSERVER=1,80(用于啟用 ESP8266 SERVER with OPEN PORT)
UART0_SendString(“AT+CIPSERVER=1,80\r\n”);
延遲_毫秒(3000);
將十六進(jìn)制文件編程和閃存到 LPC2148
要對(duì) ARM7-LPC2148 進(jìn)行編程,我們需要 keil uVision 和 Flash Magic 工具。此處使用 USB 電纜通過微型 USB 端口對(duì) ARM7 Stick 進(jìn)行編程。我們使用 Keil 編寫代碼并創(chuàng)建一個(gè) hex 文件,然后使用 Flash Magic 將 HEX 文件閃存到 ARM7 棒。要了解有關(guān)安裝 keil uVision 和 Flash Magic 以及如何使用它們的更多信息,請(qǐng)點(diǎn)擊鏈接 Getting Started With ARM7 LPC2148 Microcontroller and Program it using Keil uVision。
完整的程序在教程的最后給出。
注意:將 HEX 文件上傳到 LPC2148 時(shí),不得為 ESP8266 Wi-Fi 模塊和與 LPC2148 連接的 FTDI 模塊供電。
使用帶有 LPC2148 的 ESP8266 IoT Webserver 控制 LED
步驟 1:-將 HEX 文件上傳到 LPC2148 后,通過 USB 線將 FTDI 模塊連接到 PC,然后打開 putty 終端軟件。
選擇Serial,然后根據(jù)您的PC或LAPTOP我的選擇COM端口(COM3)。波特率為 9600。
步驟 2:-現(xiàn)在重置 ESP8266 Wi-Fi 模塊或關(guān)閉電源并重新上電,putty 終端將顯示 ESP8266 Wi-Fi 模塊的響應(yīng),如下圖所示。\
第 3 步:-現(xiàn)在按下 LPC2148 上的 RESET 按鈕。之后 LPC2148 開始向 ESP8266 發(fā)送 AT 命令。我們可以在 putty 終端中看到它的響應(yīng)。
第 4 步:-如上圖所示,ESP8266 設(shè)置為 MODE 2,即 AP 模式,APIP 的地址為 192.168.4.1。請(qǐng)注意此地址,因?yàn)榇说刂穼⒈挥簿幋a在網(wǎng)頁 HTML 代碼中,以控制連接到 LPC2148 的 LED。
重要提示:當(dāng) ESP8266 處于 AP 模式時(shí),您必須將 PC 連接到 ESP8266 AP。見下圖,我的 ESP8266 模塊顯示 AP 名稱為 ESP_06217B(它已打開且沒有密碼)。
最后將記事本文檔保存為 .html擴(kuò)展名
該網(wǎng)頁將在網(wǎng)絡(luò)瀏覽器中顯示如下。
這里的地址是 AP IP 地址 192.168.4.1,我們使用 LPC2148 中的以下邏輯發(fā)送值 @ 和 % 來打開和關(guān)閉 LED。
while(1)
{
if(uart0_count !=0)
{
COMMAND[0]=UART0_BUFFER[uart0_count-1];
if(COMMAND[0] == LEDON) //根據(jù)從 ESP8266 接收到的值設(shè)置 LED 亮或滅的邏輯
{
IOSET1=(1《《20); //設(shè)置輸出
高 delay_ms(100);
}
else if(COMMAND[0]==LEDOFF)
{
IOCLR1=(1《《20); //設(shè)置輸出低
delay_ms(100);
}
}
}
這就是使用 ESP8266 和 ARM7 微控制器 LPC2148 遠(yuǎn)程控制設(shè)備的方式。
#include
#include
#define IER_RBR 0X01
#define IIR_RDA 0X02
#define BUFFER_SIZE 0X40
無符號(hào)字符 UART0_BUFFER[BUFFER_SIZE];
無符號(hào)整數(shù) uart0_count;
無符號(hào)字符命令[1];
無符號(hào)字符 LEDON='@',LEDOFF='%';
void UART0_ISR() __irq //ISR中斷服務(wù)程序函數(shù)
{
無符號(hào)字符 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) // 以毫秒為單位的延遲函數(shù)
{
uint16_t x,i;
for(i=0;i
{
對(duì)于(x=0;x<6000;x++);// 循環(huán)生成 1 毫秒延遲,Cclk = 60MHz
}
}
無效 UART0_initilize(無效)
{
VPBDIV = 0x00;
PINSEL0 = PINSEL0 | 0x00000005; // 使能 UART0 的 UART0 Rx0 和 Tx0 引腳
U0LCR = 0x83;// DLAB = 1,1 個(gè)停止位,8 位字符長(zhǎng)度
U0DLM = 0x00;// 對(duì)于 9600 的波特率,Pclk = 15MHz
U0DLL = 0x61;// 我們從公式中得到這些 U0DLL 和 U0DLM 的值
U0LCR &= 0x0F; // DLAB = 0
VICIntEnable |= (1<<6); //開啟UART0中斷
VICVectCntl0 = (1<<5) | 6;//啟用UART IRQ插槽
VICVectAddr0 =(無符號(hào))UART0_ISR;//UART ISR函數(shù)地址
U0IER=IER_RBR;//啟用RBR中斷
}
void UART0_TxChar(char ch) //在UART0上發(fā)送一個(gè)字節(jié)的函數(shù)
{
U0THR = 通道;
而((U0LSR & 0x40)== 0);//等到THRE位變?yōu)?表示傳輸完成
}
void UART0_SendString(char* str) //在UART0上發(fā)送字符串的函數(shù)
{
uint8_t 我 = 0;
而( str[i] != '\0' )
{
UART0_TxChar(str[i]);
我++;
}
}
無效 wifi_sendATcommands(無效)
{
延遲毫秒(5000);
UART0_SendString("AT\r\n"); //發(fā)送AT到ESP8266
延遲_毫秒(3000);
UART0_SendString("AT+CWMODE=2\r\n"); //發(fā)送 AT+CWMODE=2(設(shè)置 ESP8266 為 AP 模式)
延遲_毫秒(3000);
UART0_SendString("AT+CIFSR\r\n"); //發(fā)送AT+CIFSR(獲取AP的IP)
延遲_毫秒(3000);
UART0_SendString("AT+CIPMUX=1\r\n"); //發(fā)送 AT+CIPMUX=1 (用于多連接)
延遲_毫秒(3000);
UART0_SendString("AT+CIPSERVER=1,80\r\n"); //發(fā)送 AT+CIPSERVER=1,80 (用于啟用 ESP8266 SERVER with OPEN PORT)
延遲_毫秒(3000);
}
詮釋主要(無效)
{
IODIR1=(1<<20); //將引腳P1.20設(shè)置為輸出引腳
UART0_initilize(); //函數(shù)調(diào)用初始化UART0
wifi_sendATcommands(); //向ESP8266發(fā)送AT指令的函數(shù)調(diào)用
而(1)
{ if(uart0_count !=0)
{
命令[0]=UART0_BUFFER[uart0_count-1];
if(COMMAND[0] == LEDON) //根據(jù)從 ESP8266 接收到的值設(shè)置 LED 開或關(guān)的邏輯
{
IOSET1=(1<<20); //設(shè)置輸出高
延遲毫秒(100);
}
否則如果(命令 [0]==LEDOFF)
{
IOCLR1=(1<<20); //設(shè)置輸出低
延遲毫秒(100);
}
}
}
}
;i++)
-
微控制器
+關(guān)注
關(guān)注
48文章
7570瀏覽量
151623 -
led
+關(guān)注
關(guān)注
242文章
23308瀏覽量
661572 -
wi-fi
+關(guān)注
關(guān)注
14文章
2150瀏覽量
124638 -
ESP8266
+關(guān)注
關(guān)注
50文章
962瀏覽量
45133
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論