Wemos (Emisor) -> ESP32-C3 OLED (Receptor)

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

  1. En la terminal del Wemos: «Envío ID 1 [Num: 42] -> OK».
  2. En la terminal del C3: «RECIBIDO: Hola 42 (ID: 1)».
  3. En el OLED del C3: Un diseño limpio mostrando el mensaje «Hola» y el número aleatorio cambiando cada 2 segundos.