What is ESP-NOW?
ESP-NOW is a wireless protocol made by Espressif that lets ESP32 devices send data directly to each other without a WiFi router, internet connection, or any extra hardware. If you have two tinyCore boards and two USB cables, you can get wireless communication working in minutes.
Why This Matters for Your Projects
Section titled “Why This Matters for Your Projects”ESP-NOW is the fastest path from zero to working wireless communication on the tinyCore. While WiFi requires a router and Bluetooth requires pairing, ESP-NOW just works — load a sender sketch on one board, a receiver sketch on the other, and data flows wirelessly in milliseconds. It’s how you build wireless game controllers, remote sensors, robot remotes, and anything else where two (or more) tinyCore boards need to talk to each other.
How ESP-NOW Compares to WiFi and Bluetooth
Section titled “How ESP-NOW Compares to WiFi and Bluetooth”| Feature | ESP-NOW | WiFi | Bluetooth (BLE) |
|---|---|---|---|
| Router required | No | Yes | No |
| Latency | 1–5 ms | 20–35+ ms | 5–15 ms |
| Max message size | 250 bytes | Large (TCP/UDP) | ~512 bytes |
| Range (line of sight) | 200–300 m | ~100 m | ~10–30 m |
| Max peers | 20 devices | Varies | 7 (classic) |
| Talks to phones/computers | No | Yes | Yes |
The key tradeoff: ESP-NOW is fast, low-power, and dead simple, but each message is small (250 bytes) and it only works between ESP32 devices. That’s enough for sensor readings, button states, short text, or control commands — but not for streaming video or talking to your phone.
How It Works
Section titled “How It Works”Every ESP32 board has a unique MAC address — a 6-byte hardware identifier that looks like 30:AE:A4:07:0D:64. ESP-NOW uses these MAC addresses to identify who’s sending and who’s receiving.
The basic setup is three steps:
- Initialize ESP-NOW on both boards
- Register the receiver’s MAC address as a “peer” on the sending board
- Call a send function with your data
No passwords, no network names, no IP addresses. Two callback functions handle the results: a send callback tells the sender whether the receiver acknowledged the message, and a receive callback fires on the receiver whenever a message arrives (giving you the sender’s MAC address and the data).
You can also broadcast by sending to FF:FF:FF:FF:FF:FF — this reaches every ESP32 in range that’s listening, with no need to register specific peers.
Communication Patterns
Section titled “Communication Patterns”One-to-one: One board sends to one other board. A remote control talking to a robot, or a sensor reporting to a display.
One-to-many: One board sends to multiple boards. A controller sending commands to several devices around a room. You can register up to 20 specific peers, or use broadcast to reach unlimited listeners.
Many-to-many: Every board both sends and receives. A mesh of sensors that all share data with each other. Any ESP32 can be a sender and receiver simultaneously — there’s no fixed master/slave role.
On the tinyCore
Section titled “On the tinyCore”ESP-NOW is built into the ESP32-S3 — no libraries to install, no extra hardware. The tinyCore’s existing Link two tinyCores tutorial walks through the full setup with code, including finding your MAC addresses and establishing two-way communication.
The key code steps:
#include <esp_now.h>#include <WiFi.h>
// Receiver's MAC address (get this from the other board)uint8_t peerAddress[] = {0x30, 0xAE, 0xA4, 0x07, 0x0D, 0x64};
// Called when data is sentvoid onSent(const uint8_t *mac, esp_now_send_status_t status) { Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivered" : "Failed");}
// Called when data is receivedvoid onReceive(const uint8_t *mac, const uint8_t *data, int len) { Serial.print("Received: "); Serial.write(data, len); Serial.println();}
void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); // must be in station mode
esp_now_init(); esp_now_register_send_cb(onSent); esp_now_register_recv_cb(onReceive);
// Register the peer esp_now_peer_info_t peer; memcpy(peer.peer_addr, peerAddress, 6); peer.channel = 0; peer.encrypt = false; esp_now_add_peer(&peer);}
void loop() { const char *msg = "Hello from tinyCore!"; esp_now_send(peerAddress, (uint8_t *)msg, strlen(msg)); delay(2000);}Project Ideas
Section titled “Project Ideas”Wireless game controllers. Build a physical controller with buttons and a joystick on one tinyCore, send input data to a second tinyCore running a game or controlling outputs. The 1–5 ms latency is fast enough for real-time gaming.
Sensor networks. Place tinyCore boards with temperature, humidity, or light sensors in different rooms. Each board sends readings to a central tinyCore that displays all the data on a screen or logs it to an SD card.
Remote control robots. Use one tinyCore with a joystick as the controller and another on a robot chassis. ESP-NOW’s low latency makes the robot respond almost instantly.
Synchronized LED shows. One tinyCore sends timing and color commands to multiple boards, each controlling a strip of LEDs. Single-digit millisecond delivery keeps everything in sync.
Wireless IMU streaming. Send accelerometer and gyroscope data from one tinyCore to another — the Link two tinyCores tutorial already demonstrates this.
Limitations
Section titled “Limitations”250-byte message limit. Each ESP-NOW message can carry at most 250 bytes. That’s plenty for sensor data, button states, and short text, but not for audio streaming or file transfers.
ESP-only ecosystem. ESP-NOW only works between Espressif chips (ESP32, ESP8266, etc.). You can’t use it to talk to a phone, laptop, or Raspberry Pi. For that, use WiFi or Bluetooth.
WiFi complicates things. When your ESP32 is connected to a WiFi access point, ESP-NOW communication must happen on that AP’s channel. WiFi power-saving can also cause missed messages. Using both together works but adds complexity.
Encryption reduces peer count. ESP-NOW supports AES-128 encryption, but enabling it drops the maximum peer count from 20 to 7 by default. Broadcast messages can’t be encrypted.
Receivers must be awake. A board in deep sleep can’t receive ESP-NOW messages. For battery-powered receivers, you’ll need to manage wake/sleep timing.
Quick Reference
Section titled “Quick Reference”| Feature | Details |
|---|---|
| Protocol | ESP-NOW (Espressif proprietary) |
| Frequency | 2.4 GHz (same radio as WiFi) |
| Max message size | 250 bytes |
| Latency | 1–5 ms typical |
| Range | 200–300 m line of sight |
| Max peers | 20 (7 with encryption) |
| Requires WiFi router | No |
| Works with phones | No (ESP devices only) |
| Arduino header | #include <esp_now.h> |
Learn More
Section titled “Learn More”- Link two tinyCores — full hands-on ESP-NOW tutorial with code
- What is WiFi? — when you need internet access instead
- What is Bluetooth? — when you need to talk to phones
Video: ESP-NOW for Beginners
Section titled “Video: ESP-NOW for Beginners”educ8s — ~10 minutes. Basic ESP-NOW broadcasting between two boards, then builds a wireless weather station. Uses a simplified wrapper library that keeps the code minimal.
Video: ESP-NOW Deep Dive
Section titled “Video: ESP-NOW Deep Dive”DroneBot Workshop — 43 minutes total, but the first 15 minutes cover the beginner basics. Goes on to cover broadcast mode, two-way communication, encryption, and building a remote temperature sensor system.