ESP32 - Micropython ESP-IDF 雙線教程 WIFI
- ESP32 - IDF WIFI
- 轉換為ESP32-IDF的示例代碼
- main/main.c
- 代碼解釋
ESP32 - IDF WIFI
轉換為ESP32-IDF的示例代碼
以下是使用ESP-IDF(Espressif IoT Development Framework)編寫的連接到Wi-Fi網絡的示例代碼。
main/main.c
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "nvs_flash.h"
#include "esp_log.h"#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASS "your_wifi_password"static const char *TAG = "wifi_example";static void event_handler(void* arg, esp_event_base_t event_base,int32_t event_id, void* event_data)
{if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {esp_wifi_connect();} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {if (esp_wifi_connect() != ESP_OK) {ESP_LOGE(TAG, "Retry to connect to the AP");}} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;ESP_LOGI(TAG, "got ip:%s",ip4addr_ntoa(&event->ip_info.ip));// 這里可以添加獲取到IP后需要執行的操作}
}void wifi_init_sta(void)
{esp_err_t ret = nvs_flash_init();if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {ESP_ERROR_CHECK(nvs_flash_erase());ret = nvs_flash_init();}ESP_ERROR_CHECK(ret);ESP_ERROR_CHECK(esp_netif_init());ESP_ERROR_CHECK(esp_event_loop_create_default());esp_netif_create_default_wifi_sta();wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));wifi_config_t wifi_config = {.sta = {.ssid = WIFI_SSID,.password = WIFI_PASS},};if (strlen(WIFI_SSID) == 0) {ESP_LOGE(TAG, "SSID not set");return;}ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));ESP_ERROR_CHECK(esp_wifi_start());
}void app_main(void)
{// 初始化Wi-Fiwifi_init_sta();// 這里可以添加主任務的其他初始化代碼
}
代碼解釋
-
包含頭文件:包含了ESP-IDF所需的各種頭文件。
-
定義宏和變量:定義了Wi-Fi的SSID和密碼,以及日志標簽
TAG
。 -
事件處理函數
event_handler
:這個函數用于處理來自Wi-Fi和IP棧的事件。它根據事件類型執行不同的操作,如啟動連接、重連和打印IP地址。 -
wifi_init_sta
函數wifi_init_sta
函數是專門用于初始化ESP32設備作為Wi-Fi客戶端(STA模式)的函數。這個函數執行了以下關鍵步驟:a. NVS初始化:檢查并初始化非易失性存儲(NVS),這是ESP32用來存儲一些設置(如Wi-Fi配置)的地方。如果NVS存在問題(如沒有可用頁面或發現了新版本),則先擦除NVS再重新初始化。
b. 網絡接口和事件循環初始化:初始化ESP32的網絡接口和事件循環,這是ESP-IDF框架中處理網絡事件的基礎。
c. 創建默認STA網絡接口:在ESP32上創建一個默認的STA模式的網絡接口,用于連接到Wi-Fi網絡。
d. Wi-Fi棧初始化:使用默認配置初始化ESP32的Wi-Fi棧,確保Wi-Fi功能可以正常工作。
e. 注冊事件處理函數:注冊兩個事件處理函數,一個用于處理Wi-Fi相關的事件(如STA啟動和斷開連接),另一個用于處理IP事件(如STA成功獲取IP地址)。
f. 配置Wi-Fi參數:設置Wi-Fi的SSID(網絡名稱)和密碼,以便ESP32可以連接到指定的Wi-Fi網絡。
g. 設置Wi-Fi模式并啟動:將ESP32的Wi-Fi模式設置為STA模式,并啟動Wi-Fi,開始嘗試連接到指定的Wi-Fi網絡。
-
app_main
函數app_main
函數是ESP-IDF應用程序的入口點。app_main
函數調用了wifi_init_sta
函數來初始化ESP32的Wi-Fi功能。在實際應用中,
app_main
函數可能還會執行其他初始化任務,比如:- 初始化其他硬件外設(如GPIO、UART、SPI等)。
- 創建并啟動其他任務或線程,用于處理不同的應用程序功能。
- 設置定時器或調度器,用于管理任務的執行時間。
- 與遠程服務器建立網絡連接,進行數據傳輸或接收指令。
總之,
app_main
函數是ESP-IDF應用程序的起點,負責初始化整個應用程序的運行環境,并調用其他函數來執行具體的初始化任務。而wifi_init_sta
函數則是專門用于初始化ESP32的Wi-Fi功能的函數。