ESP-NOW based mesh networking firmware for ESP32 microcontrollers, providing Reticulum network connectivity through BLE and UART interfaces. Enables off-grid, encrypted mesh communication using Sideband, Columba, and other Reticulum-compatible applications.
Phone (Sideband) ESP32 Client ESP32 Retranslator ESP32 Client Phone
| | | | |
|---BLE (KISS)----->|---ESP-NOW v2------->|---ESP-NOW v2------>|---BLE------->|
| | 802.11 LR | 802.11 LR | |
|<--BLE (KISS)------|<--ESP-NOW v2--------|<--ESP-NOW v2------|<--BLE--------|
Three firmware types work together:
All nodes use ESP-NOW v2.0 with 1470-byte payloads and 802.11 Long Range mode for up to 500m line-of-sight range.
| Board | Chip | Display | BLE | Client | Retranslator | UART |
|---|---|---|---|---|---|---|
| ESP32-C3 + OLED | ESP32-C3 | SSD1306 72x40 | 5.0 | Yes | Yes | Yes |
| LilyGO T-Display | ESP32 | ST7789 135x240 | 4.2 | Yes | Yes | Yes |
| ESP32-S3 DevKitC | ESP32-S3 | None | 5.0 | Yes | Yes | Yes |
| ESP32 DevKit | ESP32 | None | 4.2 | Yes | Yes | Yes |
| ESP32-WROVER DevKit | ESP32 | None | 4.2 | Yes | Yes (4MB PSRAM) | Yes |
| ESP32-CAM | ESP32 | None | 4.2 | Yes | Yes (2MB PSRAM) | Yes |
| ESP32-C6 DevKitC | ESP32-C6 | None | 5.0 | Yes | Yes | Yes |
| ESP32-S2 Saola | ESP32-S2 | None | No | No | Yes | Yes |
| Module | PSRAM | Bus | Max Paths | Environment |
|---|---|---|---|---|
| N16R8, N8R8 | 8 MB | Octal SPI | 4096 | retranslator_s3_r8 |
| N4R2, N8R2, N16R2 | 2 MB | Quad SPI | 1024 | retranslator_s3_r2 |
| N4, N8, N16 | None | -- | 128 | retranslator_s3 |
Bridges a phone running Sideband/Columba (via BLE) to the ESP-NOW mesh. Emulates RNode over Nordic UART Service (NUS) with KISS framing. Phone runs the full Reticulum stack; the device is a transparent radio modem.
Runs the full microReticulum transport stack. Learns paths from announces, rebroadcasts announces, and forwards packets between nodes. Purely infrastructure -- no user-facing messaging capability. Invisible to Sideband/Columba users but extends mesh range.
Same as BLE client but communicates over USB serial at 921600 baud instead of BLE. For connecting a PC or laptop running Reticulum directly via USB cable. No BLE dependency, simpler and more reliable than wireless link.
platformio.ini and downloaded automatically on first build. If the toolchain install fails on Windows (MSYS2/MinGW), download manually from espressif/crosstool-NG. See full docs for details.# Build for ESP32-C3 BLE client (default)
pio run -e client_c3
# Flash to connected board
pio run -e client_c3 -t upload
# Flash to specific port
pio run -e client_c3 -t upload --upload-port COM24
# Monitor serial output
pio device monitor
All settings are in include/board_config.h:
| Setting | Default | Description |
|---|---|---|
ESPNOW_CHANNEL | 13 | WiFi channel (1-13). All nodes must match. |
ESPNOW_LONG_RANGE | 1 | 802.11 LR mode. 1=enabled (~500m), 0=standard (~200m). |
REANNOUNCE_INTERVAL_MS | 1800000 | Transport node re-announce interval (30 minutes). Configurable per-environment via build flag. Auto-reboots on low heap (<40KB). |
| Action | Duration | Result |
|---|---|---|
| Double-tap BOOT | 2 quick taps | Toggle display + LEDs on/off (saved to NVS) |
| Hold BOOT | 2+ seconds | Enter BLE pairing mode |
| Action | Duration | Result |
|---|---|---|
| Double-tap BOOT | 2 quick taps | Toggle display + LEDs on/off (saved to NVS) |
| Hold BOOT | 5+ seconds | Factory reset (erases identity and paths) |
| Action | Duration | Result |
|---|---|---|
| Double-tap BOOT | 2 quick taps | Toggle display + LEDs on/off (saved to NVS) |
LED flashes on packet activity (TX/RX). Serial port runs KISS protocol at 921600 baud.
RNode XXXX (XXXX = last 2 bytes of MAC)To pair with a different phone, hold BOOT for 2+ seconds. This clears existing bonds and restarts advertising.
Add to Reticulum config (~/.reticulum/config):
[[ESP-NOW RNode]]
type = RNodeInterface
port = /dev/ttyUSB0 # Linux
# port = COM11 # Windows
speed = 921600
Add to Reticulum config (~/.reticulum/config):
[[ESP-NOW Bridge]]
type = SerialInterface
port = /dev/ttyUSB0 # Linux
# port = COM11 # Windows
speed = 921600
Serial Bridge has zero protocol overhead — maximum throughput, no handshake.
Retranslator only. Hold BOOT button for 5 seconds:
| Environment | Board | Display |
|---|---|---|
client_c3 | ESP32-C3 | SSD1306 OLED |
client_tdisplay | T-Display | ST7789 TFT |
client_s3 | ESP32-S3 | None (RGB LED) |
client_esp32 | ESP32 | None |
client_c6 | ESP32-C6 | None |
| Environment | Board | Display | Paths |
|---|---|---|---|
retranslator_c3 | ESP32-C3 | SSD1306 | 48 |
retranslator_c3_debug | ESP32-C3 | SSD1306 | 48 |
retranslator_tdisplay | T-Display | ST7789 | 48 |
retranslator_s3_r8 | ESP32-S3 | None | 4096 |
retranslator_s3_r2 | ESP32-S3 | None | 1024 |
retranslator_s3 | ESP32-S3 | None | 128 |
retranslator_esp32 | ESP32 | None | 128 |
retranslator_esp32_debug | ESP32 | None | 128 |
retranslator_wrover | ESP32-WROVER | None | 4096 |
retranslator_wrover_debug | ESP32-WROVER | None | 4096 |
retranslator_espcam | ESP32-CAM | None | 1024 |
retranslator_espcam_debug | ESP32-CAM | None | 1024 |
retranslator_c6 | ESP32-C6 | None | 48 |
retranslator_s2 | ESP32-S2 | None | 48 |
| Environment | Board | Display |
|---|---|---|
uart_c3 | ESP32-C3 | SSD1306 OLED |
uart_tdisplay | T-Display | ST7789 TFT |
uart_s3 | ESP32-S3 | None |
uart_esp32 | ESP32 | None |
uart_c6 | ESP32-C6 | None |
uart_s2 | ESP32-S2 | None |
All firmware types use event-driven main loops instead of busy polling. The CPU sleeps during idle periods and wakes instantly when mesh data arrives:
| Feature | Value | Effect |
|---|---|---|
| MTU | 517 bytes | 509-byte notification payloads |
| Data Length Extension | 251 bytes | ~10x fewer link-layer packets |
| 2M PHY | C3/S3/C6 | Doubles air-time speed |
| Connection interval | 15-30ms | Faster than phone default |
| Fragmentation | MTU-aware | Large packets split correctly |
Real-world BLE throughput with WiFi+BLE coexistence: 30-60 KB/s. This exceeds typical Reticulum traffic requirements.
| Problem | Solution |
|---|---|
| BLE device not visible | On Android 15+, enable "Show unsupported BLE devices" in Developer Options. Hold BOOT 2s to re-enter pairing mode. |
| Sideband: "no unpaired RNodes" | Unpair from Android Bluetooth settings first, then scan again in Sideband with "Device requires BLE" checked. |
| Display stays black | Double-tap BOOT -- display may be toggled off (state persisted across reboots). |
| Serial output garbled | Check baud rate: 115200 for monitor, 921600 for UART client. Ensure CR+LF line endings. |
| ESP-NOW nodes not connecting | All nodes must use same ESPNOW_CHANNEL and ESPNOW_LONG_RANGE setting. Check range. |
| Factory reset not triggering | Hold BOOT for full 5 seconds. LED turns red when reset activates. Only available on retranslator firmware. |
| Board stuck after partial flash | Hold BOOT, press RESET, release BOOT to enter download mode. Reflash. |
Прошивка mesh-сети на основе ESP-NOW для микроконтроллеров ESP32, обеспечивающая подключение к сети Reticulum через BLE и UART. Позволяет организовать автономную зашифрованную mesh-связь с использованием Sideband, Columba и других Reticulum-совместимых приложений.
Телефон (Sideband) ESP32 Клиент ESP32 Ретранслятор ESP32 Клиент Телефон
| | | | |
|---BLE (KISS)----->|---ESP-NOW v2------->|---ESP-NOW v2------>|---BLE------->|
| | 802.11 LR | 802.11 LR | |
|<--BLE (KISS)------|<--ESP-NOW v2--------|<--ESP-NOW v2------|<--BLE--------|
Три типа прошивки работают совместно:
| Плата | Чип | Дисплей | BLE | Client | Retranslator | UART |
|---|---|---|---|---|---|---|
| ESP32-C3 + OLED | ESP32-C3 | SSD1306 72x40 | 5.0 | Да | Да | Да |
| LilyGO T-Display | ESP32 | ST7789 135x240 | 4.2 | Да | Да | Да |
| ESP32-S3 DevKitC | ESP32-S3 | Нет | 5.0 | Да | Да | Да |
| ESP32 DevKit | ESP32 | Нет | 4.2 | Да | Да | Да |
| ESP32-WROVER DevKit | ESP32 | Нет | 4.2 | Да | Да (4 МБ PSRAM) | Да |
| ESP32-CAM | ESP32 | Нет | 4.2 | Да | Да (2 МБ PSRAM) | Да |
| ESP32-C6 DevKitC | ESP32-C6 | Нет | 5.0 | Да | Да | Да |
| ESP32-S2 Saola | ESP32-S2 | Нет | Нет | Нет | Да | Да |
| Модуль | PSRAM | Шина | Макс. маршрутов | Окружение |
|---|---|---|---|---|
| N16R8, N8R8 | 8 МБ | Octal SPI | 4096 | retranslator_s3_r8 |
| N4R2, N8R2, N16R2 | 2 МБ | Quad SPI | 1024 | retranslator_s3_r2 |
| N4, N8, N16 | Нет | -- | 128 | retranslator_s3 |
Мост между телефоном с Sideband/Columba (через BLE) и ESP-NOW mesh. Эмулирует RNode через Nordic UART Service (NUS) с KISS-кадрированием. Телефон выполняет полный стек Reticulum; устройство -- прозрачный радиомодем.
Выполняет полный транспортный стек microReticulum. Изучает маршруты из анонсов, ретранслирует анонсы и перенаправляет пакеты между узлами. Чисто инфраструктурный -- невидим для пользователей Sideband/Columba, но расширяет зону покрытия mesh.
Аналогичен BLE клиенту, но взаимодействует через USB Serial на скорости 921600 бод. Для подключения ПК или ноутбука с Reticulum напрямую через USB кабель.
platformio.ini и загружается автоматически. При ошибке установки тулчейна на Windows (MSYS2/MinGW) скачайте вручную с espressif/crosstool-NG. Подробности в полной документации.# Сборка для ESP32-C3 BLE клиента
pio run -e client_c3
# Прошивка на подключенную плату
pio run -e client_c3 -t upload
# Прошивка на конкретный порт
pio run -e client_c3 -t upload --upload-port COM24
Все параметры в include/board_config.h:
| Параметр | По умолчанию | Описание |
|---|---|---|
ESPNOW_CHANNEL | 13 | WiFi канал (1-13). Все узлы должны совпадать. |
ESPNOW_LONG_RANGE | 1 | Режим 802.11 LR. 1=включен (~500 м), 0=стандарт (~200 м). |
REANNOUNCE_INTERVAL_MS | 1800000 | Интервал реанонса транспортного узла (30 минут). Настраивается через флаг сборки. Авто-перезагрузка при низкой куче (<40 КБ). |
| Действие | Длительность | Результат |
|---|---|---|
| Двойное нажатие BOOT | 2 быстрых нажатия | Вкл/выкл дисплей и светодиоды (сохраняется) |
| Удержание BOOT | 2+ секунды | Режим BLE сопряжения |
| Действие | Длительность | Результат |
|---|---|---|
| Двойное нажатие BOOT | 2 быстрых нажатия | Вкл/выкл дисплей и светодиоды (сохраняется) |
| Удержание BOOT | 5+ секунд | Сброс к заводским настройкам |
| Действие | Длительность | Результат |
|---|---|---|
| Двойное нажатие BOOT | 2 быстрых нажатия | Вкл/выкл дисплей и светодиоды (сохраняется) |
Светодиод мигает при активности пакетов (TX/RX). Последовательный порт работает по протоколу KISS на 921600 бод.
RNode XXXX (XXXX = последние 2 байта MAC)Добавьте в конфиг Reticulum (~/.reticulum/config):
[[ESP-NOW RNode]]
type = RNodeInterface
port = /dev/ttyUSB0 # Linux
# port = COM11 # Windows
speed = 921600
Добавьте в конфиг Reticulum (~/.reticulum/config):
[[ESP-NOW Bridge]]
type = SerialInterface
port = /dev/ttyUSB0 # Linux
# port = COM11 # Windows
speed = 921600
Serial Bridge имеет нулевые протокольные накладные расходы — максимальная пропускная способность.
Только для ретранслятора. Удерживайте кнопку BOOT 5 секунд:
Все типы прошивок используют событийные циклы. CPU спит в простое и мгновенно просыпается при поступлении данных:
| Функция | Значение | Эффект |
|---|---|---|
| MTU | 517 байт | 509 байт полезной нагрузки |
| Data Length Extension | 251 байт | ~10x меньше LL-пакетов |
| 2M PHY | C3/S3/C6 | Удвоение скорости в эфире |
| Интервал соединения | 15-30 мс | Быстрее дефолта телефона |
| Фрагментация | С учетом MTU | Большие пакеты разбиваются корректно |
Реальная пропускная способность BLE при сосуществовании WiFi+BLE: 30-60 КБ/с.
| Проблема | Решение |
|---|---|
| BLE устройство не видно | На Android 15+ включите "Показывать неподдерживаемые BLE устройства" в настройках разработчика. Удерживайте BOOT 2 сек для режима сопряжения. |
| Sideband: "no unpaired RNodes" | Удалите сопряжение в настройках Bluetooth Android, затем сканируйте снова с отмеченным "Device requires BLE". |
| Дисплей не работает | Двойное нажатие BOOT -- дисплей может быть выключен (состояние сохраняется). |
| Узлы ESP-NOW не соединяются | Все узлы должны быть на одном канале (ESPNOW_CHANNEL) с одинаковой настройкой LR режима. |
| Плата зависла | Удерживайте BOOT, нажмите RESET, отпустите BOOT для входа в режим загрузки. Перепрошейте. |