Android · ELM327 over Bluetooth LE · no account, no cloud

Every trip on a map — straight from the OBD-II port.

OBD Trip Map connects to a cheap ELM327 adapter over Bluetooth LE, reads speed and fuel flow from the engine bus, draws your route in real time coloured by speed, consumption or acceleration — and keeps a history you can actually analyse.

Version 1.0 · 10.3 MB · Android 8.0+. Signed with a developer key and installed outside Google Play — see how to install. The app interface is currently in Russian.

Bluetooth LE adapter OpenStreetMap, offline after the first pass Everything stays on the phone

Trip detail screen: a highway route out of Prague drawn on an OpenStreetMap map, coloured from green in town to orange and red on the motorway, with distance, fuel, average consumption and top speed below
0buttons to press — trips start and stop on their own
3colour modes for the track: speed, consumption, acceleration
7OBD protocols tried until the car answers
100%of your data stays on the phone — no account, no cloud

What it does

A trip computer that remembers, on a map that explains.

The car already measures everything — speed, air flow, revs, fuel level. OBD Trip Map takes those numbers off the bus three times a second, ties them to GPS and shows where exactly the fuel went.

Starts and stops by itself

Plug the adapter in once. Between trips the app sleeps with no notification; Android wakes it when the adapter appears in the air or the phone connects to the car’s head unit. Engine running — the trip opens; three minutes of silence on the bus — it closes. Survives a reboot.

A live dashboard

Speed, instant consumption (L/100 km on the move, L/h at a standstill), acceleration, RPM, litres in the tank, coolant temperature. Below: distance, fuel, average and time for the current trip. A status line shows the protocol and which PIDs actually answered.

Track coloured on the fly

Speed, consumption or acceleration — switch while driving. Speed thresholds are yours to set. A car marker turns with the heading, computed over a 12-metre window so GPS noise doesn’t spin it at traffic lights.

Fuel from the bus, not a guess

Three sources in order of preference: the ECU’s own fuel rate (PID 5E), the mass air-flow sensor (MAF, stoichiometric 14.7 : 1) or a speed-density estimate when there is no MAF. The source is chosen by real requests — not by the support bitmap that clones lie about — and re-probed if it goes silent.

Honest acceleration

A least-squares slope of speed over a 1.5-second window. Speed arrives in whole km/h, so differencing neighbours would give ±1.1 m/s² of noise on a flat road — this doesn’t. It is shown live, written into every track point and used as a filter in the analysis.

History with route thumbnails

Every trip with distance, fuel, average, top speed and time, plus a thumbnail of the route drawn from the track itself — instantly and offline. Open a trip for the map in any colour mode, the totals and the speed / consumption / acceleration charts.

Analysis that survives the numbers

Consumption vs steady speed with a p25–p75 corridor, sample completeness per speed, a heatmap of speed × acceleration, a slice showing what accelerating costs against cruise, and period comparison by month, weekday or earlier vs later.

OpenStreetMap, offline after the first pass

No API keys, no Google Play Services. Every tile the map has shown is kept for a year, up to 600 MB, so the roads you actually drive stay available without a connection.

Built for ELM327 clones

Four known BLE profiles plus a fallback, a full init sequence, protocol enumeration when auto-detect fails, response re-synchronisation, re-initialisation after 45 s of silence, and a retry pause that grows from 5 s to 5 min instead of hammering the adapter.

History that never overflows

A storage limit you choose (500 MB by default). Past it, the oldest trips are archived: thinned to 4 000 points and gzipped about 12× — they stay in the list with all their totals and open a little slower.

Nothing leaves the phone

No account, no cloud, no analytics. The only network traffic is map tiles from OpenStreetMap. Trips live in a local database you can cap and clear.

When the bus is silent, you can see why

A log of everything said to the adapter and heard back, kept for seven days. The protocol that worked is remembered and tried first next time. Optional pairing for adapters that support it.

How it works

Plug in once. The rest happens while you drive.

