Contenidos

En este tutorial, resolveremos uno de los retos más comunes: la comunicación directa entre diferentes generaciones de chips de Espressif sin usar un router WiFi. Veremos cómo configurar el ESP32-S3 como Emisor y el Wemos D1 (ESP8266) como Receptor.
1. El Reto del ESP32-S3 en macOS
Si usas PlatformIO en Mac, es posible que encuentres errores de archivos .elf faltantes al compilar para el S3. Para solucionarlo, asegúrate de que tu platformio.ini apunte manualmente al bootloader y defina correctamente las particiones.
2. Configuración del Proyecto (PlatformIO)
Para el Emisor (ESP32-S3):
El archivo platformio.ini debe verse así para evitar errores de compilación:
Ini, TOML
[env:esp32-s3-devkitc-1]
platform = [email protected]
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
; Fix para archivos faltantes en macOS
board_build.bootloader_bin = bootloader_fix/bootloader_dio_40m.elf
board_build.partitions = partitions.csv
build_flags =
-D ARDUINO_USB_MODE=1
-D ARDUINO_USB_CDC_ON_BOOT=1
3. Código del Emisor (ESP32-S3)
Este código inicializa ESP-NOW, registra la dirección MAC del receptor y envía un paquete de datos cada 2 segundos.
C++
#include <Arduino.h>
#include <esp_now.h>
#include <WiFi.h>
// MAC de tu receptor (Wemos D1)
uint8_t broadcastAddress[] = {0x5C, 0xCF, 0x7F, 0x6A, 0xA3, 0x69};
typedef struct struct_message {
char msg[32];
int id;
} struct_message;
struct_message myData;
esp_now_peer_info_t peerInfo;
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.print("\r\nStatus: ");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Envío OK" : "Fallo");
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) return;
esp_now_register_send_cb(OnDataSent);
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
esp_now_add_peer(&peerInfo);
}
void loop() {
static int contador = 0;
myData.id = contador++;
strcpy(myData.msg, "Hola Wemos!");
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
delay(2000);
}
4. Código del Receptor (Wemos D1 Mini)
El ESP8266 utiliza una librería ligeramente distinta (espnow.h). Es vital definir el rol como SLAVE para que escuche correctamente.
C++
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <espnow.h>
typedef struct struct_message {
char msg[32];
int id;
} struct_message;
struct_message myData;
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("RECIBIDO: ");
Serial.println(myData.msg);
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
if (espnow_init() != 0) return;
espnow_set_self_role(ESP_NOW_ROLE_SLAVE);
espnow_register_recv_cb(OnDataRecv);
}
void loop() {}
5. Resultado Final
Al abrir ambos monitores seriales, verás la confirmación del envío en el ESP32-S3 y la recepción inmediata del mensaje en el Wemos D1. ¡Comunicación de baja latencia sin necesidad de infraestructura!

