🛠 Wi-Fi + BLE 5 : mesurer la coexistence
Objetivos
El ESP32-C3 acumula Wi-Fi y Bluetooth 5 en un único núcleo y una sola radio de 2,4 GHz. Este tutorial mide la degradación real cuando ambos protocolos funcionan simultáneamente, y establece las reglas de ingeniería: intervalos de conexión BLE, tamaño de los paquetes, despertar del módem Wi-Fi. Aprenderá a dimensionar un producto mixto sin sorpresas desagradables.
Material
- 1 tarjeta ESP32-C3
- 1 router de 2,4 GHz y un servidor HTTP de prueba
- Smartphone con nRF Connect para la parte BLE
Código completo
#include <WiFi.h>
#include <HTTPClient.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
BLECharacteristic* cNotif;
void setup {
Serial.begin(115200);
BLEDevice::init("C3-COEX");
BLEServer* srv = BLEDevice::createServer;
BLEService* svc = srv->createService("180A");
cNotif = svc->createCharacteristic("2A19",
BLECharacteristic::PROPERTY_NOTIFY);
cNotif->addDescriptor(new BLE2902);
svc->start;
BLEDevice::getAdvertising->start;
WiFi.mode(WIFI_STA);
WiFi.begin("MON_SSID", "MA_CLE");
while (WiFi.status != WL_CONNECTED) { delay(300); Serial.print('.'); }
Serial.println;
}
void loop {
uint32_t t0 = millis;
HTTPClient http;
http.begin("http://exemple.local/test-1mo.bin");
int code = http.GET;
int32_t octets = http.getSize;
http.end;
uint8_t v = (uint8_t)(millis / 1000);
cNotif->setValue(&v, 1);
cNotif->notify;
Serial.printf("HTTP %d, %d o en %lu ms + notify BLE\n",
code, octets, millis - t0);
delay(3000);
}
Verificación esperada
Ambos protocolos funcionan simultáneamente, pero el tiempo de transferencia HTTP aumenta notablemente en cuanto BLE está activo (publicidad y luego notificaciones). Al desactivar la publicidad BLE, la misma transferencia vuelve a ser rápida: la penalización proviene efectivamente de la compartición de la única radio, no del núcleo.
Errores frecuentes
- Creer que un segundo núcleo amortigua el coste: el C3 es de un solo núcleo, la coexistencia es puramente temporal en la radio.
- Notificaciones BLE cada 10 ms durante un flujo Wi-Fi: los eventos BLE prioritarios reducen el ancho de banda; espaciar o agrupar los datos.
- Olvidar el modo modem-sleep de Wi-Fi (WiFi.setSleep(true)) en un producto alimentado por batería.
- Canales Wi-Fi 12-14 que se solapan con los canales de publicidad BLE 37-38: preferir los canales Wi-Fi 1 a 11 y dejar libres los canales de publicidad BLE.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht22.inoArduinooled-i2c.inoArduinoserveur-web.inoArduino