Прошивка для ESP32, которая мостит любой GNSS/GPS-приёмник на телефон через Bluetooth Low Energy (BLE), с WiFi AP для NTRIP-поправок и real-time выводом на OLED/TFT.
Работает с UM980, u-blox, Quectel и любым GNSS-модулем, который отдаёт NMEA по UART. Поддерживает RTK Fixed/Float, мультисозвездийный приём и двунаправленный pass-through команд.
- Двунаправленный BLE UART — Nordic UART Service (NUS), совместимо с любым BLE-терминальным приложением
- WiFi Access Point — TCP-сервер на порту 23 для релея NTRIP-поправок (до 4 клиентов)
- Поддержка RTK — детект Fixed/Float, отображение точности в см
- Мультисозвездийность — GPS, GLONASS, Galileo, BeiDou, QZSS с подсчётом спутников по каждой системе
- Разбор NMEA — предложения GGA, GNS, GSV, GSA, GST с извлечением спутников/точности
- OLED-дисплей — SSD1306 128x64: координаты, высота, время, точность, разбивка по спутникам
- TFT-дисплей — ST7789 135x240: те же данные в цвете (опционально)
- Поддержка двух плат — ESP32-C3 (одно ядро) и ESP32-S3 (два ядра, BLE + данные на разных ядрах)
- Высокий throughput — UART на 460800 baud, BLE MTU до 517 байт, ring-буфер 16 KB
Скачать последний релиз и прошить через esptool:
pip install esptool
# ESP32-C3
esptool.py write_flash 0x0 unified-esp32c3.bin
# ESP32-S3
esptool.py write_flash 0x0 unified-esp32s3.bingit clone https://github.com/danusha2345/esp32-ble-gnss-bridge.git
cd esp32-ble-gnss-bridge
# Build & upload
pio run -e esp32-c3 -t upload
pio run -e esp32-s3 -t upload
# Serial monitor
pio device monitor -e esp32-c3
pio device monitor -e esp32-s3| Board | Architecture | Display library |
|---|---|---|
| ESP32-C3 Super Mini | Single-core RISC-V 160 MHz | Arduino_GFX |
| ESP32-S3-Zero | Dual-core Xtensa 240 MHz | TFT_eSPI |
| Function | Pin | Notes |
|---|---|---|
| GNSS UART RX | GPIO8 | From GNSS TX |
| GNSS UART TX | GPIO10 | To GNSS RX |
| OLED SDA | GPIO3 | I2C |
| OLED SCL | GPIO4 | I2C, address 0x3C |
| TFT SCLK / MOSI / DC / RST / BL | GPIO0 / 1 / 2 / 9 / 5 | SPI, optional |
| Function | Pin | Notes |
|---|---|---|
| GNSS UART RX | GPIO5 | From GNSS TX |
| GNSS UART TX | GPIO6 | To GNSS RX |
| OLED SCL | GPIO1 | I2C |
| OLED SDA | GPIO2 | I2C, address 0x3C |
| TFT DC / RST / MOSI / SCLK / BL | GPIO9 / 10 / 11 / 12 / 13 | SPI, disabled by default |
| WS2812 LED | GPIO21 | Built-in RGB |
Полные схемы и список свободных GPIO — см. ESP32-S3-ZERO_PIN_CONNECTIONS.md.
- Сканировать BLE-устройство:
- ESP32-C3:
UM980_C3_GPS - ESP32-S3:
UM980_S3_GPS
- ESP32-C3:
- Подключиться любым BLE-терминальным приложением — прошивка использует стандартные UUID Nordic UART Service (NUS)
- GNSS-данные идут автоматически; команды на конфигурацию GNSS-модуля можно отправлять туда же
Рекомендуемые приложения:
- Serial Bluetooth Terminal (Android/iOS) — лучший вариант для команд
- SW Maps (Android/iOS) — NTRIP-поправки + карта (External GNSS > Generic NMEA BLE)
- nRF Connect — продвинутая BLE-диагностика
Заметка: приложения для Classic Bluetooth SPP не подойдут — здесь только BLE GATT.
- Подключиться к WiFi AP:
- ESP32-C3: SSID
UM980_GPS_BRIDGE, пароль123456789 - ESP32-S3: SSID
UM980_GPS_BRIDGE_S3, пароль123456789
- ESP32-C3: SSID
- Открыть TCP-соединение на
192.168.4.1:23 - Слать NTRIP-поправки или команды — они пробрасываются на GNSS-модуль
- GNSS-данные одновременно отправляются всем подключённым WiFi- и BLE-клиентам
OLED/TFT показывает:
- Координаты с динамической точностью (6–8 знаков после запятой)
- Высоту и локальное время
- Точность в метрах или сантиметрах (если < 1 м, отображается
xx.x cm) - Количество спутников по созвездиям:
G:9 R:5 E:3 B:2 Q:1 - Режим фикса: GPS, DGPS, RTK Fixed, RTK Float и т.д.
| Setting | How to change |
|---|---|
| WiFi SSID / password | Edit ssid and password at top of src/main.cpp |
| BLE device name | Edit the NimBLEDevice::init() and advertising setName() values in src/main.cpp |
| Time zone | Build flag -DTZ_FORCE_OFFSET_MINUTES=<minutes> in platformio.ini (e.g. 180 = UTC+3) |
| UART baud rate | Edit SerialPort.begin() in src/main.cpp |
Однофайловая прошивка (src/main.cpp, ~2000 строк). Два PlatformIO-окружения, переключение через #ifdef ESP32_S3.
- ESP32-S3: два ядра — BLE-task на core 0, обработка данных на core 1
- ESP32-C3: одно ядро — всё в
loop()
Поток данных: GNSS <-> UART (460800) <-> Ring Buffer (16KB) <-> BLE NUS + WiFi TCP
MIT