BLE trail navigation

Shows route and relative GPS location on a bike display (iOS app + ESP32 module)

Bluetooth Low Energy Bike Navigation

The application shows a GPS polyline on an external display, to help bikers follow the planned route without stops.

images images images
ESP32 TTGO T-Display Uwatch3 prototype image-1 Uwatch3 prototype image-2
Uwatch3 prototype image-3 ESP32 prototype image-1 ESP32 prototype image-2

How it works

The application on the phone runs in background, tracks user location, filters the part or route located nearby, converts it to graphical lines and sends to ESP32 using Bluetooth Low Energy:

  • The phone acts as BLE Central
  • ESP32 acts as BLE Peripheral

Application uses Apple MapKit with OpenStreetMap tiles (only iOS is supported so far).

Note: there is also a prototype for UMIDIGI Uwatch3, but it requires disassembling and reprogramming, and it’s difficult.

How to use

Route editing is manual and very basic:

  • Every GPS point is added manually
  • For now, only one GPS polyline is supported
  • Points can be added/removed only one-by-one at the end of the polyline
  • Route calculation not supported (and not planned)
  • Route import/export is planned in future

ESP32:

  • doesn’t receive real GPS coordinates
  • only draws graphical primitives (lines, triangles, etc.)

Supported ESP32 modules

  1. ESP32 TTGO T-Display with embedded display 135x240 TFT, enabled by-default - download library
  2. Regular ESP32 with external OLED display 128x128 - how to enable

Required Arduino libraries for ESP32

TTGO T-Display

To use TTGO T-Display:

  1. Download library TFT_eSPI adjusted by TTGO, copy TFT_eSPI folder to Arduino/libraries

Display OLED 128x128

Display: Waveshare 14747 128x128 OLED RGB (link)

To enable this setup, comment out TTGO display and uncomment SSD1351 in ESP32-Arduino/BLEBikeNavi/BLEBikeNavi.ino

// uncomment these lines 
#include "OLED_SSD1351_Adafruit.h"
OLED_SSD1351_Adafruit selectedDisplay;
constexpr bool ENABLE_VOLTAGE_MEASUREMENT = false;

// comment out these lines
//#include "TFT_TTGO.h"
//TFT_TTGO selectedDisplay;
//constexpr bool ENABLE_VOLTAGE_MEASUREMENT = true;

Connected this way:

ESP32 Display WS14747
G23 DIN
G18 CLK
G5 CS
G17 DC
G16 RST