found an example ESP-NOW code which may help
NOTE: ESP-NOW has changed from ESP32 core 2.x to 3.x - see
https://docs.espressif.com/projects/esp ... p_now.html
you may find some of the example code online is using ESP32 core V2
ESP-NOW transmitter works using a ESP32-C3-MINI-1 IDE 2.3.5 ESP32 core 3.3.0
Code: Select all
// ESP32 Transmitter - two way communication using ESP_NOW
// NOTE: updated to use ESP32 core V3.x
// note- no sensors so test data structure transmitted
// original code from
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp-now-two-way-communication-esp32/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <esp_now.h>
#include <WiFi.h>
//#include <Wire.h>
//#include <Adafruit_Sensor.h>
//#include <Adafruit_BME280.h>
//Adafruit_BME280 bme;
// initially test with broadcast address - sends to all receivers
//uint8_t broadcastAddress[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; // ESP-NOW broadcast address
// REPLACE WITH THE MAC Address of your receiver
uint8_t broadcastAddress[] = { 0x68, 0xB6, 0xB3, 0x2C, 0x16, 0x08};
// Define variables to store BME280 readings to be sent
float temperature = 3.14159;
float humidity = 90.0;
float pressure = 10.0;
// Define variables to store incoming readings
float incomingTemp;
float incomingHum;
float incomingPres;
// Variable to store if sending data was successful
String success;
//Structure example to send data
//Must match the receiver structure
typedef struct struct_message {
float temp;
float hum;
float pres;
} struct_message;
// Create a struct_message called BME280Readings to hold sensor readings
struct_message BME280Readings;
// Create a struct_message to hold incoming sensor readings
struct_message incomingReadings;
bool incomingReadingsOK = false;
esp_now_peer_info_t peerInfo;
// Callback when data is sent
void OnDataSent(const esp_now_send_info_t* mac_addr, esp_now_send_status_t status) {
Serial.print("Last Packet Send Status:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
if (status == 0) success = "Delivery Success :)";
else success = "Delivery Fail :(";
}
// Callback when data is received
void OnDataRecv(const esp_now_recv_info_t* mac, const unsigned char* incomingData, int len) {
memcpy(&incomingReadings, incomingData, sizeof(incomingReadings));
Serial.printf("From %02X:%02X:%02X:%02X:%02X:%02X",
mac->src_addr[0], mac->src_addr[1], mac->src_addr[2], mac->src_addr[3], mac->src_addr[4], mac->src_addr[5]);
Serial.printf(" Bytes received: %d\n", len);
incomingTemp = incomingReadings.temp;
incomingHum = incomingReadings.hum;
incomingPres = incomingReadings.pres;
incomingReadingsOK = true;
}
void setup() {
// Init Serial Monitor
Serial.begin(115200);
delay(3000);
Serial.println("\n\n **** ESP-NOW transmitter *****");
// Init BME280 sensor
/*bool status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
// while (1);
}*/
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);
delay(100); // short delay for initialisation
Serial.print("WiFi MAC address ");
Serial.println(WiFi.macAddress());
// Init ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
delay(100); // short delay for initialisation
byte mac[6];
WiFi.macAddress(mac);
Serial.printf("ESP-NOW initialised MAC address %02X:%02X:%02X:%02X:%02X:%02X\n",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
// 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
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;
}
// Register for a callback function that will be called when data is received
esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
getReadings();
// Set values to send
BME280Readings.temp = temperature;
BME280Readings.hum = humidity;
BME280Readings.pres = pressure;
// Send message via ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t*)&BME280Readings, sizeof(BME280Readings));
if (result == ESP_OK) Serial.println("esp_now_send() returns ESP_OK");
else Serial.println("esp_now_send() returns Error");
updateDisplay();
delay(10000);
}
void getReadings() {
static int x = 1;
temperature = 23.5 + x; //bme.readTemperature();
humidity = 78 + x; //bme.readHumidity();
pressure = 21 + x; //(bme.readPressure() / 100.0F);
x++;
}
void updateDisplay() {
if (!incomingReadingsOK) return;
// Display Readings in Serial Monitor
Serial.println("INCOMING READINGS");
Serial.print("Temperature: ");
Serial.print(incomingReadings.temp);
Serial.println(" ºC");
Serial.print("Humidity: ");
Serial.print(incomingReadings.hum);
Serial.println(" %");
Serial.print("Pressure: ");
Serial.print(incomingReadings.pres);
Serial.println(" hPa");
Serial.println();
}
ESP_NOW receiver using a ESP32-S3-DevKitC-1
Code: Select all
// ESP32 Receiver - two way communication using ESP_NOW
// NOTE: updated to use ESP32 core V3.x
// waits to receive packet from transmitter then transmits data back
// note- no sensors so test data structure transmitted
// original code from
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp-now-two-way-communication-esp32/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <esp_now.h>
#include <WiFi.h>
//#include <Wire.h>
//#include <Adafruit_Sensor.h>
//#include <Adafruit_BME280.h>
//Adafruit_BME280 bme;
// this will be setup when a packet is received with transmitter MAC adddress
uint8_t broadcastAddress[] = { 0, 0, 0, 0, 0, 0 }; //{ 0xEC, 0x64, 0xC9, 0x82, 0x7D, 0x34 }; //{0x84, 0xCC, 0xA8, 0x7A, 0x56, 0x6C};
// Define variables to store BME280 readings to be sent
float temperature;
float humidity;
float pressure;
// Define variables to store incoming readings
float incomingTemp;
float incomingHum;
float incomingPres;
// Variable to store if sending data was successful
String success;
//Structure example to send data
//Must match the receiver structure
typedef struct struct_message {
float temp;
float hum;
float pres;
} struct_message;
// Create a struct_message called BME280Readings to hold sensor readings
struct_message BME280Readings;
// Create a struct_message to hold incoming sensor readings
struct_message incomingReadings;
esp_now_peer_info_t peerInfo;
// Callback when data is sent
void OnDataSent(const esp_now_send_info_t* mac_addr, esp_now_send_status_t status) {
Serial.print("Last Packet Send Status:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
if (status == 0) success = "Delivery Success :)";
else success = "Delivery Fail :(";
}
// Callback when data is received
void OnDataRecv(const esp_now_recv_info_t* mac, const unsigned char* incomingData, int len) {
memcpy(&incomingReadings, incomingData, sizeof(incomingReadings));
// if no broadcast address set it up to transmitter MAC
if (broadcastAddress[0] == 0) {
memcpy(broadcastAddress, mac->src_addr, 6); // set broadcasrAddress to received MAC address
memcpy(peerInfo.peer_addr, broadcastAddress, 6); // Register peer
peerInfo.channel = 0;
peerInfo.encrypt = false;
// Add peer
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to add peer");
return;
}
}
// display transmitter MAC address and copy data
Serial.printf("From %02X:%02X:%02X:%02X:%02X:%02X",
mac->src_addr[0], mac->src_addr[1], mac->src_addr[2], mac->src_addr[3], mac->src_addr[4], mac->src_addr[5]);
Serial.printf(" Bytes received: %d\n", len);
incomingTemp = incomingReadings.temp;
incomingHum = incomingReadings.hum;
incomingPres = incomingReadings.pres;
}
void setup() {
// Init Serial Monitor
Serial.begin(115200);
delay(3000);
// Init BME280 sensor
//bool status = bme.begin(0x76);
//if (!status) {
// Serial.println("Could not find a valid BME280 sensor, check wiring!");
// while (1);
//}
Serial.println("\n\n **** ESP-NOW receiver *****");
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);
delay(100); // short delay for initialisation
Serial.print("WiFi MAC address ");
Serial.println(WiFi.macAddress());
// Init ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
Serial.print("ESP-NOW initialised");
// 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 for a callback function that will be called when data is received
esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
delay(10000);
getReadings();
// Set values to send
BME280Readings.temp = temperature;
BME280Readings.hum = humidity;
BME280Readings.pres = pressure;
// Send message via ESP-NOW
if (broadcastAddress[0] == 0)
Serial.println("no MAC address to transmit too");
else {
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t*)&BME280Readings, sizeof(BME280Readings));
Serial.printf("Send too %02X:%02X:%02X:%02X:%02X:%02X ",
broadcastAddress[0], broadcastAddress[1], broadcastAddress[2], broadcastAddress[3], broadcastAddress[4], broadcastAddress[5]);
if (result == ESP_OK) Serial.println("esp_now_send() returns ESP_OK");
else Serial.println("esp_now_send() returns Error");
updateDisplay();
}
}
void getReadings() {
static int x = 1;
temperature = 33.5 + x; //bme.readTemperature();
humidity = 88 + x; //bme.readHumidity();
pressure = 212 + x; //(bme.readPressure() / 100.0F);
x++;
}
void updateDisplay() {
// Display Readings in Serial Monitor
Serial.println("INCOMING READINGS");
Serial.print("Temperature: ");
Serial.print(incomingReadings.temp);
Serial.println(" ºC");
Serial.print("Humidity: ");
Serial.print(incomingReadings.hum);
Serial.println(" %");
Serial.print("Pressure: ");
Serial.print(incomingReadings.pres);
Serial.println(" hPa");
Serial.println();
}
test run transmitter output
Code: Select all
**** ESP-NOW transmitter *****
WiFi MAC address 10:91:A8:02:00:E8
ESP-NOW initialised MAC address 10:91:A8:02:00:E8
esp_now_send() returns ESP_OK
Last Packet Send Status: Delivery Success
From 68:B6:B3:2C:16:08 Bytes received: 12
esp_now_send() returns ESP_OK
INCOMING READINGS
Temperature: 36.50 ºC
Humidity: 91.00 %
Pressure: 215.00 hPa
Last Packet Send Status: Delivery Success
From 68:B6:B3:2C:16:08 Bytes received: 12
esp_now_send() returns ESP_OK
INCOMING READINGS
Temperature: 37.50 ºC
Humidity: 92.00 %
Pressure: 216.00 hPa
Last Packet Send Status: Delivery Success
From 68:B6:B3:2C:16:08 Bytes received: 12
esp_now_send() returns ESP_OK
INCOMING READINGS
Temperature: 38.50 ºC
Humidity: 93.00 %
Pressure: 217.00 hPa
Last Packet Send Status: Delivery Success
From 68:B6:B3:2C:16:08 Bytes received: 12
esp_now_send() returns ESP_OK
INCOMING READINGS
Temperature: 39.50 ºC
Humidity: 94.00 %
Pressure: 218.00 hPa
Last Packet Send Status: Delivery Success
From 68:B6:B3:2C:16:08 Bytes received: 12
esp_now_send() returns ESP_OK
INCOMING READINGS
Temperature: 40.50 ºC
Humidity: 95.00 %
Pressure: 219.00 hPa
receiver output
Code: Select all
**** ESP-NOW receiver *****
WiFi MAC address 68:B6:B3:2C:16:08
ESP-NOW initialisedno MAC address to transmit too
no MAC address to transmit too
From 10:91:A8:02:00:E8 Bytes received: 12
Send too 10:91:A8:02:00:E8 esp_now_send() returns ESP_OK
INCOMING READINGS
Temperature: 24.50 ºC
Humidity: 79.00 %
Pressure: 22.00 hPa
Last Packet Send Status: Delivery Success
From 10:91:A8:02:00:E8 Bytes received: 12
Send too 10:91:A8:02:00:E8 esp_now_send() returns ESP_OK
INCOMING READINGS
Temperature: 25.50 ºC
Humidity: 80.00 %
Pressure: 23.00 hPa
Last Packet Send Status: Delivery Success
From 10:91:A8:02:00:E8 Bytes received: 12
Send too 10:91:A8:02:00:E8 esp_now_send() returns ESP_OK
INCOMING READINGS
Temperature: 26.50 ºC
Humidity: 81.00 %
Pressure: 24.00 hPa
Last Packet Send Status: Delivery Success
From 10:91:A8:02:00:E8 Bytes received: 12
Send too 10:91:A8:02:00:E8 esp_now_send() returns ESP_OK
INCOMING READINGS
Temperature: 27.50 ºC
Humidity: 82.00 %
Pressure: 25.00 hPa
Last Packet Send Status: Delivery Success
From 10:91:A8:02:00:E8 Bytes received: 12
Send too 10:91:A8:02:00:E8 esp_now_send() returns ESP_OK
INCOMING READINGS
Temperature: 28.50 ºC
Humidity: 83.00 %
Pressure: 26.00 hPa
Last Packet Send Status: Delivery Success
From 10:91:A8:02:00:E8 Bytes received: 12
Send too 10:91:A8:02:00:E8 esp_now_send() returns ESP_OK
INCOMING READINGS
Temperature: 29.50 ºC
Humidity: 84.00 %
Pressure: 27.00 hPa
Last Packet Send Status: Delivery Success
From 10:91:A8:02:00:E8 Bytes received: 12
Send too 10:91:A8:02:00:E8 esp_now_send() returns ESP_OK
INCOMING READINGS
Temperature: 30.50 ºC
Humidity: 85.00 %
Pressure: 28.00 hPa
initially test the transmitter using the broadcast address 0xff, 0xff, 0xff, 0xff, 0xff, 0xff then try the receiver MAC address