ESP32C3连接wifi

文章目录

    • 🔧 一、ESP32-C3 连接 Wi-Fi 的基本原理(STA 模式)
    • ✅ 二、完整代码 + 注释讲解(适配 ESP32-C3)
    • 📌 三、几个关键点解释
    • 🔚 四、小结



🔧 一、ESP32-C3 连接 Wi-Fi 的基本原理(STA 模式)

ESP32-C3 使用 STA(Station)模式连接 Wi-Fi 热点流程如下:

  1. 初始化 NVS 存储:保存 Wi-Fi 参数等。
  2. 初始化网络接口(Netif)与事件循环(Event Loop)
  3. 初始化 Wi-Fi 驱动并设置为 STA 模式
  4. 设置 Wi-Fi SSID 和密码等参数
  5. 注册 Wi-Fi 与 IP 相关事件(启动、断开、获取 IP 等)。
  6. 启动 Wi-Fi 并尝试连接。
  7. 连接成功后会触发 IP 事件,获取 IP 地址。

✅ 二、完整代码 + 注释讲解(适配 ESP32-C3)

#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_netif.h"// 设置你的 Wi-Fi 名称和密码
#define WIFI_SSID "P70PRO+"
#define WIFI_PASS "123456789"// 打印日志用的 tag
static const char *TAG = "wifi_main";// 用于标记是否已成功获取 IP
static bool got_ip = false;/*** @brief Wi-Fi 和 IP 事件处理函数*        这里处理连接、断开、获取 IP 等事件*/
static void wifi_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) {// 当 Wi-Fi STA 模式启动后,尝试连接热点esp_wifi_connect();} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {// 如果连接失败或掉线,自动重连ESP_LOGI(TAG, "Disconnected. Reconnecting...");esp_wifi_connect();} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {// 成功连接 Wi-Fi 并获取到 IP 地址ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));got_ip = true; // 设置标志位表示 Wi-Fi 已连接}
}/*** @brief 主函数入口*        程序从这里开始运行*/
void app_main(void)
{printf("hello world\n");// 1. 初始化 NVS(非易失性存储),用于保存 Wi-Fi 配置等ESP_ERROR_CHECK(nvs_flash_init());// 2. 初始化底层网络接口(如 Wi-Fi STA 接口)ESP_ERROR_CHECK(esp_netif_init());// 3. 创建默认事件循环,用于处理系统事件ESP_ERROR_CHECK(esp_event_loop_create_default());// 4. 创建默认的 Wi-Fi STA 网络接口esp_netif_create_default_wifi_sta();// 5. 初始化 Wi-Fi 驱动wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));// 6. 注册 Wi-Fi 和 IP 相关事件的处理函数ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL));// 7. 配置 Wi-Fi 参数(SSID 和密码)wifi_config_t wifi_config = {.sta = {.ssid = WIFI_SSID, // Wi-Fi 名称.password = WIFI_PASS, // Wi-Fi 密码.threshold.authmode = WIFI_AUTH_WPA2_PSK, // 认证方式},};// 8. 设置为 STA(Station)模式ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));// 9. 加载配置好的 Wi-Fi 参数ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));// 10. 启动 Wi-Fi(此时会触发 WIFI_EVENT_STA_START)ESP_ERROR_CHECK(esp_wifi_start());ESP_LOGI(TAG, "Wi-Fi started, waiting for connection...");// 11. 使用轮询等待连接成功(避免使用事件组)while (!got_ip) {vTaskDelay(pdMS_TO_TICKS(500)); // 延迟 500 毫秒}// 12. 成功连接ESP_LOGI(TAG, "Wi-Fi connected successfully!");
}

连接wifi成功:

在这里插入图片描述

📌 三、几个关键点解释

名称说明
esp_wifi_init()初始化 Wi-Fi 驱动
esp_netif_init()初始化底层 TCP/IP 栈
esp_event_loop_create_default()创建默认事件循环(处理回调)
esp_event_handler_register()注册 Wi-Fi 或 IP 事件的处理函数
esp_wifi_connect()尝试连接 Wi-Fi
WIFI_EVENT_STA_DISCONNECTEDWi-Fi 断开时触发
IP_EVENT_STA_GOT_IP成功获取 IP 地址后触发
esp_wifi_set_config()设置 SSID、密码等
esp_wifi_start()启动 Wi-Fi 模块
vTaskDelay()FreeRTOS 中延时函数

