ESP32C3连接wifi

news2025/5/14 16:03:02

文章目录

    • 🔧 一、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.coloradmin.cn/o/2375506.html

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

相关文章

机器学习中分类模型的常用评价指标

评价指标是针对模型性能优劣的一个定量指标。 一种评价指标只能反映模型一部分性能&#xff0c;如果选择的评价指标不合理&#xff0c;那么可能会得出错误的结论&#xff0c;故而应该针对具体的数据、模型选取不同的的评价指标。 本文将详细介绍机器学习分类任务的常用评价指…

MySQL的Docker版本,部署在ubantu系统

前言 MySQL的Docker版本&#xff0c;部署在ubantu系统&#xff0c;出现问题&#xff1a; 1.执行一个SQL&#xff0c;只有错误编码&#xff0c;没有错误提示信息&#xff0c;主要影响排查SQL运行问题&#xff1b; 2.这个问题&#xff0c;并不影响实际的MySQL运行&#xff0c;如…

Mac QT水平布局和垂直布局

首先上代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QPushButton> #include<QVBoxLayout>//垂直布局 #include<QHBoxLayout>//水平布局头文件 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), …

回答 | 图形数据库neo4j社区版可以应用小型企业嘛?

刚在知乎上看到了一个提问&#xff0c;挺有意思&#xff0c;于是乎&#xff0c;贴到这里再简聊一二。 转自知乎提问 当然可以&#xff0c;不过成本问题不容小觑。另外还有性能上的考量。 就在最近&#xff0c;米国国家航空航天局——NASA因为人力成本问题&#xff0c;摒弃了使…

Linux操作系统从入门到实战(二)手把手教你安装VMware17pro与CentOS 9 stream,实现Vim配置,并配置C++环境

Linux操作系统从入门到实战&#xff08;二&#xff09;手把手教你安装VMware17pro与CentOS 9.0 stream&#xff0c;实现Vim配置&#xff0c;并编译C文件 前言一、安装VMware17pro二、安装CentOS9.02.1 为什么选择CentOS9&#xff0c;与CentOS7对比2.1 官网下载CentOS9.02.2 国内…

软考架构师考试-UML图总结

考点 选择题 2-4分 案例分析0~1题和面向对象结合考察&#xff0c;前几年固定一题。近3次考试没有出现。但还是有可能考。 UML图概述 1.用例图&#xff1a;描述系统功能需求和用户&#xff08;参与者&#xff09;与系统之间的交互关系&#xff0c;聚焦于“做什么”。 2.类图&…

论文学习_Trex: Learning Execution Semantics from Micro-Traces for Binary Similarity

摘要&#xff1a;检测语义相似的函数在漏洞发现、恶意软件分析及取证等安全领域至关重要&#xff0c;但该任务面临实现差异大、跨架构、多编译优化及混淆等挑战。现有方法多依赖语法特征&#xff0c;难以捕捉函数的执行语义。对此&#xff0c;TREX 提出了一种基于迁移学习的框架…

在VirtualBox中安装虚拟机后不能全屏显示的问题及解决办法

在VirtualBox中安装Windows或Linux虚拟机后&#xff0c;将遇到启动虚拟机后&#xff0c;只能在屏幕中的一块区域里显示虚拟机桌面&#xff0c;却不能全屏显示的问题。要解决此问题&#xff0c;需要在虚拟机中安装与VirtualBox版本相对应的VBox GuestAdditons软件。 这里…

element-ui分页的使用及修改样式

1.安装 npm install element-ui -S 2.在main.js中引入,这里是全部引入&#xff0c;也可以按需引入 import ElementUI from element-ui import element-ui/lib/theme-chalk/index.css Vue.use(ElementUI) 3.使用 layout"prev, pager, next, jumper" &#xff1a;jumpe…

从数据中台到数据飞轮:数字化转型的演进之路

从数据中台到数据飞轮&#xff1a;数字化转型的演进之路 数据中台 数据中台是企业为整合内部和外部数据资源而构建的中介层&#xff0c;实现数据的统一管理、共享和高效利用&#xff0c;目标是打破信息孤岛&#xff0c;提高数据使用效率&#xff0c;支持业务决策和创新 实施成本…

