ESP32 - Micropython ESP-IDF 雙線教程 WIFI (2)

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();// 這里可以添加主任務的其他初始化代碼
}

代碼解釋

  1. 包含頭文件:包含了ESP-IDF所需的各種頭文件。

  2. 定義宏和變量:定義了Wi-Fi的SSID和密碼,以及日志標簽TAG

  3. 事件處理函數event_handler:這個函數用于處理來自Wi-Fi和IP棧的事件。它根據事件類型執行不同的操作,如啟動連接、重連和打印IP地址。

  4. 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網絡。

  5. 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功能的函數。

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

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

相關文章

頸源性頭痛癥狀及表

頸源性頭痛一般表現為,就是說從枕后一直顳側,到太陽穴附近,這個是枕小的一個疼痛,還有一部分人從枕后,沿著一個弧線(如下圖)的軌跡到了前額,到我們前額,這樣一個疼痛&…

Bitbucket的原理及應用詳解(一)

本系列文章簡介: 在數字化和全球化的今天,軟件開發和項目管理已經成為企業成功的關鍵因素之一。隨著團隊規模的擴大和項目的復雜化,如何高效地協同開發、管理代碼和確保代碼質量成為了開發者和管理者面臨的重要挑戰。Bitbucket作為一款功能強…

深入解析線程上下文切換:掌握線程上下文切換的核心原理

1. 進程與線程的基本概念 1.1 進程與線程的區別 在操作系統中,進程和線程是兩個基本的概念,它們共同構成了程序的執行環境。了解它們的區別是理解線程上下文切換的基礎。 進程:進程是程序的一次執行實例。它是操作系統資源分配的基本單位。…

pytest的斷言與Selenium 模擬操作的一個例子

在Python中,pytest是一個流行的單元測試框架,而Selenium是一個用于自動化瀏覽器操作的工具。結合這兩者,我們可以編寫自動化測試腳本來驗證網頁的行為是否符合預期。下面是一個簡單的例子,展示了如何使用pytest的斷言功能以及Sele…

解決在Mac下使用npm報錯:Error: EACCES: permission denied

原因說明:沒有足夠的權限在 /usr/local/lib/node_modules 目錄下創建文件夾 這個錯誤表明你在安裝或更新 Vue.js(vue)包時,沒有足夠的權限在 /usr/local/lib/node_modules 目錄下創建文件夾。這通常是因為默認情況下,普…

【頭歌-Python】文件自學引導

禁止轉載,原文:https://blog.csdn.net/qq_45801887/article/details/139258793 參考教程:B站視頻講解——https://space.bilibili.com/3546616042621301 如果代碼存在問題,麻煩大家指正 ~ ~有幫助麻煩點個贊 ~ ~ 文件自學引導 第…

算數運算符

算術運算符是用于數值類型變量計算的運算符。 它的返回結果是數值。 賦值符號 關鍵知識點:先看右側,再看左側,把右側的值賦值給左側的變量。 附上代碼: string myName "唐唐"; int myAge 18; float myHeight 177.5…

202312青少年軟件編程(Python)等級考試試卷(四級)

第 1 題 【單選題】 下列有關分治算法思想的描述不正確的是?(?) A :將問題分解成的子問題具有相同的模式 B :將問題分解出的各個子問題相互之間有公共子問題 C :當問題足夠小時,可以直接求解 D :可以將子問題的求解結果合并成原問題的解 正確答案:B 試題解析: 第 2…

ADIL簡單測試實例

參考資料:https://blog.csdn.net/geyichongchujianghu/article/details/130045373這個連接是Java的代碼,我根據它的鏈接寫了一個kotlin版本的。 AIDL(Android Interface Definition Language)是Android平臺上用于進程間通信&…

AI辦公自動化:kimi批量新建文件夾

工作任務:批量新建多個文件夾,每個文件夾中的年份不一樣 在kimi中輸入提示詞: 你是一個Python編程專家,要完成一個編寫關于錄制電腦上的鍵盤和鼠標操作的Python腳本的任務,具體步驟如下: 打開文件夾&…

FFmpeg編解碼的那些事(1)

看了網上很多ffmpeg的編解碼的文章和代碼,發現有很多文章和代碼都過時了,主要還是ffmpeg有很多接口都已經發生變化了。 這里簡單說一下,什么是編碼和解碼。 1.視頻編碼 對于視頻來說,可以理解為多張(rgb或者yuv&…

Python散點圖矩陣代碼模版

本文分享Python seaborn實現散點圖矩陣代碼模版,節選自👉嫌Matplotlib繁瑣?試試Seaborn! 散點圖矩陣(scatterplot matrix)展示原始數據中所有變量兩兩之間關系,可以規避單一統計指標的偏差&…

二分查找算法詳講(三種版本寫法)原創

介紹: 二分查找算法(Binary Search)是一種在有序數組中查找目標元素的算法。 它的基本思想是通過將目標元素與數組的中間元素進行比較,從而將搜索范圍縮小一半。 如果目標元素等于中間元素,則搜索結束;如果目標元素小…

Neural Filters:照片恢復

Ps菜單:濾鏡/Neural Filters/恢復/照片恢復 Neural Filters/RESTORATION/Photo Restoration 照片恢復 Photo Restoration借助 AI 強大功能快速恢復舊照片,提高對比度、增強細節、消除劃痕。將此濾鏡與著色相結合以進一步增強效果。 “照片恢復”濾鏡利用…

Scikit-Learn隨機森林

Scikit-Learn隨機森林 1、隨機森林1.1、集成學習1.2、Bagging方法1.3、隨機森林算法1.4、隨機森林的優缺點2、Scikit-Learn隨機森林回歸2.1、Scikit-Learn隨機森林回歸API2.2、隨機森林回歸實踐(加州房價預測)1、隨機森林 隨機森林是一種由決策樹構成的集成算法,它在大多情況…

mac安裝的VMware虛擬機進行橋接模式配置

1、先進行網絡適配器選擇,選擇橋接模式 2、點擊網絡適配器 設置... 3、選擇WiFi(我使用的是WiFi,所以選擇這個),注意看右邊的信息:IP和子網掩碼,后續配置虛擬機的ifcfg-ens文件會用到 4、編輯if…

【論文閱讀筆記】The Google File System

1 簡介 Google File System (GFS) 是一個可擴展的分布式文件系統,專為快速增長的Google數據處理需求而設計。這篇論文發表于2003年,此前已在Google內部大規模應用。 GFS不僅追求性能、可伸縮性、可靠性和可用性等傳統分布式文件系統的設計目標&#xf…

benchmark::State benchmark 原理

benchmark::State benchmark::State是Google Benchmark庫中的一個核心類,用于管理單個基準測試的狀態信息和控制基準測試的執行流程。在編寫基準測試時,這個類提供了一套豐富的接口,允許用戶獲取測試循環的次數、調整測試參數、測量時間等&a…

P9 【力扣+知識點】【算法】【二分查找】C++版

【704】二分查找(模板題)看到復雜度logN,得想到二分 給定一個 n 個元素有序的(升序)整型數組 nums 和一個目標值 target ,寫一個函數搜索 nums 中的 target,如果目標值存在返回下標&#xff0…

企業微信hook接口協議,ipad協議http,語音轉文字

語音轉文字 參數名必選類型說明uuid是String每個實例的唯一標識,根據uuid操作具體企業微信msgid是int要轉文字的語音消息id 請求示例 {"uuid":"a4ea6a39-4b3a-4098-a250-2a07bef57355","msgid":1063645 } 返回示例 {"data&…