ESP32 × ARDUINO IDE · 零基础 → 精通

从点亮第一颗 LED,
到独立做出联网设备

从开发环境搭建、C/C++ 语言基础讲起,逐步过渡到 GPIO、串口、WiFi 与蓝牙。每个知识点配一个完整可运行的实战案例,代码逐行注释,元器件作用与接线引脚一一对应。

7章系统课程
7个完整实战案例
100%代码经编译器验证
逐行关键语句中文注释
ch01_blink.ino编译通过
/*
 * ============================================================================
 * 第 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(熄灭)");
  }
}
完整源码 98 行 · ch01_blink/ch01_blink.inoarduino-cli 编译通过
// LEARNING PATH

一条从零到精通的完整路径

每一章都建立在前一章的基础上,不跳步、不含糊。跟着敲一遍,你就能独立完成一个能联网、能蓝牙、能传感的完整物联网设备。

01
入门 · 必做

开发环境搭建与第一个程序

装好 Arduino IDE、装好 ESP32 开发板核心、认识你的第一块板子,然后让板载 LED 闪起来——确认你的工具链完全就绪。

IDE 与开发板核心安装串口监视器与上传原理案例 01-1:LED 闪烁
硬件:开发板 + USB 数据线

进入本章

02
基础 · 语言

C/C++ 语言基础

变量、运算符、条件判断、循环、数组、函数——用跑马灯把语法全部跑一遍。这一章决定了你能不能读懂后面所有代码。

数据类型与运算符数组与函数封装案例 02-1:8 路跑马灯
硬件:LED ×8 + 220Ω 电阻 ×8

进入本章

03
核心 · 外设

GPIO 数字输入与输出

引脚模式、内部上拉、按键消抖、长按检测。搞懂 GPIO 就等于拿到了和真实世界对话的能力,也是所有后续章节的地基。

INPUT_PULLUP 与引脚模式按键消抖与长按判定案例 03-1:按键 + 蜂鸣器
硬件:按键 + LED + 有源蜂鸣器

进入本章

04
核心 · 通信

串口通信 UART

波特率、全双工、字符串缓冲、指令解析。串口是调试单片机最重要的窗口——学会它,你就学会了和芯片对话。

UART 收发原理与波特率行结束符与指令解析案例 04-1:串口指令控制
硬件:开发板 + USB 数据线

进入本章

05
进阶 · 物联网

WiFi 联网与 Web 服务器

STA 与 AP 双模式、连接超时处理、HTTP 请求响应、自适应网页。让设备连上互联网,在手机浏览器里就能控制它。

STA / AP 模式与降级策略HTTP 路由与状态回传案例 05-1:迷你 HTTP 控制台
硬件:开发板 + LED(仅需 2 根线)

进入本章

06
进阶 · 无线

蓝牙 BLE 手机控制

GATT 服务与特征值、读写与通知回调、手机调试工具实操。不需要路由器,手机就是你的遥控器。

BLE 广播与 GATT 模型特征值读写与通知回调案例 06-1:BLE 手机控灯
硬件:开发板 + 手机(装调试 App)

进入本章

07
综合 · 毕业项目

综合项目:温湿度监测站

DHT11 采集 + OLED 显示 + WiFi 上报 + 超温告警。把前六章的能力全部拧成一个能真正用的桌面设备。

DHT11 传感器原理与采样I2C 总线与 OLED 显示案例 07-1:监测站 + JSON 接口
硬件:DHT11 + OLED + 蜂鸣器

进入本章

01GPIO 采集
02C/C++ 语法
03按键输入
04串口日志
05WiFi 联网
06I2C 显示
// VERIFIED CODE

每个案例都真的编译过

所有实战案例均使用 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

// VIDEO RESOURCES

文字看不明白时,换个脑子看视频

每个章节都配了对应的视频资源。视频最大的价值是消除「这一步到底点哪里」的困惑——尤其环境配置和接线环节,强烈建议配合视频看一遍。

乐鑫官方 Arduino ESP32 文档

权威性最强、更新最快。查 API 用法、读引脚定义,遇到问题先来这里翻。

全章节适用 · 查阅型

docs.espressif.com/projects/arduino-esp32

打开资源

ESP32-S3 沉浸式开发教程

B 站 3.4 万播放。环境搭建 + WiFi 联网 + 按键 + 手机 App 远程控制,一条龙跟做。

第 1 章 · 第 5 章

bilibili.com/video/BV1HH4y1X7fb

打开资源

零废话 ESP32 烧录全套教程

专门讲「新手最容易卡住」的三件事:IDE 安装、驱动与串口识别、内核下载加速。

第 1 章 · 必看

bilibili.com/video/BV1ihNq6LEzA

打开资源

Arduino ESP32 系列教程

视频与 GitHub 代码仓库一一对应,每个例子都有可运行代码,边看边敲效率最高。

第 2 章 · 第 6 章

github.com/modi12jin/arduino-ESP32-Tutorial

打开资源

ESP32 for Beginners 全流程

近 2 小时英文长课。选型讲解 + Arduino 与 ESP-IDF 双环境搭建 + 完整示例。

第 1 章 · 选型参考

youtube.com · Robert Feranec

打开资源

150+ ESP32 教程与项目库

全英文图文库,从 GPIO、ADC、PWM、FreeRTOS 到 MQTT、ESP-NOW 全覆盖,当查阅字典用。

全章节 · 拓展参考

microcontrollerslab.com · 150 ESP32 Tutorials

打开资源

// FAQ

新手最常问的八个问题

Q1 电脑找不到 COM 口,上传一直失败?

九成是 USB 驱动没装。CH340 芯片和 CP2102 芯片需要装各自的驱动,去芯片厂商官网下载。另外确认你用的是数据线不是纯充电线——只充电的线能点亮电源灯但连不上电脑。

Q2 板载 LED 不亮,是我焊错了吗?

先别怀疑焊点。ESP32 DevKit V1 的板载 LED 接在 GPIO2 上,是低电平点亮,很多人一上来习惯性写 HIGH 就以为坏了。教学代码里已经把这点写清楚了。

Q3 哪些引脚绝对不能接东西?

GPIO6~11 被内部 SPI Flash 占用,接了会烧板;GPIO34~39 只能输入不能输出;GPIO0/2/12/15 是启动模式引脚,接重负载可能让板子开不了机。教学案例只使用安全引脚。

Q4 为什么强调不要用 delay()?

delay() 会让整个程序暂停那段时间。按钮按下时程序不读其他引脚,WiFi 也停止响应。第 3 章用 millis() 做非阻塞计时,第 7 章定时采样都用了这个写法。

Q5 WiFi 一直连不上怎么办?

先确认路由器是 2.4GHz 频段(ESP32 不支持 5GHz)。再检查密码是否含特殊字符导致解析异常。教学代码内置 15 秒超时并自动降级为 AP 热点。

Q6 ESP32 和 Arduino UNO 有什么不一样?

UNO 是 8 位 AVR,工作电压 5V;ESP32 是 32 位双核,带 WiFi 和蓝牙,工作电压 3.3V。关键差别:ESP32 的 GPIO 不能直接接 5V 信号,接了会烧。

Q7 手机扫不到 BLE 设备?

安卓系统需要授予定位权限才能扫描 BLE,iOS 需在系统设置里允许蓝牙并保持 App 在前台。用 nRF Connect 这类通用调试工具先测一遍。

Q8 我需要先学完 C 语言吗?

不需要。第 2 章会用跑马灯这个具体项目,把你需要的语法现场讲清楚再上手,零基础完全可以跟着做。

你的第一个物联网作品,就从今晚开始

7 章、7 个已验证的完整案例,从点灯开始,到做出一个能联网、能蓝牙、能采集温湿度的桌面设备。一块开发板、一根数据线,今天晚上就能跑起来。