單片機---------WIFI模塊

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:回到下一行的這個位置

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94407.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94407.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94407.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

迅為RK3562開發板Android修改uboot logo

本文檔配套資料在網盤資料“iTOP-3562 開發板\02_【iTOP-RK3562 開發板】開發資料\07_Android 系統開發配套資料\05_Android 修改 uboot logo 配套資料”路徑下。1 準備 logo系統默認 uboot logo,如下圖所示:我們如果想要替換這個 logo,首先要制作一個新…

反催收APP開發思路:用Flutter打造證據鏈管理工具

針對非法催收問題,熊哥分享了一款反催收APP的開發思路,旨在幫助“誠而不幸”的負債人收集騷擾證據,通過Flutter實現跨平臺部署。本文整理其核心功能與技術方案,助力開發者快速上手!一、核心功能:證據收集與…

市政道路井蓋缺失識別誤報率↓82%!陌訊多模態融合算法實戰優化與邊緣部署

原創聲明本文為原創技術解析文章,核心技術參數、架構設計及實戰數據引用自 “陌訊技術白皮書”,文中算法實現與優化方案均基于實測驗證,禁止未經授權轉載或篡改內容。一、行業痛點:市政井蓋識別的 “三大攔路虎”市政道路井蓋作為…

navicat及SQLyog的下載和安裝

navicat安裝和使用navicat下載和安裝navicat 下載navicat 的安裝SQLyog下載和安裝SQLyog 的下載SQLyog 的安裝連接到MySQL數據庫navicat下載和安裝 navicat 下載 navicat下載地址 這兩個都是滿足我們需求的,均可 這樣我們就得到了一個雙擊可執行的exe文件 navic…

在TencentOS3上部署OpenTenBase:從入門到實戰的完整指南

文章目錄前言初識OpenTenBase:不只是又一個分布式數據庫OpenTenBase的核心特性環境準備系統環境檢查安裝必要的依賴包用戶環境配置:安全第一創建專用用戶配置SSH免密登錄(單機部署也需要)源碼編譯:從零開始構建獲取源碼…

flink常見問題之超出文件描述符限制

引言Apache Flink 是一個強大且流行的流處理框架,它支持高吞吐量和低延遲的數據處理。在處理大規模數據流時,Flink 用戶可能會遇到各種性能瓶頸,其中之一就是文件描述符的限制。文件描述符是操作系統用來表示打開文件或其他輸入/輸出資源的一…

雅菲奧朗SRE知識墻分享(一):『SRE對智能運維領域所產生的深遠影響』

一、SRE推動了運維與開發的融合1、增強協作:SRE模式鼓勵運維與開發團隊之間的緊密合作,共享知識、資源和責任,共同解決系統穩定性和性能問題。2、共同目標:通過共同設定系統可靠性和性能目標,運維和開發團隊能夠協同工…

【JVM內存結構系列】一、入門:先搞懂整體框架,再學細節——避免從一開始就混淆概念

在Java開發中,你是否遇到過這些困惑:明明代碼沒寫錯,卻突然拋出OutOfMemoryError?調優GC參數時,不知道-Xms和-XX:MetaspaceSize分別影響哪塊內存?面試時被問“JVM內存結構和Java內存模型有啥區別”,只能含糊其辭? 其實,這些問題的根源都指向同一個核心——沒搞懂JVM的…

《Dual Prompt Personalized Federated Learning in Foundation Models》——論文閱讀