🔚 四、小结

你现在写的代码是ESP32-C3 连接 Wi-Fi 的最简方式之一

  • 省略了事件组:适合初学者快速验证功能
  • 直接判断 got_ip 变量:逻辑简单清晰
  • 结构合理:不依赖复杂任务调度、适合单线程程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/79710.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/79710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LangSmith 基本使用教程

LangSmith 是一个强大的工具&#xff0c;可以帮助开发者追踪、监控和分析语言模型应用程序的性能。下面我将介绍两种基本的追踪方式&#xff1a;追踪 OpenAI 调用和追踪整个应用程序。 1. 追踪 OpenAI 调用 (Trace OpenAI calls) 这种方法主要用于追踪对 OpenAI API 的调用&a…

Python基础学习-Day23

目录 基础概念转换器&#xff08;transformer&#xff09;估计器&#xff08;estimator&#xff09;管道&#xff08;pipeline&#xff09; 实例pipeline 基础概念 pipeline在机器学习领域可以翻译为“管道”&#xff0c;也可以翻译为“流水线”&#xff0c;是机器学习中一个重…

相对论速度叠加公式与双曲正切

复习下相对论速度叠加公式吧&#xff0c;物理&#xff0c;是不是很多人都忘了呀。假设速度为 u , v u,v u,v&#xff0c;那么叠加后的速度 w w w为&#xff1a; w u v 1 u v / c 2 w\frac{uv}{1uv/c^2} w1uv/c2uv​   这个公式告诉我们&#xff0c;在一个速度为2/3光速的…

【前缀和】和为 K 的子数组(medium)

【前缀和】和为 K 的子数组 题目描述算法原理和细节问题代码 题目描述 和为 K 的子数组 给定一个整数数组和一个整数 k &#xff0c;请找到该数组中和为 k 的连续子数组的个数。 示例 1&#xff1a; 输入:nums [1,1,1], k 2 输出: 2 解释: 此题 [1,1] 与 [1,1] 为两种不同的…

在Ubuntu服务器上部署Label Studio

一、拉取镜像 docker pull heartexlabs/label-studio:latest 二、启动容器 &#xff08;回到用户目录&#xff0c;例&#xff1a;输入pwd&#xff0c;显示 /home/<user>&#xff09; docker run -d --name label-studio -it -p 8081:8080 -v $(pwd)/mydata:/label-st…

MySQL 从入门到精通(三):日志管理详解 —— 从排错到恢复的核心利器

在 MySQL 数据库的日常运维中&#xff0c;日志是定位问题、优化性能、数据恢复的核心工具。无论是排查服务器启动异常&#xff0c;还是分析慢查询瓶颈&#xff0c;亦或是通过二进制日志恢复误删数据&#xff0c;日志都扮演着 “数据库黑匣子” 的角色。本文将深入解析 MySQL 的…

内存中的“BANK”

一、BANK的定义与物理结构 基本概念 BANK&#xff08;存储体&#xff09; 是内存芯片内部的一个逻辑或物理分区&#xff0c;每个BANK由存储单元阵列、地址解码电路和缓冲器组成&#xff0c;用于分块管理内存操作。 作用&#xff1a;通过并行操作减少访问冲突&#xff0c;提升内…

机器学习——聚类算法练习题

一、 随机创建不同二维数据集作为训练集 &#xff0c;并结合k-means算法将其聚类 &#xff0c;你可以尝试分别聚类不同数量的簇 &#xff0c;并观察聚类 效果&#xff1a; 聚类参数n_cluster传值不同 &#xff0c;得到的聚类结果不同 代码展示&#xff1a; from sklearn.da…

kafka----初步安装与配置

目录标题 ⭐kafka 与 zookeeper间的关系一.集群部署二.修改配置文件三.分发安装包四.启动与关闭 kafka 与 zookeeper 相同&#xff0c;是以集群的形式使用 ⭐kafka 与 zookeeper间的关系 kafka 的使用 要在 zookeeper 集群配置好的基础上 使用要想启动kafka 要先启动 zookeep…

进程与线程:07 CPU调度策略

