为什么选择 ESP32?

ESP32 是乐鑫推出的高性能低功耗微控制器,集成了 WiFi 和蓝牙功能,是物联网开发的理想选择。

ESP32 核心特性

特性参数
CPU双核 Xtensa LX6,240MHz
内存520KB SRAM
Flash4MB-16MB
WiFi802.11 b/g/n,Station/AP 模式
蓝牙Bluetooth 4.2 BR/EDR + BLE
GPIO34 个可编程 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 库