← Back to Garden
evergreen ·
esp-now esp32 iot networking architecture

What is ESP-NOW and How it Solves IoT Race Conditions

ESP-NOW is a fast, connectionless communication protocol developed by Espressif for its line of ESP microcontrollers (ESP8266, ESP32). It enables direct, peer-to-peer communication between devices without needing a WiFi access point, making it an incredibly useful tool for specific IoT applications.

Key Features of ESP-NOW

  • Fast & Low-Latency: Because it's connectionless, there is no handshake overhead like in traditional WiFi connections. Data packets are sent directly and immediately.
  • Peer-to-Peer: Devices communicate directly with each other using their MAC addresses. They do not need to connect to a router or access point to form a network.
  • Long-Range: It operates on the 2.4GHz WiFi frequency and can achieve ranges of 100 meters or more.
  • One-to-Many & Many-to-One: It supports various topologies, including simple one-to-one links or more complex sensor networks where multiple devices report to a single collector.

The Problem: WiFi and Bluetooth on a Single ESP32

In the TSI-Telemetry project, the original goal was to use a single ESP32 to perform two high-frequency tasks simultaneously:

  1. Task A (Bluetooth): Constantly scan for and maintain a Bluetooth Low Energy (BLE) connection with the ELM327 OBD-II adapter.
  2. Task B (WiFi): Maintain a stable WiFi connection to a hotspot and publish data via a secure (TLS) MQTT connection to the cloud.

Running both radios for these demanding tasks on a single ESP32's shared resources leads to critical stability problems, often called "race conditions":

  • Radio Conflict: The single 2.4GHz radio antenna must rapidly switch between handling WiFi and BLE traffic, leading to packet loss and timing issues for both.
  • Memory Contention: The WiFi and BLE software stacks are both memory-intensive. Running them at the same time can lead to memory exhaustion and random crashes.
  • CPU Hogging: The TLS encryption required for a secure MQTT connection is CPU-intensive and can starve the BLE task of the processing time it needs, causing it to lose connection with the OBD-II adapter.

The result is an unstable system with random, difficult-to-debug disconnections from either the OBD-II adapter or the MQTT broker.

The Solution: A Dual-ESP32 Architecture with ESP-NOW

The architecture you implemented solves this problem elegantly by separating concerns across two dedicated microcontrollers, using ESP-NOW as a "wireless data cable" between them.

┌─────────────────┐    ESP-NOW     ┌─────────────────┐
│   OBD Sender    │───────────────►│  MQTT Receiver  │
│    (ESP32 #1)   │                │    (ESP32 #2)   │
│                 │                │                 │
│  - BLE only     │                │  - WiFi only    │
│  - Heavy lifting│                │  - Network tasks│
└─────────────────┘                └─────────────────┘
  1. ESP32 #1 (OBD Sender): Its one and only job is to manage the demanding BLE connection to the car. It dedicates 100% of its resources to reading and parsing OBD-II data. It doesn't know or care about WiFi, MQTT, or the internet. Once it has a piece of data, it simply sends it to the known MAC address of its partner using ESP-NOW.

  2. ESP32 #2 (MQTT Receiver): Its one and only job is to manage the network. It dedicates 100% of its resources to maintaining a stable WiFi and MQTT connection. It receives data packets via ESP-NOW, and its only task is to forward them to HiveMQ Cloud.

Why ESP-NOW is the Perfect Bridge

  • Decoupling: It completely decouples the time-sensitive task (reading from the car) from the network-sensitive task (publishing to the cloud).
  • Reliability: By giving each ESP32 only one job to do, the system becomes dramatically more stable and reliable.
  • Simplicity: The code on each microcontroller becomes simpler and easier to maintain, as it no longer has to manage two complex, competing tasks.

In this architecture, ESP-NOW serves as a simple, fast, and robust point-to-point link that allows two specialized microcontrollers to collaborate as a single, more powerful logical unit.