Plug an ELM327 BLE adapter into the OBD-II socket

It sits under the dashboard of any car sold in the EU since 2001 (petrol) or 2004 (diesel), and in the US since 1996. Pick the adapter in the app once.

Start the engine

The app wakes up, connects, finds the protocol the car speaks and opens a trip — no taps. Revs above 300, or any speed, or any fuel flow count as “engine running”.

Drive

Three times a second the bus is polled for speed, revs and fuel; GPS adds the position. The map colours the track as you go, a car marker turns with your heading.

Look back

The trip lands in the history with its map and charts. The analysis screen aggregates every trip you have driven — filter by speed and acceleration, compare months.

Screens

Dark, dense, made to be glanced at from the driver’s seat.

Big monospaced readouts that don’t jump around, panels with outlines instead of shadows, one theme. Charts are interactive: tap or hold to read the value, and every chart has an “i” that explains where the number came from.

Screenshots show demo trips. Map data in screenshots © OpenStreetMap contributors.

Analysis

What does your car really burn at 90?

Instant consumption is a noisy number: on a pull-away it goes into the hundreds, on a downhill it drops to zero. The analysis screen is built around making it mean something.

  • Steady-speed filter

    Keep only samples where |acceleration| ≤ 0.2 m/s² — the car was cruising. Without it, the median “at 60 km/h” mixes steady driving with accelerating to a hundred.

  • Curve with a corridor

    Median per 10 km/h bin with the p25–p75 band filled in. The band matters more than the line: where it is wide, the number is not to be trusted. Bins with fewer than five samples are dropped.

  • Two dimensions at once

    A heatmap of speed × acceleration, and a slice for any speed band: fuel flow against acceleration with the cruise baseline. Litres per hour here, not L/100 km — the honest unit for a pull-away.

  • Periods side by side

    The same curve per month, per weekday or split in half by time. That is how you see winter fuel, a tyre change or a new route in the data, not in your memory.

  • A histogram that stays readable

    Trimmed at the percentiles, a “round” bin step picked automatically or set by hand (0.2 / 0.5 / 1 / 2), a cap on the number of bins, and a sample summary so “not enough data” always says why.

Consumption vs steady speed with a p25–p75 corridor
Heatmap of consumption over speed and acceleration

Compatibility

A phone, a ten-dollar adapter and any car with an OBD-II socket.

Phone

  • Android 8.0 (API 26) or newer
  • Bluetooth LE (any phone from the last decade)
  • GPS for the track — the bus data is recorded even without it
  • No Google Play Services required

Adapter

  • ELM327-compatible over Bluetooth LE (“BLE”, “Bluetooth 4.0”) — Vgate iCar Pro BLE, Konnwei KW902, OBDLink CX, generic “OBDII BLE” dongles
  • Not supported: classic Bluetooth (SPP) and Wi-Fi adapters
  • Pairing is optional — most clones don’t support it anyway
ServiceTypical hardware
FFE0HM-10 and compatibles — the most common
FFF0Vgate iCar, some Konnwei
6E400001…Nordic UART Service
18F0some VLink / OBDLink
anyfallback: first service with NOTIFY + WRITE characteristics

Car

  • Anything that answers standard OBD-II mode 01 PIDs — no brand-specific code
  • Developed on a Škoda Rapid 2022 (1.6 MPI); petrol engines with a MAF sensor get the most accurate consumption
  • Protocols: ISO 15765-4 CAN (11/29-bit, 250/500 kbit), ISO 14230-4 KWP fast init, ISO 9141-2
  • Mode 01 only: no fault codes, freeze frames or adaptations

Permissions and why they are needed

PermissionWhy
Bluetooth (scan, connect)Find the adapter and talk to it; also lets Android wake the app when the adapter or the car’s head unit appears
Location (fine, coarse, background)The track. Background access is what lets a trip record with the screen off
NotificationsAndroid requires a visible notification while a service records in the background — only during a trip
InternetOpenStreetMap tiles. Nothing else is sent anywhere

Download

