Architecture
BlueJammer-V2 runs across two boards, each with a dedicated role:
Board Role
ESP32-WROOM-32U Jamming engine, OLED display, button, LED
Ai-Thinker BW16 5GHz WiFi AP, web interface, UART master
They communicate over a UART link at 115200 baud using a lightweight protocol with handshaking, command acknowledgement, and live error detection.
Features
Jamming Engine (ESP32)
Up to 4x NRF24L01+ modules running simultaneously in a dynamic round-robin hop pattern
Modules are hot-pluggable - the probe task detects connect/disconnect every 500ms and redistributes hops automatically so 1, 2, 3, or 4 radios always run at full capacity
4 jamming modes:
Mode 1 - Bluetooth (2.4GHz, CH 0-79)
Mode 2 - BLE (2.4GHz, CH 0-39)
Mode 3 - WiFi (2.4GHz, CH 0-14)
Mode 4 - RC/Drone (2.4GHz, CH 0-125)
Dual SPI buses (HSPI + VSPI) with NRF3 sharing HSPI via separate CE/CSN
Built to squeeze every bit of processing power out of the ESP32 - the jamming engine runs completely separately from the UI, UART, and display tasks with zero interference between them
Web Interface (BW16)
Hosted on a 5GHz WiFi AP (default channel 149, configurable)
Full real-time mode control with live status polling every 300ms
NRF module status (R1 / R2 / R3 / R4 - OK or FAIL), updated live as modules are plugged or unplugged
Serial monitor built into the web UI - shows real ESP32 serial output forwarded over UART
Command log
AP Settings panel - change SSID, password, channel, hidden mode
OLED panel - adjust brightness (0-100% in steps of 10, live preview), screen timeout with fade-out, I2C address selector
Preferences panel - boot mode selector (idle or direct into a specific mode)
UART error overlay - animated red notification slides in from the top if the ESP32 link drops mid-session, clears automatically on reconnect
5-minute AP auto-shutdown with a 10-second countdown if no browser connects
Safety notice - if the AP is configured on a 2.4GHz channel, a warning banner is shown. Jamming still works but you will lose the web connection the moment a mode is activated. Use the physical button on the ESP32 to stop and reconnect. Using a 5GHz channel (default: 149) avoids this entirely.
OLED Display (128x64)
Boot splash screen
Live status bar - NRF module indicators, web connection cloud icon, activity icons
Mode screens with icon and label for each jamming mode
Settings screen when web settings panel is open
AP timeout countdown shown in the status bar (last 10 seconds)
Configurable brightness (0-100%, live from web UI) with smooth fade-out on dim
Configurable screen timeout with automatic power-off and fade effect
Screen wakes on physical button press only when timed out
BW16 LED Feedback
The onboard RGB LED on the BW16 communicates device state visually:
Pattern Meaning
Slow blue breathe Waiting for web connection
Mode colour solid Active jamming mode (Blue=BT, Green=BLE, Orange=WiFi, Purple=RC)
Red breathe Idle
Cyan breathe Settings panel open
Cyan strobe Browser just connected
Green/Orange/Red blink AP 10s countdown (colour changes by urgency)
Rapid R+B flash AP shutting down
Distinct warning pattern No ESP32 detected on UART
3x green flash ESP32 link restored after disconnect
UART Communication
Both boards use a live bidirectional heartbeat system. The ESP32 sends a HB pulse every 2 seconds, the BW16 replies, and the ESP32 confirms both directions are working with a LINKOK message. If either wire goes down, the BW16 detects it within 5 seconds and shows a UART error overlay on the web interface and activates the warning LED pattern. The link recovers automatically the moment the connection is restored.
Hardware Requirements
Core Components
Component Quantity Notes
ESP32-WROOM-32 1 Any module that covers the required pinout
Ai-Thinker BW16 1 RTL8720DN, 5GHz capable
NRF24L01+ modules 1-4 With 10µF capacitor on each VCC/GND
SSD1306 OLED 128x64 1 I2C, address 0x3C (or 0x3D, configurable)
LED 1 External, connected to GPIO27
Decoupling capacitors 1-4 10µF electrolytic, one per NRF module
Power
Both boards share 3.3V and GND
The BW16 can be powered directly from the ESP32's 3V3 rail
NRF24L01 modules are very sensitive to power noise - the 10µF capacitor on each module is not optional
Wiring
ESP32 Pin Assignments
NRF1 - HSPI
NRF24 Pin ESP32 GPIO
CE 16
CSN 15
SCK 14
MOSI 13
MISO 12
VCC 3.3V
GND GND
NRF2 - VSPI
NRF24 Pin ESP32 GPIO
CE 22
CSN 21
SCK 18
MOSI 23
MISO 19
VCC 3.3V
GND GND
NRF3 - HSPI shared (same SCK/MOSI/MISO as NRF1, unique CE/CSN)
NRF24 Pin ESP32 GPIO
CE 32
CSN 17
SCK 14
MOSI 13
MISO 12
VCC 3.3V
GND GND
NRF4 - VSPI shared (same SCK/MOSI/MISO as NRF2, unique CE/CSN)
NRF24 Pin ESP32 GPIO
CE 25
CSN 2
SCK 18
MOSI 23
MISO 19
VCC 3.3V
GND GND
OLED (I2C)
OLED Pin ESP32 GPIO
SDA 4
SCL 5
VCC 3.3V
GND GND
UI
Component ESP32 GPIO
Button GPIO0 → GND
LED GPIO27
UART to BW16
Signal ESP32 GPIO BW16 Pin
RX GPIO26 PB1 (TX)
TX GPIO33 PB2 (RX)
GND GND GND
3V3 3V3 3V3
Note: Cross the TX/RX lines. ESP32 TX → BW16 RX and ESP32 RX → BW16 TX.