用 arduino-esp32 让 ESP32 联网开发只需 30 分钟
arduino-esp32 是乐鑫官方的 ESP32 系列 Arduino 核心,把底层 ESP-IDF 封装成你熟悉的 setup()/loop() 写法,内置 WiFi、BLE、I2C、SPI 全套外设库。一块 45 元左右的 DevKitC,加上 30 分钟,就能在这块板子上跑起第一个联网程序。
把环境装好,把灯点亮
推荐走 Arduino IDE 的 Boards Manager,全程不用手动 clone 仓库:
- 确认 IDE 版本。装官网最新的 2.x(最低 1.6.4 以上)。确认方式:菜单"关于 Arduino IDE"里能看到版本号。
- 填入平台索引地址。"文件 → 首选项",把官方安装文档里给的 esp32 索引 URL 粘进"附加开发板管理器网址",保存。确认方式:重启后地址仍显示在输入框里,具体地址见 docs/en/installing.rst。
- 安装并选中平台。"工具 → 开发板 → 开发板管理器"搜 "esp32",安装 "esp32 by Espressif Systems"(也就是 arduino-esp32 本体)。确认方式:安装完在"工具 → 开发板"下拉里出现 ESP32 系列条目,选中你实物的型号,再在"串口"里选到板子对应的 COM 口。
接下来写 Blink:它一次验证 GPIO、编译、上传整条链路。唯一要换的是 LED 的引脚号,改成你板子板载灯的 GPIO(对照板子丝印)。
#define LED 2
void setup() { pinMode(LED, OUTPUT); }
void loop() {
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
}
首次编译会自动拉取工具链,耗时 1~3 分钟;之后增量编译十几秒。上传完成后板子应该立刻开始闪灯。
接线之前,先确认环境是好的
灯会闪不等于环境健康。碰外部硬件之前再做两件事:
- 串口验证:打开串口监视器,波特率设 115200,能看到上传/重启日志滚动,说明串口链路正常。
- 板载灯节奏:DevKitC 的 GPIO2 带板载灯,不用任何接线;灯按代码节奏闪,说明你写的引脚号和实物对应得上 ✅
再记住两条接线的避雷规则,这是新手最容易烧逻辑的地方:
- GPIO6/7/8 在经典款 ESP32 上通常接 Flash,输出会干扰启动;
- GPIO34~39 只能做输入;ADC2 的引脚(如 GPIO12/11)在 WiFi 开启时会被射频占用,读数漂移。
对照板子丝印挑一对不冲突的脚。200 多块开发板的引脚映射都在 variants/ 目录,每块板一个文件夹。
三个高频场景的现成代码
想调光、想转舵机 → PWM
用 ESP32 的硬件 LEDC 代替经典 analogWrite,频率范围更宽、不占 CPU。示例是一段呼吸灯:
void setup() {
ledcAttach(13, 5000, 8); // 5 kHz、8 位分辨率
}
void loop() {
for (uint8_t d = 0; d < 255; d++) {
ledcWrite(13, d);
delay(5);
}
}
13、5000、8 三处可改:引脚、频率、分辨率,按你外设的要求调。
想接温湿度计、OLED → I2C
DevKitC 默认 SDA=21、SCL=22。这段代码顺便当总线检查用,打印 "I2C OK" 就说明接线通了:
#include <Wire.h>
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
Wire.beginTransmission(0x76); // SHT3x 地址
Wire.endTransmission();
Serial.println(Wire.lastError() ? "I2C fail" : "I2C OK");
}
0x76 要换成你器件的实际地址,21/22 换成你板子的 SDA/SCL 引脚。
想连上家里的路由器 → WiFi
ESP32 只支持 2.4 GHz,连上后打印出的 IP 就是它的身份:
#include <WiFi.h>
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin("你的SSID", "你的密码");
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println(WiFi.localIP());
}
void loop() {}
SSID 和密码两处换成你的;如果 while 里一直打转,先确认路由器没有只开 5G。
带回家:一个会自己上报数据的节点
把前面的 WiFi + ADC + 串口串起来:每 10 秒读一次采样,连 IP 一起打印。把 analogRead 换成 HTTPClient 或 MQTT 发送,就是远程监测节点。分压后的传感器信号接 GPIO34,SSID 和密码换成你的值:
#include <WiFi.h>
void setup() {
Serial.begin(115200);
analogReadResolution(12);
WiFi.begin("你的SSID", "你的密码");
while (WiFi.status() != WL_CONNECTED) delay(500);
}
void loop() {
Serial.printf("IP %s ADC %d\n", WiFi.localIP().toString().c_str(), analogRead(34));
delay(10000);
}
验证清单:
- 串口 115200 下每 10 秒出现一行
IP 192.168.x.x ADC 2048形式的输出; - 碰一下传感器输入,ADC 值实时跟着动;
- 断电重启,WiFi 重连后继续上报,闭环成立。
需要把 WiFi 密码持久化,用内置的 Preferences,底层是 NVS 分区,掉电不丢。
翻车现场自救指南
上传卡在 "Connecting......" 不动 → 原因:开发板型号选错,或板子没进入下载模式。 → 解法:按住 BOOT 键再点一次上传;还不行换数据线——很多杂牌线只能充电不能传数据。
能编译能上传,串口却无输出 → 原因:C3/C6/S3 部分板子的串口是 USB 原生 CDC 而非 UART,选项没开。 → 解法:在"工具"菜单切换 "USB CDC On Boot",重新上传。
编译报 "too many arguments" 之类错误 → 原因:核心大版本 API 不匹配,旧代码针对 2.x,而 Boards Manager 默认装的是 3.x。 → 解法:对照 2.x_to_3.0.rst 逐项改 API。
WiFi 连接超时 → 原因:ESP32 只支持 2.4 GHz,你的路由器是双频合一。 → 解法:路由器后台单独开一个 2.4G SSID 再连。
ADC 读数整体漂移 → 原因:用了 ADC2 的引脚,WiFi 开启时射频会占用它们。 → 解法:换到 ADC1(GPIO32~39)采样。
启动失败、分区表、OTA 这类系统性问题,直接翻 docs/en/troubleshooting.rst,比论坛搜索快。
下一步往哪走
按项目目标挑一条线深入:
- 免网近场控制:libraries/BLE/examples/ 有 22 个示例可直接改;不用路由器的点对点场景看
libraries/ESP_NOW/。 - 把网页烧进 Flash:用
libraries/WebServer/起页面,再从 tools/partitions/ 选一张带 SPIFFS/LittleFS 分区的分区表(如large_spiffs_8MB.csv)。 - 电池供电省功耗:
libraries/ESP32/examples/DeepSleep/演示微安级睡眠唤醒;选芯片前先查 docs/en/libraries.rst 的功能支持矩阵,哪个 SoC 带哪些外设一目了然。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






