Este es el esquema de la placa que envia el mensaje a traves de un pulsador:
Este es el esquema de la placa que recibe el mensaje y enciende el led:
Este es el código de la placa que envía el mensaje:
#include <Arduino.h>
#include <WiFi.h>
#include <esp_now.h>
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
const int pulsador = 12;
// Structure example to receive data
typedef struct struct_message
{
int a;
} struct_message;
// Create a struct_message called myData
struct_message myDataSen;
esp_now_peer_info_t peerInfo;
// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status)
{
}
void IRAM_ATTR pulsa()
{
if (digitalRead(pulsador) == HIGH)
{
myDataSen.a = 2;
// Send message via ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&myDataSen, sizeof(myDataSen));
}
}
void setup()
{
// Initialize Serial Monitor
Serial.begin(9600);
pinMode(pulsador, INPUT_PULLDOWN);
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);
// Init ESP-NOW
if (esp_now_init() != ESP_OK)
{
Serial.println("Error initializing ESP-NOW");
return;
}
// Once ESPNow is successfully Init, we will register for Send CB to get the status of Trasnmitted packet
esp_now_register_send_cb(OnDataSent);
// Register peer. Este apartado del peer es utilizado para el envio del paquete
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
// Add peer
if (esp_now_add_peer(&peerInfo) != ESP_OK)
{
Serial.println("Failed to add peer");
return;
}
attachInterrupt(pulsador, pulsa, RISING);
}
void loop()
{
}
Y este es el código de la placa que recibe el mensaje:
#include <Arduino.h>
#include <WiFi.h>
#include <esp_now.h>
const int led = 14;
int estadoLed = 0;
// Structure example to send data
// Must match the receiver structure
typedef struct struct_message
{
int a;
} struct_message;
// Create a struct_message called myData
struct_message myDataRec;
// callback function that will be executed when data is received
void OnDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len)
{
memcpy(&myDataRec, incomingData, sizeof(myDataRec));
if (myDataRec.a == 2)
{
if (estadoLed == 0)
{
digitalWrite(led, HIGH);
estadoLed = 1;
}
else
{
digitalWrite(led, LOW);
estadoLed = 0;
}
}
}
void setup()
{
// Init Serial Monitor
Serial.begin(9600);
pinMode(led, OUTPUT);
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);
// Init ESP-NOW
if (esp_now_init() != ESP_OK)
{
Serial.println("Error initializing ESP-NOW");
return;
}
// Once ESPNow is successfully Init, we will register for recv CB to get recv packer info
esp_now_register_recv_cb(OnDataRecv);
}
void loop()
{
}
El video con una pequeña descripción se puede encontrar en:
Buenas, tengo 2 esp32, ambas conectadas mediante el usb del PC. Estoy intentando realizar el mismo código pero en comunicación bidireccional ya que unidireccional me da error no entiendo por que. Pero al subir ambos codigos, el estado de mi pulsador no cambia, sabrías por que puede ser? Gracias
hola Juan Carlos, si no tienes ningun mensaje de error, lo que me ayuda a mi para identificar algun fallo es hacer un «Serial.println» en la parte del codigo donde deberia de cambiar el estado del pulsador, de esa manera podras ir eliminando posibles errores. Por ejemplo donde quieras saber el valor del dato que recibes, puedes escribir «Serial.println(myDataRec.a)» y ver por terminal el valor que imprime. Espero ayude de algo.
Un saludo.
excelente… basico, sencillo y comprensible….
Saludos! prove el codigo en ambas placas y todo funciona bien, pero en distancia corta de menos de 35mts , que puedo hacer para ampliar esta distancia de comunicacion entre los esp32 que estoy utilizando. de ante manos muchas gracias.
Hola Franklin, antes de nada gracias por el comentario. Me alegro que todo te haya funcionado bien :). Con respecto a la distacia entre placas, ten en cuenta que depende del medio donde transmiten, si son espacios abiertos o hay paredes de por medio, etc. De todas formas si quieres algo un poco mas potente en alcance puedes ver la siguiente pagina de espressif con antena externa, igual ya lo habias visto pero te dejo el enlace de todas formas por si quieres echarle un ojo, si le das al carrito de la compra al lado de cada modelo te dice donde lo puedes comprar:
https://www.espressif.com/en/products/modules
También te dejo un modelo que he visto de bison-science que parece interesante para largo alcance con wifi:
https://www.crowdsupply.com/bison-science/esp32-m1-reach-out
Y te dejo un enlace a cnx-software que tienen un articulo muy completo donde hablan de esta placa:
https://www.cnx-software.es/2021/03/29/la-placa-de-wi-fi-esp32-de-largo-alcance-promete-un-alcance-de-hasta-1-2-km/
Espero sea de ayuda, cualquier cosa no dudes en preguntar.
Un saludo.