ESP32 入门:WiFi、蓝牙与 Arduino 开发实战
👁 9 阅读 · 2026-08-14 · ESP32 WiFi
ESP32 凭借双核处理、内置 WiFi 与蓝牙模块,成为物联网开发的明星芯片。本文面向有嵌入式基础的开发者,详解如何在 Arduino IDE 下配置 ESP32 开发环境,深入解析 WiFi 的 AP/STA 工作模式、经典蓝牙与 BLE 的编程要点,并给出可直接运行的代码示例与工程注意事项,助你快速从零构建无线应用。
## 1. ESP32 与 Arduino 开发环境
ESP32 集成了双核 Tensilica LX6 处理器(主频可达 240MHz)、WiFi 802.11 b/g/n、双模蓝牙(经典 + BLE)以及丰富的外设接口。使用 Arduino 框架可以大幅降低开发门槛,但底层仍是 FreeRTOS 实时的多线程调度。
**Arduino Core 安装步骤**
- 打开 Arduino IDE,进入“文件 -> 首选项”,在“附加开发板管理器网址”中添加:`https://espressif.github.io/arduino-esp32/package_esp32_index.json`
- 打开“工具 -> 开发板 -> 开发板管理器”,搜索“esp32”,安装最新版(建议 2.x 以上)。
- 选择开发板型号(如 ESP32 Dev Module),确认 USB 驱动(CP2102/CH340)已安装。
## 2. WiFi 功能详解
ESP32 的 WiFi 支持三种模式:STA(站)、AP(热点)、AP+STA 共存。所有功能基于 `WiFi.h` 库,核心初始化流程为:
```c
#include
const char* ssid = "YourSSID";
const char* password = "YourPassword";
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected! IP: " + WiFi.localIP().toString());
}
void loop() {
// 周期检查连接状态,若断开则重连
if (WiFi.status() != WL_CONNECTED) {
WiFi.reconnect();
}
delay(10000);
}
```
**扫描与热点创建**
- 扫描:`WiFi.scanNetworks()` 返回可见 AP 数量,之后用 `WiFi.SSID(i)` 和 `WiFi.RSSI(i)` 获取信息。
- 开启热点:
```c
WiFi.mode(WIFI_AP);
WiFi.softAP("ESP32_AP", "12345678", 1, 0); // 1为通道号,0为隐藏
Serial.println(WiFi.softAPIP());
```
注意:ESP32 的 WiFi 仅支持 2.4GHz,且天线增益有限,长距离传输需外置功放或采用 ESP32-PICO 系列。
## 3. 蓝牙功能详解
ESP32 同时支持经典蓝牙(BR/EDR)和低功耗蓝牙(BLE)。经典蓝牙适合串口透传,而 BLE 适合低功耗传感器/手机交互。
### 3.1 经典蓝牙串口透传
使用 `BluetoothSerial` 库即可快速将 UART 数据转换为蓝牙无线串口:
```c
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32_Bluetooth"); // 设备名称
Serial.println("Bluetooth started, pair with your phone!");
}
void loop() {
if (SerialBT.available()) {
char c = SerialBT.read();
Serial.write(c); // 转发到硬件串口
}
if (Serial.available()) {
SerialBT.write(Serial.read());
}
delay(1);
}
```
### 3.2 BLE 服务与特征值
使用 `BLEDevice` 库,核心概念:GATT Server 中包含 Service,Service 中包含 Characteristic。创建一个可读可写的 BLE 服务:
```c
#include
#include
#include
#include
BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer* server) { deviceConnected = true; };
void onDisconnect(BLEServer* server) { deviceConnected = false; };
};
class MyCharCallbacks : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pChar) {
std::string value = pChar->getValue();
if (value.length() > 0) {
Serial.print("Received: ");
Serial.println(value.c_str());
}
}
};
void setupBLE(const char* deviceName) {
BLEDevice::init(deviceName);
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService("4fafc201-1fb5-459e-8fcc-c5c9c331914b");
pCharacteristic = pService->createCharacteristic(
"beb5483e-36e1-4688-b7f5-ea07361b26a8",
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->setCallbacks(new MyCharCallbacks());
pCharacteristic->setValue("Hello from ESP32");
pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(pService->getUUID());
BLEDevice::startAdvertising();
}
```
## 4. 综合示例:WiFi + BLE 共存
由于 WiFi 与蓝牙共享同一个射频前端,双模同时运行时需注意:
- 硬件上可共存,但蓝牙速率会下降,尤其是 BLE 广播间隔需增大。
- 在 `setup()` 中先初始化 WiFi,再初始化 BLE,避免射频初始化冲突。
```c
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin("MySSID", "Password");
while (WiFi.status() != WL_CONNECTED) delay(100);
setupBLE("ESP32_BLE");
Serial.println("WiFi + BLE 运行中");
}
```
## 5. 注意事项与常见坑
- **电源电流**:ESP32 开启 WiFi 时峰值电流可达 500mA,务必使用 3.3V LDO(如 AMS1117)或 5V 供电,并加 10~100uF 去耦电容。
- **GPIO 限制**:GPIO 0、2、12、15 有上拉/下拉或 JTAG 功能,避免用于高速信号;GPIO 36~39 仅输入。
- **Flash 分区**:若 OTA 或存储需求大,使用 `tools/partitions` 中的自定义 CSV 分区表。
- **FreeRTOS**:Arduino 的 `loop()` 运行在 core 0 的 low-priority task 中,耗时的 WiFi/BLE 操作不要阻塞过长,建议使用 `xTaskCreatePinnedToCore()` 分配任务。
- **频段合规**:不同国家/地区的 WiFi 信道和蓝牙功率有法规限制,量产需进行认证(如 FCC/CE)。
ESP32 强大的无线能力配合 Arduino 的易用性,能让你快速将创意原型落地。深入理解透 WiFi 协议栈和 BLE 的 GATT 结构,是实现复杂物联网应用的关键。