面向大規模預訓練模型(ViT、BERT)的千萬級設備場景,用“雙提示(Dual Prompt)”機制實現高效、可擴展的個性化聯邦學習(PFL)1.研究背景傳統聯邦學習在客戶端數據異構(非獨立同分布&am…

深度剖析Lua Table的運作方式

前言&#xff1a;本篇基于Lua-5.3.6源碼并配合《Lua 解釋器構建&#xff1a;從虛擬機到編譯器》一書進行Table的運作解讀。一、Table數據結構typedef struct Table {CommonHeader;lu_byte flags; /* 1<<p means tagmethod(p) is not present */lu_byte lsizenode; /* l…

PETR/PETRv2

PE: position embedding 一、PETR算法動機回歸 1.1 DETR 輸入組成&#xff1a;包含2D位置編碼和Object Query 核心流程&#xff1a;通過Object Query直接索引2D特征圖&#xff0c;結合位置編碼迭代更新Query 特點&#xff1a;整體流程簡潔&#xff0c;每個Query代表一個潛在目標…

計算機大數據畢業設計推薦:基于Spark的氣候疾病傳播可視化分析系統【Hadoop、python、spark】

精彩專欄推薦訂閱&#xff1a;在下方主頁&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主頁&#xff1a;計算機畢設木哥&#x1f525; &#x1f496; 文章目錄 一、項目介紹二、…

英偉達顯卡GPU驅動的本質

我們來深入、詳細地探討一下英偉達&#xff08;NVIDIA&#xff09;GPU驅動程序的本質。 普通用戶眼中的驅動程序可能只是一個“讓顯卡工作的軟件”&#xff0c;但它的本質遠比這復雜和深刻。我們可以從幾個層面來理解它。 核心比喻&#xff1a;翻譯官、指揮官與優化大師 如果說…

算法 ---哈希表

一、哈希介紹 是什么 存儲數據的容器 什么用 快速查找某個元素 什么時候用哈希表 頻繁的查找某一個數的時候 怎么用哈希表 &#xff08;1&#xff09;容器&#xff08;哈希表&#xff09; &#xff08;2&#xff09;用數組模擬哈希表&#xff08;字符串的字符&#xf…

基于分布式環境的令牌桶與漏桶限流算法對比與實踐指南

基于分布式環境的令牌桶與漏桶限流算法對比與實踐指南 在高并發的分布式系統中&#xff0c;限流是保障服務可用性和穩定性的核心手段。本文聚焦于令牌桶算法與漏桶算法在分布式環境下的實現與優化&#xff0c;對多種解決方案進行橫向對比&#xff0c;分析各自的優缺點&#xff…

WPF MVVM入門系列教程(TabControl綁定到列表并單獨指定每一頁內容)

在以前的開發過程中&#xff0c;對于TabControl控件&#xff0c;我一般是習慣直接定義TabItem&#xff0c;在TabItem下布局&#xff0c;并進行綁定。 類似這樣 1 <TabControl ItemsSource"{Binding TabList}" SelectedIndex"0">2 <TabItem…

L2CAP 面向連接信道(CoC)在 BLE 中的應用:建立、流控與數據傳輸

在物聯網(IoT)蓬勃發展的今天,低功耗藍牙(BLE)技術因其高效節能、低成本等特性,成為短距離無線通信的首選方案。作為 BLE 協議棧的核心組件,邏輯鏈路控制與適配協議(L2CAP)的面向連接信道(CoC)承擔著數據傳輸的關鍵任務。本文將深入解析 L2CAP CoC 在 BLE 中的應用,…

醫療AI與醫院數據倉庫的智能化升級:異構采集、精準評估與高效交互的融合方向(上)

摘要: 隨著醫療信息化建設的深入,醫院數據倉庫(Data Warehouse, DW)作為醫療AI應用的核心數據底座,其效能直接決定智能化轉型的深度與廣度。本文聚焦醫療AI驅動下醫院數據倉庫的三大關鍵升級功能——異構采集支持數據庫體檢與智能SQL分析、評估引擎重構實現六大數據庫精準…

2015-2018年咸海流域1km歸一化植被指數8天合成數據集

數據集摘要數據集包含2015年-2018年咸海流域NDVI 8天均值數據。提取美國國家航空航天局中分辨率成像光譜儀MOD13A2產品第一波段作為歸一化植被指數數據&#xff0c;乘以比例因子0.0001&#xff0c;疊加咸海流域邊界數據&#xff0c;裁切后得到咸海流域范圍內的NDVI月均值數據。…

Kafka消息持久化機制全解析:存儲原理與實戰場景

目錄 引言? 一、Kafka消息持久化的核心目標 二、底層存儲機制深度剖析 1.【文件系統分層】——日志分組 日志段 核心結構 示例目錄結構 2.【消息寫入流程】——從內存到磁盤的旅程?? 3.【默認存儲參數】——生產環境的黃金比例 三、典型應用場景與案例實戰 案例1…