You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过代码实现ESP32/ESP8266被其他ESP设备远程唤醒?

通过ESP32/ESP8266跨设备唤醒的实现方案

可以实现控制器ESP发送信号唤醒指定从设备的需求,以下基于你提到的ESP-NOW和蓝牙两种协议,给出具体实现方案:

ESP-NOW 唤醒方案

ESP-NOW基于Wi-Fi直连,支持低功耗模式下的唤醒,适合电池管理系统的低功耗场景。

从设备(被唤醒端)配置

从设备进入深度睡眠(ESP32)或轻睡眠(ESP8266),监听ESP-NOW数据包触发唤醒:

#include <esp_now.h>
#include <WiFi.h>

// 替换为控制器的MAC地址
uint8_t controllerMac[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB};

// 接收ESP-NOW数据的回调函数
void onDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len) {
  Serial.println("已被ESP-NOW唤醒");
  // 这里添加唤醒后需要执行的电池管理任务
  // 任务完成后再次进入睡眠
  esp_deep_sleep_start();
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);

  // 初始化ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("ESP-NOW初始化失败");
    return;
  }
  esp_now_register_recv_cb(onDataRecv);

  // 配置ESP-NOW为深度睡眠唤醒源(仅ESP32支持)
  esp_sleep_enable_esp_wakeup();

  Serial.println("进入深度睡眠,等待唤醒...");
  esp_deep_sleep_start();
}

void loop() {}

注:ESP8266不支持深度睡眠下的Wi-Fi唤醒,需将esp_deep_sleep_start()替换为esp_light_sleep_start(),并确保Wi-Fi保持监听状态。

控制器(唤醒端)配置

控制器通过ESP-NOW向指定从设备发送唤醒信号:

#include <esp_now.h>
#include <WiFi.h>

// 替换为目标从设备的MAC地址
uint8_t slaveMac[] = {0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78};

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);

  if (esp_now_init() != ESP_OK) {
    Serial.println("ESP-NOW初始化失败");
    return;
  }

  // 添加从设备为通信节点
  esp_now_peer_info_t peerInfo;
  memcpy(peerInfo.peer_addr, slaveMac, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;
  if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("添加从设备节点失败");
    return;
  }
}

void loop() {
  // 发送唤醒信号(任意数据均可触发从设备接收回调)
  uint8_t wakeSignal[] = "WAKE";
  esp_err_t result = esp_now_send(slaveMac, wakeSignal, sizeof(wakeSignal));
  
  if (result == ESP_OK) {
    Serial.println("唤醒信号发送成功");
  } else {
    Serial.println("唤醒信号发送失败");
  }
  delay(5000); // 按需调整唤醒间隔
}

蓝牙唤醒方案

优先使用BLE(低功耗蓝牙),适合短距离、低功耗的唤醒场景,仅ESP32支持BLE,ESP8266仅支持经典蓝牙(功耗较高)。

从设备(BLE从机)配置

从设备进入深度睡眠,监听BLE连接请求触发唤醒:

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

bool deviceConnected = false;

class MyServerCallbacks: public BLEServerCallbacks {
  void onConnect(BLEServer* pServer) {
    deviceConnected = true;
    Serial.println("已被BLE连接唤醒");
    // 执行电池管理任务
  }
  void onDisconnect(BLEServer* pServer) {
    deviceConnected = false;
    // 任务完成后再次进入睡眠
    esp_deep_sleep_start();
  }
};

void setup() {
  Serial.begin(115200);
  BLEDevice::init("BMS_Slave");

  BLEServer *pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  BLEService *pService = pServer->createService(SERVICE_UUID);
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE
                                       );
  pCharacteristic->addDescriptor(new BLE2902());
  pService->start();

  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->start();

  // 配置BLE为深度睡眠唤醒源
  esp_sleep_enable_ble_wakeup();

  Serial.println("进入深度睡眠,等待BLE唤醒...");
  esp_deep_sleep_start();
}

void loop() {}

控制器(BLE主机)配置

控制器主动连接从设备触发唤醒:

#include <BLEDevice.h>
#include <BLEClient.h>

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

void setup() {
  Serial.begin(115200);
  BLEDevice::init("BMS_Controller");
}

void loop() {
  BLEClient* pClient = BLEDevice::createClient();
  // 可替换为从设备的MAC地址:BLEAddress("AA:BB:CC:DD:EE:FF")
  if (pClient->connect("BMS_Slave")) {
    Serial.println("连接成功,已唤醒从设备");
    // 可选:写入特征值触发特定任务
    BLEService* pService = pClient->getService(SERVICE_UUID);
    if (pService) {
      BLECharacteristic* pChar = pService->getCharacteristic(CHARACTERISTIC_UUID);
      if (pChar) pChar->writeValue("TASK_TRIGGER");
    }
    delay(1000);
    pClient->disconnect();
  } else {
    Serial.println("连接从设备失败");
  }
  delay(5000);
}

优化建议

  • 电池管理系统优先选择ESP-NOW:延迟更低、功耗优于蓝牙,且支持多设备组网精准唤醒。
  • 为每个从设备分配唯一MAC地址,控制器通过指定MAC发送信号,实现定向唤醒。
  • 测试睡眠电流:ESP32深度睡眠+ESP-NOW监听电流约几十微安,符合低功耗电池管理需求。

内容的提问来源于stack exchange,提问作者youcef GUENFAF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:34:52