一、课程内容概述 本节课程主要讲解操作系统的CPU调度策略&#xff0c;聚焦于基本操作系统上的调度算法&#xff0c;探讨其大致实现方式、需折中考虑的问题。CPU调度在不同场景下复杂程度不同&#xff0c;如卫星、导弹等实时性要求高的系统&#xff0c;需采用实时调度&#xf…

JPG与PDF格式转换器

该插件可实现JPG与PDF格式的互转。 MainForm.Designer.cs using System.Windows.Forms; namespace JpgToPdfConverter {partial class MainForm{private System.ComponentModel.IContainer components null;protected override void Dispose(bool disposing){if (disposing &…

LlamaIndex 第八篇 MilvusVectorStore

本指南演示了如何使用 LlamaIndex 和 Milvus 构建一个检索增强生成&#xff08;RAG&#xff09;系统。 RAG 系统将检索系统与生成模型相结合&#xff0c;根据给定的提示生成新的文本。该系统首先使用 Milvus 等向量相似性搜索引擎从语料库中检索相关文档&#xff0c;然后使用生…

浅聊一下数据库的索引优化

背景 这里的索引说的是关系数据库&#xff08;MSSQL&#xff09;中的索引。 本篇不是纯技术性的内容&#xff0c;只是聊一次性能调优的经历&#xff0c;包含到一些粗浅的实现和验证手段&#xff0c;所以&#xff0c;大神忽略即可。 额…对了&#xff0c;笔者对数据库的优化手段…

【android bluetooth 框架分析 02】【Module详解 7】【VendorSpecificEventManager 模块介绍】

1. 背景 我们在 gd_shim_module 介绍章节中&#xff0c;看到 我们将 VendorSpecificEventManager 模块加入到了 modules 中。 // system/main/shim/stack.cc modules.add<hci::VendorSpecificEventManager>();在 ModuleRegistry::Start 函数中我们对 加入的所有 module…

小刚说C语言刷题—1080质因子

1.题目描述 任意输入一正整数 N &#xff0c;求出它的所有质因子。如&#xff1a;10&#xff1d;25&#xff0c;20&#xff1d;225。 输入 输入只有一行&#xff0c;包括 11个整数 n (1≤n≤32768) 输出 输出若干行&#xff0c;按从小到大的顺序给出这个数的所有质因子&am…

C语言中的宏

1.防止头文件重复包含 1.#pragma once #pragma once 是一个编译器指令&#xff0c;用于防止头文件被重复包含。它的核心作用是通过简单语法替代传统的头文件保护宏&#xff08;#ifndef/#define/#endif&#xff09;&#xff0c;提升代码简洁性和可维护性。 作用详解 防止重复…

MapReduce 模型

‌引言‌ MapReduce 是分布式计算领域的里程碑式模型&#xff0c;由 Google 在 2004 年论文中首次提出&#xff0c;旨在简化海量数据处理的复杂性。其核心思想是通过函数式编程的 ‌Map‌ &#xff08;映射&#xff09;和 ‌Reduce‌ &#xff08;归约&#xff09;阶段&#x…

Linux文件编程——标准库函数fopen、fread、fwrite等函数

1. fopen — 打开文件 函数原型&#xff1a; FILE *fopen(const char *filename, const char *mode);参数&#xff1a; filename&#xff1a;要打开的文件名&#xff0c;可以是相对路径或绝对路径。 mode&#xff1a;文件打开模式&#xff0c;表示文件的操作方式&#xff08…

从 Git 到 GitHub - 使用 Git 进行版本控制 - Git 常用命令

希望本贴能从零开始带您一起学习如何使用 Git 进行版本控制&#xff0c;并结合远程仓库 GitHub。这会是一个循序渐进的指南&#xff0c;我们开始吧&#xff01; 学习 Git 和 GitHub 的路线图&#xff1a; 理解核心概念&#xff1a;什么是版本控制&#xff1f;Git 是什么&…

2025.05.11拼多多机考真题算法岗-第四题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 04. 记忆碎片重组 问题描述 卢小姐正在开发一款名为"记忆碎片"的游戏,玩家需要分析混乱的记忆数据,推测出形成这些记忆的原始序列。游戏中,记忆数据存储在一个特殊的数…