为什么选择 ESP32?
ESP32 是乐鑫推出的高性能低功耗微控制器,集成了 WiFi 和蓝牙功能,是物联网开发的理想选择。
ESP32 核心特性
| 特性 | 参数 |
|---|---|
| CPU | 双核 Xtensa LX6,240MHz |
| 内存 | 520KB SRAM |
| Flash | 4MB-16MB |
| WiFi | 802.11 b/g/n,Station/AP 模式 |
| 蓝牙 | Bluetooth 4.2 BR/EDR + BLE |
| GPIO | 34 个可编程 GPIO |
| 外设 | ADC、DAC、SPI、I2C、UART |
| 功耗 | 深度睡眠 10μA |
开发环境搭建
Arduino IDE 方式
// 1. 添加 ESP32 板卡支持
// 文件 -> 首选项 -> 附加开发板管理器 URL
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
// 2. 安装 ESP32 包
// 工具 -> 开发板 -> 开发板管理器 -> 搜索 ESP32 -> 安装
// 3. 选择开发板
// 工具 -> 开发板 -> ESP32 Arduino -> DOIT ESP32 DEVKIT V1
PlatformIO 方式
; platformio.ini
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
WiFi 连接
Station 模式(客户端)
#include <WiFi.h>
const char* ssid = "YourWiFi";
const char* password = "YourPassword";
void setup() {
Serial.begin(115200);
// 连接 WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// 检查连接状态
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi disconnected!");
WiFi.reconnect();
}
delay(1000);
}
AP 模式(热点)
#include <WiFi.h>
void setup() {
// 创建热点
WiFi.softAP("ESP32_Hotspot", "password123");
Serial.print("AP IP Address: ");
Serial.println(WiFi.softAPIP());
}
HTTP 请求
GET 请求
#include <WiFi.h>
#include <HTTPClient.h>
void httpGetRequest() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("http://api.example.com/data");
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
Serial.println(payload);
}
http.end();
}
}
POST 请求
void httpPostRequest() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("http://api.example.com/submit");
http.addHeader("Content-Type", "application/json");
String jsonData = "{\"temperature\": 25.5, \"humidity\": 60}";
int httpCode = http.POST(jsonData);
Serial.println(http.getString());
http.end();
}
}
蓝牙 BLE 通信
BLE 服务器
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
// BLE UUID
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();
Serial.print("Received: ");
Serial.println(value.c_str());
}
};
void setup() {
Serial.begin(115200);
// 创建 BLE 设备
BLEDevice::init("ESP32_BLE_Server");
// 创建服务
pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
// 创建特征
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic->addDescriptor(new BLE2902());
pCharacteristic->setCallbacks(new MyCallbacks());
// 启动服务
pService->start();
// 开始广播
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->start();
Serial.println("BLE Server started!");
}
void loop() {
// 发送通知
static uint32_t counter = 0;
char data[32];
sprintf(data, "Counter: %lu", counter++);
pCharacteristic->setValue(data);
pCharacteristic->notify();
delay(1000);
}
BLE 客户端
#include <BLEDevice.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
Serial.printf("Found Device: %s\n",
advertisedDevice.toString().c_str());
}
};
void setup() {
BLEDevice::init("");
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setInterval(1349);
pBLEScan->setWindow(449);
pBLEScan->setActiveScan(true);
BLEScanResults foundDevices = pBLEScan->start(5, false);
Serial.printf("Found %d devices\n", foundDevices.getCount());
}
低功耗设计
睡眠模式
// 深度睡眠(10μA)
void enterDeepSleep(uint64_t sleepTimeUs) {
// 配置唤醒源(例如 GPIO)
esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 1);
// 进入深度睡眠
esp_deep_sleep(sleepTimeUs);
}
// 轻睡眠(~1mA)
void enterLightSleep() {
esp_sleep_enable_timer_wakeup(1000000); // 1 秒
esp_light_sleep_start();
}
// 唤醒后检查原因
esp_sleep_wakeup_cause_t wakeupReason = esp_sleep_get_wakeup_cause();
实际项目:智能温湿度计
#include <WiFi.h>
#include <HTTPClient.h>
#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const char* ssid = "YourWiFi";
const char* password = "YourPassword";
const char* serverUrl = "http://api.example.com/sensor";
void setup() {
Serial.begin(115200);
dht.begin();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
void loop() {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverUrl);
http.addHeader("Content-Type", "application/json");
String jsonData = String("{\"temp\":") + temp +
",\"hum\":" + hum + "}";
http.POST(jsonData);
http.end();
}
// 深度睡眠 10 分钟
esp_deep_sleep(600000000);
}
结语
ESP32 是物联网开发的强大工具。通过本教程,你掌握了 WiFi 连接、HTTP 通信、BLE 和低功耗设计。动手做一个 IoT 项目吧!
参考资料:ESP32 技术参考手册、乐鑫官方文档、Arduino ESP32 库