Get the APK

Free, no account, no ads. The app is not on Google Play — install it from this page.

Version 1.0 10.3 MB Android 8.0+ Package io.dodo.obdmap

SHA-256 32c1c17282825fe71e8d2e124e97f2bda6cb46a2a55c0419e8472a62cc36e09a

Russian interface. The app’s UI is currently Russian-only; this page is the English documentation for it.

Installing

  1. Download the APK on the phone — or download it here and send it to the phone any way you like.
  2. Open the file. Android will ask to allow installs from your browser or file manager — allow it for this one install.
  3. Grant permissions on first launch: Bluetooth, location (choose “all the time” for background recording) and notifications.
  4. Pick the adapter from the list, optionally the car’s head unit in settings — and drive. The first trip starts by itself.

Aggressive firmware. On Xiaomi, Huawei, Honor and similar phones add the app to battery-optimisation exceptions, otherwise the recording service gets killed mid-trip.

Developer-signed build. The APK is signed with a developer key, not a store one. Updates are installed the same way, over the top, with history kept.

FAQ

Questions people ask before the first trip

The log says UNABLE TO CONNECT. Is Bluetooth broken?

No — that message comes from the ELM327 itself and means it could not reach the car’s diagnostic bus; the Bluetooth link is fine. Check, in order:

  1. Is the ignition on? With the engine off and no ignition the ECUs are not powered.
  2. Is the adapter pushed all the way in? The OBD-II socket often holds loosely.
  3. Is another app holding the adapter? A second connection blocks the bus.
  4. What did the seven protocols answer? The app logs each one. If all are silent, the protocol is not the problem.
The consumption differs from my trip computer.

Unless your ECU reports fuel rate directly (PID 5E — rare on VAG), consumption is computed from the mass air-flow sensor at a stoichiometric 14.7 : 1 and 745 g/L petrol. At steady speed it usually agrees with the trip computer within a few percent; under hard throttle changes it diverges. The speed-density estimate (no MAF at all) is noticeably rougher.

Distance comes from GPS, not from integrating bus speed — integrating drifts and “moves” when parked.

Why is there a notification during a trip?

Because Android requires it: background work with location and Bluetooth is only allowed to a foreground service, and a foreground service must show a notification. Between trips there is none — the app sleeps and the system wakes it when the adapter or the car’s head unit appears. If you prefer instant starts, the “keep the connection always” mode is in the settings, at the cost of a permanent notification.

Can I download the map for my region in advance?

No, and it is deliberate: the standard OpenStreetMap tile server forbids bulk downloads and the map library enforces that. The cache fills honestly instead — everything the map has shown during a trip stays on the phone for a year (up to 600 MB) and opens offline later.

Does it work with classic Bluetooth or Wi-Fi ELM327 adapters?

No. The app talks Bluetooth LE (GATT) only. Look for “BLE” or “Bluetooth 4.0” on the adapter — Vgate iCar Pro BLE, Konnwei KW902, OBDLink CX and most generic “OBDII BLE” dongles work. Classic Bluetooth (SPP) and Wi-Fi adapters are not supported.

My adapter is always powered — will trips start on their own?

Yes, with one setting. Some cars (VAG among them) keep +12 V on the OBD socket permanently, so the adapter is visible in the air around the clock and “adapter appeared” is not a useful signal. Choose your car’s head unit or hands-free in Settings → Car Bluetooth: the phone connecting to it is a reliable “engine started”. The app also refuses to react to the adapter for 20 minutes after a trip ends, so it doesn’t restart every minute in the car park.

Will a dropped connection split my trip in two?

Not a short one. If the link comes back within three minutes the trip continues; GPS points from the gap join the route but are drawn grey, because nobody knows the speed on that stretch. Longer than three minutes — the trip closes and the next connection opens a new one.

What data is collected and where does it go?

Nowhere. Trips are stored in a local database on the phone, with a size limit you set; there is no account, no cloud sync and no analytics. The only network requests are for OpenStreetMap map tiles.