ESP32 物联网开发:WiFi 与蓝牙实战
为什么选择 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 项目吧! ...