基于ESP8266的WIFI模塊(含源代碼)
大家好,今天給大家介紹基于ESP8266的WIFI模塊,下方附有本文涉及的全部資料和源代碼的獲取方式,可進(jìn)群免費(fèi)領(lǐng)取。
1、ESP8266簡介
ESP8266是一款高性能的WIFI串口模塊,內(nèi)部集成MCU能實(shí)現(xiàn)單片機(jī)之間串口通信,是目前使用最廣泛的一種WIFI模塊之一。可以簡單理解為一個(gè)WIFI轉(zhuǎn)串口的設(shè)備,不用知道太多WIFI相關(guān)知識(shí),只需要知道串口怎么使用就可以。
接線圖:只需要將RXD、TXD、GND、VCC這4個(gè)引腳,分別和USB轉(zhuǎn)TTL模塊的TXD、RXD、GND、VCC相連接
需要注意,在USB轉(zhuǎn)TTL模塊上有3.3V和5V兩個(gè)引腳可以作為VCC,但是一般選取5V作為VCC。若選取3.3V,可能會(huì)因?yàn)楣╇姴蛔愣鸩粩嗟闹貑ⅲ瑥亩煌5膹?fù)位。
2、開發(fā)方式
ESP8266系列一般具有兩種開發(fā)方式:AT指令開發(fā)和SDK開發(fā)。
AT指令:廠家出廠時(shí)預(yù)先在ESP8266芯片燒入好固件,封裝好WiFi的協(xié)議棧,內(nèi)部已經(jīng)實(shí)現(xiàn)透傳,而用戶只需要使用一個(gè)USB轉(zhuǎn)TTL的模塊或者單片機(jī)的串口就能實(shí)現(xiàn)與WiFi模塊的通信,發(fā)送AT指令來對WiFi模塊進(jìn)行控制。(和藍(lán)牙透傳模塊類似)
SDK開發(fā):由于ESP8266本身即是可編程的芯片,可以把它視為一個(gè)帶有無線通信的單片機(jī),而用戶需要在專門的IDE中編寫對應(yīng)的程序,然后通過燒寫固件的方式將程序?qū)懭氲叫酒校虼耍胍獙?shí)現(xiàn)WiFi通信,需要自定義WiFi協(xié)議棧,對用戶掌握的相關(guān)知識(shí)要求更高。
本篇主要是對AT指令開發(fā)的學(xué)習(xí)。
3、常用AT指令
AT指令不區(qū)分大小寫,以回車、換行結(jié)尾。
4、應(yīng)用模式
ESP266支撐單AP模式、單STA模式和混合模式(可以在兩種模式下切換的狀態(tài)。)
AP模式下,WiFi模塊產(chǎn)生熱點(diǎn),提供無線接入服務(wù),允許其它無線設(shè)備接入,提供數(shù)據(jù)訪問,一般的無線路由/網(wǎng)橋工作在該模式下。該模式對應(yīng)TCP傳輸協(xié)議中的服務(wù)端(TCP Server)。
STA模式下,WiFi模塊為連接到無線網(wǎng)絡(luò)的終端(站點(diǎn)),可以連接到AP,一般無線網(wǎng)卡工作在STA模式下。該模式對應(yīng)TCP傳輸協(xié)議中的客戶端(TCP Client)。
簡單來說,AP模式可以將ESP8266作為熱點(diǎn),讓其他的設(shè)備連接上它;STA模式可以連接上當(dāng)前環(huán)境下的WIFI熱點(diǎn)。
透傳(透明傳輸),就是指不需要關(guān)心wifi協(xié)議是如何實(shí)現(xiàn)的,所需要做的就是A通過串口發(fā)數(shù)據(jù),B通過串口收數(shù)據(jù),整個(gè)過程中A串口和B串口就像是用導(dǎo)線直接連接起來了一樣。使用者無需關(guān)心內(nèi)部具體實(shí)現(xiàn),模塊對于使用者是“透明的”、似乎不存在的(因?yàn)榭蔁o視中間的實(shí)現(xiàn)原理)。
如果不開啟透傳模式,在每次發(fā)送數(shù)據(jù)前都必須先發(fā)送指令AT+CIPSEND=<param>。若開啟了透傳模式,就不需要在每次發(fā)送數(shù)據(jù)前都發(fā)送指令了,只需要發(fā)送一次AT+CIPSEND,之后發(fā)送的內(nèi)容都會(huì)當(dāng)成是數(shù)據(jù)。如果再次發(fā)送命令,要先退出透傳模式(發(fā)送數(shù)據(jù)"+++"退出),否則會(huì)把命令了當(dāng)成是數(shù)據(jù)發(fā)送過去。
ESP8266一般用于連接當(dāng)前環(huán)境的熱點(diǎn),與服務(wù)器建立TCP連接,傳輸數(shù)據(jù)。大致流程如下:
AT+CWMODE=1:設(shè)置工作模式(STA模式)
AT+RST:模塊重啟(生效工作模式)
AT+CWJAP=“111”,“11111111”:連接當(dāng)前環(huán)境的WIFI熱點(diǎn)(熱點(diǎn)名,密碼)
AT+CIPMUX=0:設(shè)置單路連接模式
AT+CIPSTART=“TCP”,“xxx.xxx.xxx.xxx”,xxxx:建立TCP連接
AT+CIPMODE=1:開啟透傳模式
AT+CIPSEND:透傳模式下,傳輸數(shù)據(jù)
+++:退出透傳模式
5、主要代碼
ESP8266的初始化包括以下函數(shù):
ESP8266_TEST();//測試有無ESP8266
ESP8266_RESET();
ESP8266_SetMode();//設(shè)置模式
ESP8266_SetSAP();//設(shè)置熱點(diǎn)
ESP8266_SetCIPMUX();//設(shè)置多路連接
ESP8266_SetCIPSERVER();//開啟連接并設(shè)置端口號(hào)
void Clear_Buffer(void)//清空緩存 {
u16 i; for(i=0;i<500;i++)
USART2_ReceiveData[i]=0;//緩存 USART2_ReceiveTims=0;
} /*-------------------------------------------------
功能:測試有無ESP8266
返回值:0:無錯(cuò)誤
1:等待發(fā)送數(shù)據(jù)超時(shí)
-------------------------------------------------*/ u8 ESP8266_TEST(void) {
u8 timeout=5;
Clear_Buffer();
USART2_printf("AT\r\n"); while(timeout--)
{
Delay_10ms(); if(strstr((const char*)USART2_ReceiveData,(const char*)"OK")!=NULL)
{
Clear_Buffer(); return 0;
}
USART2_printf("AT\r\n");
} return 1;
} /*-------------------------------------------------
功能:測試有無ESP8266
返回值:0:無錯(cuò)誤
1:等待發(fā)送數(shù)據(jù)超時(shí)
-------------------------------------------------*/ u8 ESP8266_RESET(void) {
u8 timeout=50;
Clear_Buffer();
USART2_printf("AT+RST\r\n"); while(timeout--)
{
Delay_10ms(); if(strstr((const char*)USART2_ReceiveData,(const char*)"OK")!=NULL)
{
Clear_Buffer(); return 0;
}
USART2_printf("AT+RST\r\n");
} return 1;
} /*-------------------------------------------------
功能:設(shè)置模式 1-Station模式,2-AP模式(熱點(diǎn)),3-AP兼Station模式
返回值:0:無錯(cuò)誤
1:等待發(fā)送數(shù)據(jù)超時(shí)
-------------------------------------------------*/ u8 ESP8266_SetMode(void) {
u8 timeout=50;
Clear_Buffer();
USART2_printf("AT+CWMODE=2\r\n"); while(timeout--)
{
Delay_100ms(); if(strstr((const char*)USART2_ReceiveData,(const char*)"OK")!=NULL)
{
Clear_Buffer(); return 0;
}
USART2_printf("AT+CWMODE=2\r\n");
} return 1;
} /*-------------------------------------------------
功能:設(shè)置熱點(diǎn),1 信道,3 加密方式
返回值:0:無錯(cuò)誤
1:等待發(fā)送數(shù)據(jù)超時(shí)
-------------------------------------------------*/ u8 ESP8266_SetSAP(void) {
u8 timeout=50;
Clear_Buffer();
USART2_printf("AT+CWSAP=\"ZZBB\",\"12345678\",1,3\r\n"); while(timeout--)
{
Delay_100ms(); if(strstr((const char*)USART2_ReceiveData,(const char*)"OK")!=NULL)
{
Clear_Buffer(); return 0;
}
USART2_printf("AT+CWSAP=\"ZZBB\",\"12345678\",1,3\r\n");
} return 1;
} /*-------------------------------------------------
功能:設(shè)置多路連接
返回值:0:無錯(cuò)誤
1:等待發(fā)送數(shù)據(jù)超時(shí)
-------------------------------------------------*/ u8 ESP8266_SetCIPMUX(void) {
u8 timeout=50;
Clear_Buffer();
USART2_printf("AT+CIPMUX=1\r\n"); while(timeout--)
{
Delay_100ms(); if(strstr((const char*)USART2_ReceiveData,(const char*)"OK")!=NULL)
{
Clear_Buffer(); return 0;
}
USART2_printf("AT+CIPMUX=1\r\n");
} return 1;
} /*-------------------------------------------------
功能:開啟連接并設(shè)置端口號(hào)
返回值:0:無錯(cuò)誤
1:等待發(fā)送數(shù)據(jù)超時(shí)
-------------------------------------------------*/ u8 ESP8266_SetCIPSERVER(void) {
u8 timeout=50;
Clear_Buffer();
USART2_printf("AT+CIPSERVER=1,8080\r\n"); while(timeout--)
{
Delay_100ms(); if(strstr((const char*)USART2_ReceiveData,(const char*)"OK")!=NULL)
{
Clear_Buffer(); return 0;
}
USART2_printf("AT+CIPSERVER=1,8080\r\n");
} return 1; }
- 已贊