Skip to content

Commit f2d33d8

Browse files
committed
Update ESP-NOW example sketches
1 parent 2e0ce10 commit f2d33d8

File tree

2 files changed

+73
-62
lines changed

2 files changed

+73
-62
lines changed

Firmware/Test Sketches/ESPNOW_Receive/ESPNOW_Receive.ino

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,46 +6,58 @@
66
A receiver does not need to have the broadcastMac added to its peer list. It will receive a broadcast
77
no matter what.
88
9-
If desired, onDataRecieve should check the received MAC against the list of friendly/paired MACs
9+
If desired, onDataRecieve should check the received MAC against the list of friendly/paired MACs
1010
in order to throw out broadcasted packets that may not be valid data.
11+
12+
Add peers
13+
Add callback to deal with allowed incoming data
14+
Update test sketches
1115
*/
1216

1317
#include <esp_now.h>
14-
#include <WiFi.h>
18+
#include <esp_mac.h> //Needed for esp_read_mac()
19+
#include <WiFi.h> //Needed because ESP-NOW requires WiFi.mode()
1520

16-
void onDataRecieve(const uint8_t *mac_addr, const uint8_t *incomingData, int len)
21+
void onDataReceive(const esp_now_recv_info *mac, const uint8_t *incomingData, int len)
1722
{
18-
Serial.printf("Bytes received: %d", len);
19-
Serial.printf(" from peer: 0x%02X%02X%02X%02X%02X%02X\r\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
23+
// typedef struct esp_now_recv_info {
24+
// uint8_t * src_addr; // Source address of ESPNOW packet
25+
// uint8_t * des_addr; // Destination address of ESPNOW packet
26+
// wifi_pkt_rx_ctrl_t * rx_ctrl; // Rx control info of ESPNOW packet
27+
// } esp_now_recv_info_t;
28+
29+
// Display the packet info
30+
Serial.printf(
31+
"RX from MAC %02X:%02X:%02X:%02X:%02X:%02X, %d bytes - ",
32+
mac->des_addr[0], mac->des_addr[1], mac->des_addr[2], mac->des_addr[3], mac->des_addr[4], mac->des_addr[5],
33+
len);
34+
35+
//Print what was received - it might be binary gobbly-de-gook
36+
char toPrint[len + 1];
37+
snprintf(toPrint, sizeof(toPrint), "%s", incomingData);
38+
Serial.println(toPrint);
2039
}
2140

2241
void setup()
2342
{
2443
Serial.begin(115200);
25-
delay(500);
26-
Serial.println("Point to Point Receiver - No WiFi");
44+
delay(250);
45+
Serial.println("Remote to Central - This is Central");
2746

28-
uint8_t unitMACAddress[6]; //Use MAC address in BT broadcast and display
47+
uint8_t unitMACAddress[6];
2948
esp_read_mac(unitMACAddress, ESP_MAC_WIFI_STA);
30-
Serial.print("WiFi MAC Address:");
31-
for (int x = 0 ; x < 6 ; x++)
32-
{
33-
Serial.print(" 0x");
34-
if (unitMACAddress[x] < 0x10) Serial.print("0");
35-
Serial.print(unitMACAddress[x], HEX);
36-
}
37-
Serial.println();
49+
Serial.printf("Hi! My MAC address is: {0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X}\r\n",
50+
unitMACAddress[0], unitMACAddress[1], unitMACAddress[2], unitMACAddress[3], unitMACAddress[4], unitMACAddress[5]);
3851

39-
// Set device as a Wi-Fi Station
52+
//ESP-NOW must have WiFi initialized
4053
WiFi.mode(WIFI_STA);
4154

42-
if (esp_now_init() != ESP_OK) {
55+
if (esp_now_init() != ESP_OK)
4356
Serial.println("Error initializing ESP-NOW");
44-
return;
45-
}
46-
47-
esp_now_register_recv_cb(onDataRecieve);
57+
else
58+
Serial.println("ESP-NOW started");
4859

60+
esp_now_register_recv_cb(onDataReceive);
4961
}
5062

5163
void loop()
@@ -63,26 +75,19 @@ void loop()
6375

6476
// Add a given MAC address to the peer list
6577
esp_err_t espnowAddPeer(uint8_t *peerMac)
66-
{
67-
return (espnowAddPeer(peerMac, true)); // Encrypt by default
68-
}
69-
70-
esp_err_t espnowAddPeer(uint8_t *peerMac, bool encrypt)
7178
{
7279
esp_now_peer_info_t peerInfo;
7380

7481
memcpy(peerInfo.peer_addr, peerMac, 6);
7582
peerInfo.channel = 0;
7683
peerInfo.ifidx = WIFI_IF_STA;
77-
// memcpy(peerInfo.lmk, "RTKProductsLMK56", 16);
78-
// peerInfo.encrypt = encrypt;
7984
peerInfo.encrypt = false;
8085

8186
esp_err_t result = esp_now_add_peer(&peerInfo);
8287
if (result != ESP_OK)
83-
{
84-
Serial.printf("Failed to add peer: 0x%02X%02X%02X%02X%02X%02X\r\n", peerMac[0], peerMac[1], peerMac[2],
85-
peerMac[3], peerMac[4], peerMac[5]);
86-
}
88+
Serial.printf("Failed to add peer: 0x%02X%02X%02X%02X%02X%02X\r\n", peerMac[0], peerMac[1], peerMac[2], peerMac[3], peerMac[4], peerMac[5]);
89+
else
90+
Serial.printf("Added peer: 0x%02X%02X%02X%02X%02X%02X\r\n", peerMac[0], peerMac[1], peerMac[2], peerMac[3], peerMac[4], peerMac[5]);
91+
8792
return (result);
8893
}
Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,34 @@
11
/*
2-
Transmit dummy data over ESP-NOW
2+
ESP-NOW tranmit to a specific peer
3+
By: Nathan Seidle
4+
SparkFun Electronics
5+
Date: September 25th, 2025
6+
License: Public domain / don't care.
37
4-
In this example, we don't have a paired MAC, this example simply broadcasts.
8+
In this example we transmit 'hello world' to a specified peer.
59
6-
To send a broadcast, the 0xFF broadcastMac has to be added to the peer list, *and*
7-
we have to address the message to the broadcastMac, *not* 0 to send to all peers on the list.
10+
Run ESPNOW_Transmit and ESPNOW_Recieve on two ESP32s. This example uses Broadcast ESP-NOW
11+
so no MAC addresses should be needed. ESP-NOW communication should flow correctly between the two units.
12+
13+
If you assign a remote MAC, once data is flowing, hold the remote in reset to see the delivery failures.
814
9-
A receiver does not need to have the broadcastMac added to its peer list. It will receive a broadcast
10-
no matter what.
1115
*/
1216

1317
#include <esp_now.h>
14-
#include <WiFi.h>
18+
#include <esp_mac.h> //Needed for esp_read_mac()
19+
#include <WiFi.h> //Needed because ESP-NOW requires WiFi.mode()
1520

1621
uint8_t broadcastMac[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
17-
uint8_t roverMac[] = {0x64, 0xB7, 0x08, 0x3D, 0xFD, 0xAC};
22+
uint8_t remoteMac[] = {0xB8, 0xD6, 0x1A, 0x0C, 0xA3, 0xDC}; //Modify this with the MAC address of the remote unit you want to transmit to
1823
uint8_t mockMac[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; //Dummy MAC for testing
1924

2025
esp_now_peer_info_t peerInfo;
2126

2227
unsigned long lastSend = 0;
2328

29+
int channelNumber = 0;
30+
uint8_t packetCounter = 0; // Intentionally 8-bit so it rolls over
31+
2432
void onDataSent(const uint8_t *mac_addr, esp_now_send_status_t status)
2533
{
2634
Serial.print("Last Packet Send Status: ");
@@ -33,9 +41,15 @@ void onDataSent(const uint8_t *mac_addr, esp_now_send_status_t status)
3341
void setup()
3442
{
3543
Serial.begin(115200);
36-
delay(500);
37-
Serial.println("Point to Point - Base Transmitter");
44+
delay(250);
45+
Serial.println("Remote to Central - This is Remote Transmitter");
3846

47+
uint8_t unitMACAddress[6];
48+
esp_read_mac(unitMACAddress, ESP_MAC_WIFI_STA);
49+
Serial.printf("Hi! My MAC address is: {0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X}\r\n",
50+
unitMACAddress[0], unitMACAddress[1], unitMACAddress[2], unitMACAddress[3], unitMACAddress[4], unitMACAddress[5]);
51+
52+
//ESP-NOW must have WiFi initialized
3953
WiFi.mode(WIFI_STA);
4054

4155
if (esp_now_init() != ESP_OK) {
@@ -45,27 +59,28 @@ void setup()
4559

4660
esp_now_register_send_cb(onDataSent);
4761

48-
//espnowAddPeer(roverMac); // Register a remote address if we want to deliver data there
62+
//espnowAddPeer(remoteMac); // Register a remote address to deliver data to
4963
espnowAddPeer(mockMac);
50-
espnowAddPeer(broadcastMac);
64+
espnowAddPeer(broadcastMac); //Remote this line to remove broadcast transmissions
5165
}
5266

5367
void loop()
5468
{
55-
if (millis() - lastSend > 500)
69+
if (millis() - lastSend > 1000)
5670
{
5771
lastSend = millis();
5872

59-
uint8_t espnowData[] = "This is the test string.";
73+
char espnowData[100];
74+
sprintf(espnowData, "This is test #: %d", packetCounter++);
6075

6176
esp_err_t result = ESP_OK;
6277

63-
result = esp_now_send(0, (uint8_t *)&espnowData, sizeof(espnowData)); // Send packet to all peers on the list, excluding broadcast peer.
64-
//result = esp_now_send(broadcastMac, (uint8_t *)&espnowData, sizeof(espnowData)); // Send packet over broadcast
65-
//result = esp_now_send(roverMac, (uint8_t *)&espnowData, sizeof(espnowData)); // Send packet to a specific peer
78+
//result = esp_now_send(0, (uint8_t *)&espnowData, strlen(espnowData)); // Send packet to all peers on the list, excluding broadcast peer.
79+
//result = esp_now_send(broadcastMac, (uint8_t *)&espnowData, strlen(espnowData)); // Send packet over broadcast
80+
result = esp_now_send(remoteMac, (uint8_t *)&espnowData, strlen(espnowData)); // Send packet to a specific peer
6681

6782
if (result == ESP_OK)
68-
Serial.println("Sent with success");
83+
Serial.println("Sent with success"); // We will always get a success with broadcastMac packets, presumably because they do not have delivery confirmation.
6984
else
7085
Serial.println("Error sending the data");
7186
}
@@ -81,28 +96,19 @@ void loop()
8196
}
8297
}
8398

84-
// Add a given MAC address to the peer list
8599
esp_err_t espnowAddPeer(uint8_t *peerMac)
86-
{
87-
return (espnowAddPeer(peerMac, true)); // Encrypt by default
88-
}
89-
90-
esp_err_t espnowAddPeer(uint8_t *peerMac, bool encrypt)
91100
{
92101
esp_now_peer_info_t peerInfo;
93102

94103
memcpy(peerInfo.peer_addr, peerMac, 6);
95104
peerInfo.channel = 0;
96105
peerInfo.ifidx = WIFI_IF_STA;
97-
// memcpy(peerInfo.lmk, "RTKProductsLMK56", 16);
98-
// peerInfo.encrypt = encrypt;
99106
peerInfo.encrypt = false;
100107

101108
esp_err_t result = esp_now_add_peer(&peerInfo);
102109
if (result != ESP_OK)
103110
{
104-
Serial.printf("Failed to add peer: 0x%02X%02X%02X%02X%02X%02X\r\n", peerMac[0], peerMac[1], peerMac[2],
105-
peerMac[3], peerMac[4], peerMac[5]);
111+
Serial.printf("Failed to add peer: 0x%02X%02X%02X%02X%02X%02X\r\n", peerMac[0], peerMac[1], peerMac[2], peerMac[3], peerMac[4], peerMac[5]);
106112
}
107113
return (result);
108-
}
114+
}

0 commit comments

Comments
 (0)