Contenidos

Después de pelear con la tasa de éxito, hemos decidido darle la vuelta a la tortilla. En este escenario, el Wemos D1 Mini toma el mando como emisor, enviando un saludo junto a un número aleatorio (0-100) para verificar que no hay paquetes duplicados o «congelados».
📍 La Configuración
- Emisor: Wemos D1 Mini (Genera el número y envía).
- Receptor: ESP32-C3 Supermini (Recibe y muestra en Monitor Serie + OLED).
- MAC Destino.
1. Código del Emisor (Wemos D1 Mini)
Este código genera un número aleatorio real en cada ciclo y lo envía por ESP-NOW.
#include <ESP8266WiFi.h>
#include <espnow.h>
// MAC del ESP32-C3 configurada
uint8_t broadcastAddress[] = {0xE8, 0x3D, 0xC1, 0x93, 0xD3, 0xCC};
typedef struct struct_message {
char msg[32];
int id;
int aleatorio; // Nuevo campo para el reto
} struct_message;
struct_message myData;
void OnDataSent(uint8_t *mac_addr, uint8_t status) {
Serial.printf("Envío ID %d [Num: %d] -> %s\n",
myData.id, myData.aleatorio, status == 0 ? "OK" : "FALLO");
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.disconnect();
if (esp_now_init() != 0) return;
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
esp_now_register_send_cb(OnDataSent);
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
// Semilla para el número aleatorio
randomSeed(analogRead(0));
}
void loop() {
static int contador = 0;
myData.id = contador++;
myData.aleatorio = random(0, 101); // Genera 0 a 100
strcpy(myData.msg, "Hola");
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
delay(2000);
}
2. Código del Receptor (ESP32-C3 + OLED)
El «cerebro» que procesa el dato y lo muestra en su pantalla integrada.
#include <Arduino.h>
#include <esp_now.h>
#include <WiFi.h>
#include <U8g2lib.h>
#include <esp_wifi.h>
// OLED C3 Supermini
U8G2_SSD1306_72X40_ER_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, 6, 5);
typedef struct struct_message {
char msg[32];
int id;
int aleatorio;
} struct_message;
struct_message incomingRead;
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&incomingRead, incomingData, sizeof(incomingRead));
// Salida por Consola
Serial.printf("RECIBIDO: %s %d (ID: %d)\n",
incomingRead.msg, incomingRead.aleatorio, incomingRead.id);
// Salida por OLED
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tf);
u8g2.setCursor(0, 12);
u8g2.printf("MSG: %s", incomingRead.msg);
u8g2.setCursor(0, 26);
u8g2.printf("NUM: %d", incomingRead.aleatorio);
u8g2.setCursor(0, 39);
u8g2.printf("ID Total: %d", incomingRead.id);
u8g2.sendBuffer();
}
void setup() {
Serial.begin(115200);
u8g2.begin();
WiFi.mode(WIFI_STA);
esp_wifi_set_ps(WIFI_PS_NONE); // Potencia máxima
if (esp_now_init() != ESP_OK) return;
esp_now_register_recv_cb(OnDataRecv);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tf);
u8g2.drawStr(0, 25, "Listo...");
u8g2.sendBuffer();
}
void loop() {}
📊 Lo que verás en las pantallas
- En la terminal del Wemos: «Envío ID 1 [Num: 42] -> OK».
- En la terminal del C3: «RECIBIDO: Hola 42 (ID: 1)».
- En el OLED del C3: Un diseño limpio mostrando el mensaje «Hola» y el número aleatorio cambiando cada 2 segundos.

