1.ESP-12F模組基礎知識
ESP12-F模組(安信可(Ai-Thinker)ESP8266系列模組)是一款基于樂鑫(Espressif)公司ESP8266芯片的Wi-Fi無線通信模塊,廣泛應用于物聯網(IoT)領域。它體積小巧,集成度高,內置Wi-Fi功能和32位處理器,支持802.11 b/g/n無線標準。ESP12-F模組內置4MB Flash存儲,擁有豐富的GPIO(通用輸入輸出)、UART、SPI、I2C、PWM、ADC等接口,方便與各種傳感器和外設連接。ESP12-F模組功耗低,支持深度休眠,非常適合智能家居、遠程控制、無線傳感器、數據采集等應用場景。使用時需要注意其所有引腳電平為3.3V,不能直接接5V電源或信號,否則可能損壞芯片。
可以理解成ESP-12F是最小系統版,ESP8266是芯片
最終想要實現:
U5(采集溫濕度以及可以控制設備)----------->WIFI-------------------->展示在QT服務器端
QT服務器端發送命令(點擊按鈕)---------------->WIFI-------------------->控制設備開關
如果要實現上述效果,WIFI組件需要將U5發送過來的數據正確發送給服務器端;將服務器發送的指令正確識別并發送給U5。但WIFI組件本身不具備這樣的能力,需要燒入程序(也就是所說的固件)?那如何燒入固件?又如何與U5芯片連接來實現通信呢?
如何燒入固件?
GPIO0:控制WIFI模式,GPIO0為低電平是下載模式,高電平為運行模式
運行和下載模式
運行模式:此時串口為正常的通信功能--->接收AT指令
下載模式:此時串口為下載固件的功能
2.WIFI設備與其他設備之間的連接
1.將電腦端通過USB接口(底板type-c接口)與WIFI相連
22號引腳 TXD為WIFI模組的串口發送引腳
21號引腳 RXD為WIFI模組的串口接收引腳
【注意】為什么不直接將WIFI與USB相連?
WIFI是TTL電平信號,USB是差分信號,使用CH340進行電平轉換TTL---->USB
2.U5與WIFI相連
wifi-----U5引腳--------U5內部
RX--- ---PD2----------串口5-TX
TX-------PC12---------串口5-RX
3.運行模式--->①與PC直接相連,也就是串口調試助手
3.1 AT指令
(1) 復位:AT+RST
這個指令就是復位指令,也可以通過按板子上的reset復位鍵進行復位,復位后會斷開之前的連接,相當于重啟。
(2) 設置WiFi模式:AT+CWMODE=
查詢/設置 Wi-Fi 模式 (Station/SoftAP/Station+SoftAP)
0: 無 Wi-Fi 模式,并且關閉 Wi-Fi RF
1: Station 模式---------可以連接其他熱點
2: SoftAP 模式---------變身成為一個路由器,可以發射wifi信號成為一個熱點
3: SoftAP+Station------模式 混合模式
這里我們要聯網,所以選擇模式1,連接熱點。
(3) 連接WiFi熱點:AT+CWJAP="熱點名字","熱點密碼"
這里我們用電腦開熱點,因為大多數WiFi模組(比如我使用的ESP12-F模組 )只兼容2.4GHz頻段;且ESP12-F模組是低功耗模組,而2.4G模組功耗更低,信號穿透能力更強,覆蓋范圍更廣,復雜環境下穩定性更高。
(4) 連接服務器:AT+CIPSTART="TCP","服務器IP",服務器端口
(5) 發送數據:AT+CIPSEND=5 //發送五個字節給服務器
【注意】
這種方式只能實現單次固定長度數據的發送
輸入后會出現箭頭,表示等待串口向服務器發送五個字節的數據。
3.2什么是透傳模式
(1)簡介:
透傳模式(Transparent Transmission)是一種數據傳輸方式,設備或系統在通信過程中不對數據內容進行解析或處理,僅作為通道將原始數據完整、無修改地傳遞給目標端。常見于串口通信、網絡協議、物聯網設備等場景。
也就是ESP8266作為一個搬運共,不去辨別串口發送過來的數據是什么,只是無腦的發送給服務器。
(2) 設置透傳
1.設置透傳模式:AT+CIPMODE=1
2.使能透傳發送:AT+CIPSEND
之后就可以連續發送數據;
想退出透傳模式可以發送"+++",就會退出透傳模式:
4.使用單片機控制WIFI模塊
1. 關鍵開關設置:
- S2/S3:撥向 MCU方向(連接ESP8266與STM32)
- S4:撥到 運行模式(使能ESP8266正常工作)
- Type-C:插入核心板(供電+調試通信)
2. 整體流程
1. PC通過串口調試助手(USART1)發送指令給STM32。
2. STM32通過空閑中斷接收完整指令,解析指令。
3. STM32通過UART5向ESP8266發送相應的AT指令或數據。
4. ESP8266執行操作(如連接服務器、發送數據等)。
5. ESP8266將服務器返回的數據通過UART5傳給STM32。
6. STM32將結果通過USART1格式化輸出到PC串口調試助手。
3. 2.wifi驅動代碼
#include "wifi.h"int connect_flag = 0; // 是否連接成功的標志
int tt_flag = 0; // 是否有網絡發過來的透傳數據標志char WIFI_Config0(int time) // 找到ready 返回 沒有找到返回1
{memset(WiFi_RX_BUF, 0, 1024);WiFi_RxCounter = 0;while (time--){HAL_Delay(100);if (strstr((char *)WiFi_RX_BUF, "ready")){break;}// u1_USART ("WIFI_Config0:=%s",WiFi_RX_BUF);}if (time > 0)return 0;elsereturn 1;
}char WIFI_Config(int time, char *cmd, char *response) // 等待時間 發送內容 判斷返回的內容
{memset(WiFi_RX_BUF, 0, 1024);WiFi_RxCounter = 0;ESP8266_USART("%s\r\n", cmd);while (time--){HAL_Delay(100);if (strstr((char *)WiFi_RX_BUF, response)){break;}// u1_USART("%d ", time);}if (time > 0)return 0;elsereturn 1;
}char WIFI_Router(int time) // 配置WIFI名和密碼
{memset(WiFi_RX_BUF, 0, 1024);WiFi_RxCounter = 0;// ESP8266_USART("AT+CIPMUX=0");// HAL_Delay(100);ESP8266_USART("AT+CWJAP=\"%s\",\"%s\"\r\n", ID, PASSWORD);while (time--){HAL_Delay(1000);if (strstr((char *)WiFi_RX_BUF, "OK")){break;}u1_USART("連接路由倒計時: %d\r\n ", time);}if (time > 0)return 0;elsereturn 1;
}char WIFI_ConnectTCP(int time) // 配置TCP
{memset(WiFi_RX_BUF, 0, 1024);WiFi_RxCounter = 0;ESP8266_USART("AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", ServerIP, ServerPort);while (time--){HAL_Delay(100);if (strstr((char *)WiFi_RX_BUF, "OK")){break;}u1_USART("正在建立TCP連接 :%d ", time);}if (time > 0)return 0;elsereturn 1;
}enum WIFI_STATE
{WIFI_READY = 0,WIFI_CONFIG1,WIFI_ROUTER,WIFI_CONFIG2, //進入透傳模式WIFI_CONNECT, //連接服務器WIFI_CONFIG3,WIFI_COMPLETE //連接完成};#define WAIT_TIME 1000void WIFI_Connect()//狀態機
{int state = WIFI_READY; //默認等待復位while (1){if(state == WIFI_COMPLETE){u1_USART("連接服務器完成并開啟透傳!\r\n");memset(WiFi_RX_BUF,0,1024);//WIFI_SendData("hello world");break; //這里直接跳出while(1)循環即可}switch (state){case WIFI_READY://檢測是否手動復位了/*0、按鍵復位*/u1_USART("0、準備按鍵復位!\r\n");if (WIFI_Config0(100))//判是否收到ready{u1_USART("按鍵復位失敗!\r\n");HAL_Delay(WAIT_TIME);}else//成功了 找到了{u1_USART("按鍵復位成功!\r\n");state = WIFI_CONFIG1;}break;case WIFI_CONFIG1:/*1、配置WIFI模式*/u1_USART("1、準備配置WIFI模式!\r\n");if (WIFI_Config(50, "AT+CWMODE=1\r\n", "OK"))//發送命令 檢測OK{u1_USART("配置WIFI模式失敗!\r\n");HAL_Delay(WAIT_TIME);break;}else//成功u1_USART("配置WIFI模式成功!\r\n");u1_USART("\r\n");/*2、重啟(命令方式)*/u1_USART("2、準備復位!\r\n");if (WIFI_Config(50, "AT+RST\r\n", "ready")){u1_USART("復位失敗!\r\n");HAL_Delay(WAIT_TIME);break;}elseu1_USART("復位成功!\r\n");u1_USART("\r\n");/*3、取消自動連接*/u1_USART("3、準備取消自動連接\r\n");if (WIFI_Config(50, "AT+CWAUTOCONN=0\r\n", "OK"))//取消熱點自動連接 檢測OK{u1_USART("取消自動連接失敗!\r\n");HAL_Delay(WAIT_TIME);break;}elseu1_USART("取消自動連接成功!\r\n");WiFi_RxCounter = 0;state = WIFI_ROUTER;break;case WIFI_ROUTER:/*4、連接路由器*/u1_USART("4、準備連接路由器\r\n");if (WIFI_Router(50))//連接熱點并檢測是否連接成功{u1_USART("連接路由器失敗!\r\n");HAL_Delay(WAIT_TIME);}else{u1_USART("連接路由器成功!\r\n");state = WIFI_CONFIG2;}break;case WIFI_CONFIG2:/*5、配置單路連接模式*/u1_USART("5、準備配置單路連接模式!\r\n");if (WIFI_Config(50, "AT+CIPMUX=0\r\n", "OK"))//配置單路連接{u1_USART("配置單路連接模式失敗!\r\n");HAL_Delay(WAIT_TIME);break;}else{u1_USART("配置單路連接模式成功!\r\n");}u1_USART("\r\n");/*6、開啟透傳模式*/u1_USART("6、準備開啟透傳模式\r\n");if (WIFI_Config(50, "AT+CIPMODE=1\r\n", "OK")){u1_USART("開啟透傳模式失敗!\r\n");HAL_Delay(WAIT_TIME);break;}else{u1_USART("開啟透傳模式成功!\r\n");}state = WIFI_CONNECT;break;case WIFI_CONNECT:/*7、建立TCP連接*/u1_USART("7、準備建立TCP連接\r\n");if (WIFI_ConnectTCP(50))//連接TCP{u1_USART("建立TCP連接失敗!\r\n");HAL_Delay(WAIT_TIME);}else{u1_USART("建立TCP連接成功!\r\n");state = WIFI_CONFIG3;}break;case WIFI_CONFIG3:/*8、進入透傳模式*/u1_USART("8、準備進入透傳模式\r\n");if (WIFI_Config(50, "AT+CIPSEND\r\n", "\r\nOK\r\n\r\n>")){u1_USART("進入透傳模式失敗!\r\n");HAL_Delay(WAIT_TIME);}else{u1_USART("進入透傳模式成功!\r\n");state = WIFI_COMPLETE;connect_flag = 1;break;}default:break;}}
}//int WIFI_SendData(const char *data)
//{
// ESP8266_USART("%s", data);
// //u1_USART("數據發送完成\r\n");
// return 0;
// if (WIFI_Config(10, "AT+CIPSEND=5\r\n", ">"))
// {
// ESP8266_USART("%s", data);
// u1_USART("數據發送完成\r\n");
// return 0;
// }
// else
// {
// u1_USART("數據發送失敗!\r\n");
// return -1;
// }
//}
/r/n
/r:回到當前行行首;
/n:回到下一行的這個位置