ESP32 上手教程:4 步让节点连上 WiFi,再开远程 OTA 和 2 张选型表
【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32
先做一个小任务:让一块 ESP32 板子上的传感节点连上办公室 WiFi,以后改代码时不用拆板子,把新固件文件发过去就行。本文基于 arduino-esp32(乐鑫官方的 Arduino 核心),读完整篇你能拿走 4 个能直接用的操作:WiFi 稳定连接、分区表选择、OTA 远程更新、深度睡眠省电。
安装核心并跑通第一个示例
第 1 步:在 IDE 首选项里添加开发板管理器网址,再安装 esp32 核心。官方地址以 docs/en/installing.rst 页面为准,装完后开发板管理器能搜到 "esp32"。
第 2 步:板子选 "ESP32 Dev Module",打开 libraries/WiFi/examples/WiFiClientBasic/ 示例,把 SSID 改成你的网络后上传。→ 预期现象:串口监视器先打印 "Connecting to WiFi",随后出现 "Got IP:" 加一个 192.168 网段地址。
第 3 步:在工具菜单核对 Flash Size 与 CPU Frequency,多数 DevKit 用默认的 240MHz / 4MB 即可。 → 预期现象:上传成功,末尾出现 "Hash of data verified"。
看懂核心的分层方式
把芯片想象成一栋公寓:ESP32 内部的 IDF 是水电总闸,cores/esp32/ 里的 HAL 层是物业,把你对 WiFi.begin、analogRead 的调用翻译成芯片寄存器操作,顺带处理内存对齐、中断分发、任务调度。你只管在自己那间屋里写业务逻辑。所以同一份 sketch 只改工具菜单里的板型选项,就能跑在双核的初代 ESP32 和单核的 ESP32-C3 上。
选定板型变体并核对引脚
variants/ 目录下有 300 多个开发板的引脚定义,每个板型一个子目录。选板子之前先对着丝印图核对引脚:
三条经验:
- 串口 TX/RX 的引脚编号因板而异,先定变体再谈端口。
- 初代 ESP32 的 GPIO6 到 GPIO11 接在 SPI flash 总线上,不能外接信号。
- GPIO34 到 GPIO39 只能输入且无上拉,只适合读电平。
给 WiFi 挂上自动重连
现场掉线很常见:AP 重启、信号被墙挡、供电瞬时下陷。重连逻辑不要写进业务层,交给核心。
#include <WiFi.h> const char* ssid = "office-net"; const char* pass = "12345678"; void setup() { Serial.begin(115200); WiFi.setAutoReconnect(true); // 掉线后自动重握手 WiFi.setSleep(false); // 射频不睡眠,时延从几十毫秒降到个位数 WiFi.mode(WIFI_STA); WiFi.begin(ssid, pass); } void loop() { if (WiFi.status() != WL_CONNECTED && millis() > 5000) { WiFi.reconnect(); // 兜底:断开满 5 秒就强制再试一次 delay(2000); } }易错点:WiFi.begin 要等供电稳定后再调,芯片刚上电的头几秒调用可能直接把 CPU 拉复位;中断服务程序里不要调任何 WiFi 函数。需要多 AP 备份时直接用 WiFiMulti,完整代码在 libraries/WiFi/examples/WiFiMulti/WiFiMulti.ino。
启用 OTA 远程更新
批量部署后不可能挨个拆板子插串口,固件必须能从网络推送。
#include <ArduinoOTA.h> void beginOTA() { ArduinoOTA.setHostname("sensor-node-01"); ArduinoOTA.setPassword("change-me"); ArduinoOTA.onEnd([]() { Serial.println("update finished, rebooting"); ESP.restart(); // 必须重启:otadata 指针切到新固件 }); ArduinoOTA.begin(); }前提是分区表带 ota 槽位(下面选型表会讲)。完整工程参考 libraries/ArduinoOTA/examples/BasicOTA/BasicOTA.ino。易错点:更新成功后忘了重启,设备继续跑旧固件,看起来就像"升级失败"。
用深度睡眠把电流压下去
电池供电的节点 99% 的时间在睡觉,只有 1% 醒着采样和上传,睡眠电流直接决定电池撑几个月。常用四种模式的量级对比:
| 模式 | 典型电流 | 唤醒耗时 | 保留状态 |
|---|---|---|---|
| 活动 + WiFi | 100-240 mA | 即时 | 全部 |
| 调制解调器睡眠 | 20-30 mA | 1 ms 内 | 全部 |
| 轻度睡眠 | 约 1 mA | 1 ms 内 | RTC 内存 |
| 深度睡眠 | 10-150 µA | 约 150 ms | RTC 内存 |
想让变量在深睡后还在,得把它放进 RTC 内存区:
#include <esp_sleep.h> RTC_DATA_ATTR uint32_t round = 0; void napUntilButton() { round += 1; // RTC 内存,醒来后仍在 esp_sleep_enable_ext0_wakeup(GPIO_NUM_4, 0); // 4 号脚拉低即唤醒 esp_deep_sleep_start(); }易错点:RTC 内存区只有约 4KB(初代 ESP32 是 8KB),往里塞大数组会静默溢出;需要保持引脚电平跨睡眠不变时,调用 gpio_hold_en(pin) 再睡。
按需求选分区表
Flash 由分区表切成应用区和数据区,决定了程序能做多大会不会支持 OTA。从工具菜单选方案,或者拿 tools/partitions/ 里的 csv 文件做自定义:
| 方案 | 应用区约 | OTA 与数据区 | 适合谁 |
|---|---|---|---|
| default | 1 MB | 双 ota 槽 + spiffs | 常规 sketch |
| huge_app | 3 MB | 无 ota,spiffs 更大 | 大体积程序、不做远程升级 |
| app3M_fat9M_16MB | 3 MB | fatfs,需 16MB flash | 要存图片或语音 |
判断口径就一句:要 OTA 就别选没有 ota 槽的方案;程序超过 1MB 就换 huge_app 或更大容量方案,同时放弃 OTA 或加 flash。
高频问题现场急救
- 现象:上传时端口列表里没有串口,或卡在 "Connecting..."。 根因:USB 转串口芯片驱动没装,或芯片没进下载模式。 处理:先装驱动;仍不行就按住 BOOT 轻触 RST,连上后再松开 BOOT。
- 现象:WiFi 连上几秒后打印 IP,随后频繁掉线。 根因:供电扛不住发射电流,WiFi 发射峰值能到 300 mA 左右。 处理:电源换 5V/1A,VCC 并一颗 100 µF 电容;还不稳就调 WiFi.setSleep(true),用少量时延换电流。
- 现象:OTA 显示 100%,设备还是跑旧固件。 根因:更新后没重启,otadata 指针没切过去。 处理:onEnd 回调里加 ESP.restart();再确认所选分区方案带两个 ota 槽。
- 现象:深度睡眠醒来后,RTC 变量读到 0。 根因:变量没放进 RTC 内存段,或整段 RTC 内存被写满。 处理:补上 RTC_DATA_ATTR;RTC 变量总量控制在约 4KB 以内。
把下一个节点跑起来
整套流程一句话:变体选对、分区表选对,联网、升级、省电就都落在几行配置里。下一步动作:打开 libraries/WiFi/examples/,挑一个最贴近你项目的场景,比如 WiFiScan 或 WiFiClientStaticIP,替换 SSID 后编译上传,10 分钟内你能看到自己的节点出现在路由器的设备列表里。
【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考