2025年5月-信息系统项目管理师高级-软考高项一般计算题

决策树和期望货币值 加权算法 自制和外购分析 沟通渠道 三点估算PERT 当其他条件一样时&#xff0c;npv越大越好

zst-2001 上午题-历年真题 算法(5个内容)

回溯 算法 - 第1题 找合适的位置&#xff0c;如果没有位置就按B回家 d 分治 算法 - 第2题 b 算法 - 第3题 a 算法 - 第4题 划分一般就是分治 a 算法 - 第5题 分治 a 0-1背包 算法 - 第6题 c 算法 - 第7题 最小的为c 3100 c 算法 - 第8题 …

udp多点通信和心跳包

刷题 # UDP多点通信核心要点## 基础通信模式### 单播通信- 一对一通信方式- UDP默认通信模式- 地址指向具体目标主机### 广播通信- 一对多通信机制- 地址范围&#xff1a;xxx.xxx.xxx.255- 仅限局域网传输- 需设置SO_BROADCAST标志### 组播通信- 多对多群组通信- 地址范围&…

音视频学习:使用NDK编译FFmpeg动态库

1. 环境 1.1 基础配置 NDK 22b (r22b)FFmpeg 4.4Ubuntu 22.04 1.2 下载ffmpeg 官网提供了 .tar.xz 包&#xff0c;可以直接下载解压&#xff1a; wget https://ffmpeg.org/releases/ffmpeg-4.4.tar.xz tar -xvf ffmpeg-4.4.tar.xz cd ffmpeg-4.41.3 安装基础工具链 sudo …

如何使用 Qwen3 实现 Agentic RAG?

今天&#xff0c;我们将学习如何部署由阿里巴巴最新Qwen 3驱动的Agentic RAG。 这里是我们的工具栈&#xff1a; CrewAI用于代理编排。 Firecrawl用于网络搜索。 LightningAI的LitServe用于部署。 顶部的视频展示了这一过程。 图表显示了我们的Agentic RAG流程&#xff1…

相机、雷达标定工具,以及雷达自动标定的思路

本篇我们来看一下自动驾驶传感器配置一个非常重要的模块&#xff0c;也就是传感器的标定。这里主要是对我之前修改的功能包的使用进行一个介绍. 对应的资源也已经上传了&#xff0c;0积分下载 安装 首先整个项目是使用ros1来进行启动的,但是要想正常编译,需要先安装三个对应的…

vsomeip环境搭建保姆级教程

vsomeip环境搭建保姆级教程 ubuntu环境搭建 {% links %} site: VMware搭建ubuntu保姆级教程 url: https://zhuanlan.zhihu.com/p/1903219373906327339 desc: flechazo image: https://q1.qlogo.cn/g?b=qq&nk=2861099&s=5 color: “#9d5b8b” {% endlinks %} vsomei…

我的MCP相关配置记录

1.VSCode的Cline中的MCP {"mcpServers": {"github.com/modelcontextprotocol/servers/tree/main/src/github": {"autoApprove": [],"disabled": false,"timeout": 60,"command": "cmd","args&quo…

我们来学nacos -- 集群nacos2.5.1mysql8.4

2.5.1集群搭建 架构下载解压到3个文件夹初始化数据库&数据迁移检查端口可用配置cluster.confapplication.properties 使用mysql8.4的jar启动db.num is null报错datasource错误成功 nginx反向代理集群查看 架构 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理3个…

Rollup入门与进阶:为现代Web应用构建超小的打包文件

我们常常面临Webpack复杂配置或是Babel转译后的冗余代码&#xff0c;结果导致最终的包体积居高不下加载速度也变得异常缓慢&#xff0c;而在众多打包工具中Rollup作为一个轻量且高效的选择&#xff0c;正悄然改变着这一切&#xff0c;本文将带你深入了解这个令人惊艳的打包工具…