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
1621uint8_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
1823uint8_t mockMac[] = {0xAA , 0xBB , 0xCC , 0xDD , 0xEE , 0xFF }; // Dummy MAC for testing
1924
2025esp_now_peer_info_t peerInfo;
2126
2227unsigned long lastSend = 0 ;
2328
29+ int channelNumber = 0 ;
30+ uint8_t packetCounter = 0 ; // Intentionally 8-bit so it rolls over
31+
2432void 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)
3341void 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
5367void 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
8599esp_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