从开发环境搭建、C/C++ 语言基础讲起,逐步过渡到 GPIO、串口、WiFi 与蓝牙。每个知识点配一个完整可运行的实战案例,代码逐行注释,元器件作用与接线引脚一一对应。
/* * ============================================================================ * 第 1 章 · 实战案例 01-1:让板载 LED 闪起来 * ---------------------------------------------------------------------------- * 硬件清单: * - ESP32 DevKit V1 开发板 × 1 * - 微型 USB 数据线 × 1(注意必须是数据线,不能用只充电的线) * - 板载 LED(GPIO2)—— 部分开发板没有板载 LED,可外接:GPIO2 → 220Ω 电阻 → LED 阳极, * LED 阴极 → GND * * 功能用途: * 验证「开发环境是否配置成功、芯片是否正常工作、代码能否正确烧录」这三件事。 * 这是所有 ESP32 学习的第一个里程碑,必须先看到灯闪,后面才有意义。 * * 预期现象: * 1. 板载 LED 以 1 秒为周期闪烁(亮 500ms / 灭 500ms) * 2. Arduino IDE 串口监视器(波特率 115200)每半秒打印一行状态日志 * ============================================================================ */ #include <Arduino.h> // 引入 Arduino 核心头文件,提供 pinMode / digitalWrite / millis 等基础 API /* ========================================================================== * 一、引脚定义 * ESP32 DevKit V1 的板载 LED 正极接 3V3、负极接 GPIO2, * 因此 GPIO2 输出低电平(LOW)时 LED 才点亮——这一点和 Arduino UNO 相反。 * ======================================================================== */ #define LED_PIN 2 // 板载 LED 所连接的 GPIO 编号 /* ========================================================================== * 二、可调参数(初学者最爱改的地方,改完直接重新烧录即可看效果) * ======================================================================== */ const class="kw">unsigned long ON_TIME_MS = 500; // LED 点亮持续时间,单位毫秒 const class="kw">unsigned long OFF_TIME_MS = 500; // LED 熄灭持续时间,单位毫秒 /* ========================================================================== * 三、状态变量 * ======================================================================== */ class="kw">unsigned long lastToggleTime = 0; // 记录「上一次切换亮灭状态」的时刻(开机以来的毫秒数) bool ledIsOn = false; // 记录 LED 当前是「亮」还是「灭」 /* ========================================================================== * 四、初始化函数 setup() * 特点:主板复位后只执行一次,用来完成所有「一次性」的准备工作。 * ======================================================================== */ void setup() { // 启动串口通信,波特率设为 115200(必须与串口监视器右下角的设置一致,否则会看到乱码) Serial.begin(115200); // 等待 200 毫秒,给 USB 转串口芯片(CH340/CP2102)留出枚举时间。 // 如果不等待,setup 里立刻打印的中文有可能变成乱码,这是新手最常见的「玄学问题」之一。 delay(200); // 把 LED 引脚配置为「输出」模式。ESP32 的引脚默认是「输入」, // 不写这一句的话 digitalWrite 不会有任何效果。 pinMode(LED_PIN, OUTPUT); // 设置 LED 初始状态为熄灭。注意这里是 LOW 而不是 HIGH,原因是板载 LED 低电平点亮。 digitalWrite(LED_PIN, LOW); Serial.println(); // 打印一个空行,让监视器排版更清爽 Serial.println(class="st">"[LED] 初始化完成,2 秒后开始闪烁"); // 打印中文日志(UTF-8 编码,正常显示) Serial.println(class="st">"[LED] 引脚 GPIO2 | 亮 500ms / 灭 500ms"); delay(2000); // 等待 2 秒,给初学者一点时间看到这行日志再开始闪 } /* ========================================================================== * 五、主循环函数 loop() * 特点:setup() 结束后会无限重复执行,是程序真正「干活」的地方。 * ======================================================================== */ void loop() { // millis() 返回「开机到此刻经过的毫秒数」,类型为 unsigned long。 // 用它做计时,可以避免 delay() 阻塞整个程序。 class="kw">unsigned long now = millis(); // 判断:距离上次切换是否已经过了足够时间? // 用 now - lastToggleTime 而不是直接比较,是因为 millis() 运行约 49 天后会溢出回 0, // 做减法能让溢出被自动处理,这是 Arduino 社区的通行写法。 class="kw">unsigned long currentDuration = ledIsOn ? ON_TIME_MS : OFF_TIME_MS; if (now - lastToggleTime >= currentDuration) { // 取反当前状态:亮 → 灭,灭 → 亮 ledIsOn = !ledIsOn; // 真正驱动硬件。由于板载 LED 是「低电平点亮」,所以: // ledIsOn 为 true(要亮)→ 输出 LOW // ledIsOn 为 false(要灭)→ 输出 HIGH digitalWrite(LED_PIN, ledIsOn ? LOW : HIGH); // 更新基准时刻,否则下一轮判断会立刻再次成立,造成疯狂闪烁 lastToggleTime = now; // 打印状态日志,方便和肉眼看到的灯做对照 Serial.print(class="st">"[LED] 当前状态:"); Serial.println(ledIsOn ? class="st">"ON(点亮)" : class="st">"OFF(熄灭)"); } }
每一章都建立在前一章的基础上,不跳步、不含糊。跟着敲一遍,你就能独立完成一个能联网、能蓝牙、能传感的完整物联网设备。
装好 Arduino IDE、装好 ESP32 开发板核心、认识你的第一块板子,然后让板载 LED 闪起来——确认你的工具链完全就绪。
变量、运算符、条件判断、循环、数组、函数——用跑马灯把语法全部跑一遍。这一章决定了你能不能读懂后面所有代码。
引脚模式、内部上拉、按键消抖、长按检测。搞懂 GPIO 就等于拿到了和真实世界对话的能力,也是所有后续章节的地基。
波特率、全双工、字符串缓冲、指令解析。串口是调试单片机最重要的窗口——学会它,你就学会了和芯片对话。
STA 与 AP 双模式、连接超时处理、HTTP 请求响应、自适应网页。让设备连上互联网,在手机浏览器里就能控制它。
GATT 服务与特征值、读写与通知回调、手机调试工具实操。不需要路由器,手机就是你的遥控器。
DHT11 采集 + OLED 显示 + WiFi 上报 + 超温告警。把前六章的能力全部拧成一个能真正用的桌面设备。
所有实战案例均使用 arduino-cli 与官方 ESP32 开发板核心实际编译,零错误零警告。代码不是「大概能跑」,而是已经跑通编译器验证的成品。
ch01_blink.ino
开发环境搭建与第一个程序 · 入门 · 必做
完整源码 98 行
ch02_marquee.ino
C/C++ 语言基础 · 基础 · 语言
完整源码 129 行
ch03_gpio.ino
GPIO 数字输入与输出 · 核心 · 外设
完整源码 160 行
ch04_uart.ino
串口通信 UART · 核心 · 通信
完整源码 187 行
ch05_wifi.ino
WiFi 联网与 Web 服务器 · 进阶 · 物联网
完整源码 206 行
ch06_ble.ino
蓝牙 BLE 手机控制 · 进阶 · 无线
完整源码 157 行
ch07_integrated.ino
综合项目:温湿度监测站 · 综合 · 毕业项目
完整源码 319 行
arduino-cli 1.5.1
开发板核心 esp32:esp32 3.3.10-cn
arduino-cli compile --fqbn esp32:esp32:esp32
每个章节都配了对应的视频资源。视频最大的价值是消除「这一步到底点哪里」的困惑——尤其环境配置和接线环节,强烈建议配合视频看一遍。
权威性最强、更新最快。查 API 用法、读引脚定义,遇到问题先来这里翻。
docs.espressif.com/projects/arduino-esp32
B 站 3.4 万播放。环境搭建 + WiFi 联网 + 按键 + 手机 App 远程控制,一条龙跟做。
bilibili.com/video/BV1HH4y1X7fb
专门讲「新手最容易卡住」的三件事:IDE 安装、驱动与串口识别、内核下载加速。
bilibili.com/video/BV1ihNq6LEzA
视频与 GitHub 代码仓库一一对应,每个例子都有可运行代码,边看边敲效率最高。
github.com/modi12jin/arduino-ESP32-Tutorial
近 2 小时英文长课。选型讲解 + Arduino 与 ESP-IDF 双环境搭建 + 完整示例。
youtube.com · Robert Feranec
全英文图文库,从 GPIO、ADC、PWM、FreeRTOS 到 MQTT、ESP-NOW 全覆盖,当查阅字典用。
microcontrollerslab.com · 150 ESP32 Tutorials
九成是 USB 驱动没装。CH340 芯片和 CP2102 芯片需要装各自的驱动,去芯片厂商官网下载。另外确认你用的是数据线不是纯充电线——只充电的线能点亮电源灯但连不上电脑。
先别怀疑焊点。ESP32 DevKit V1 的板载 LED 接在 GPIO2 上,是低电平点亮,很多人一上来习惯性写 HIGH 就以为坏了。教学代码里已经把这点写清楚了。
GPIO6~11 被内部 SPI Flash 占用,接了会烧板;GPIO34~39 只能输入不能输出;GPIO0/2/12/15 是启动模式引脚,接重负载可能让板子开不了机。教学案例只使用安全引脚。
delay() 会让整个程序暂停那段时间。按钮按下时程序不读其他引脚,WiFi 也停止响应。第 3 章用 millis() 做非阻塞计时,第 7 章定时采样都用了这个写法。
先确认路由器是 2.4GHz 频段(ESP32 不支持 5GHz)。再检查密码是否含特殊字符导致解析异常。教学代码内置 15 秒超时并自动降级为 AP 热点。
UNO 是 8 位 AVR,工作电压 5V;ESP32 是 32 位双核,带 WiFi 和蓝牙,工作电压 3.3V。关键差别:ESP32 的 GPIO 不能直接接 5V 信号,接了会烧。
安卓系统需要授予定位权限才能扫描 BLE,iOS 需在系统设置里允许蓝牙并保持 App 在前台。用 nRF Connect 这类通用调试工具先测一遍。
不需要。第 2 章会用跑马灯这个具体项目,把你需要的语法现场讲清楚再上手,零基础完全可以跟着做。