Skip to main content
Version: ACS CC

Bluetooth distance tracker

A Bluetooth based system that estimates how far your phone is and makes a sound if it goes too far away.

info

Author: Timofte Andrei-Ioan
GitHub Project Link: Github

Description

This is a device that continuously measures, in real time, the distance between a Raspberry Pi Pico and a specific device that has Bluetooth. It scans only for whitelisted devices identified by a predefined unique identifier, reads the RSSI(Received Signal Strength Indicator) to estimate the distance, and shows the value on a small TFT LCD. With three onboard buttons, the user can set a custom distance limit. If the tracked device moves beyond that limit, the system makes a sound using a passive buzzer. Such a tool is useful for keeping personal belongings nearby or simplifying indoor localization.

Motivation

The motivation is my passion and curiosity about what Bluetooth Low Energy can achieve drove me to explore distance estimation based on RSSI.

I want to:

  • understand the practical limits of RSSI-based ranging
  • design a self-contained tracker and to learn Rust's embedded ecosystem while building something genuinely useful for everyday life

Architecture

Diagram

The system is composed of these main components:

1. Raspberry Pi Pico 2W

It does most of the computing and scanning for Bluetooth devices. Embassy's async executor multiplexes three tasks: scanning, UI and alerts. The RP2350's second core is unused.

2. BLE Scanner

Filters advertisements to a single device ID and retrieves its RSSI once per scan. It is a software task that runs the CYW43439 modem as an observer and does:

  • periodically issues scan requests(every 500 ms)
  • maintains a list of devices(target MAC or UUID) and discards all other advertisements
  • for each accepted packet, timestamps and stores raw RSSI in a buffer
  • publishes the buffered RSSI samples to the Distance Estimator over an async channel

3. Distance Estimator

Converts the RSSI stream into a single, smoothed distance value:

  • at first boot the user will record RSSI0 at a known distance d0 = 1 m
  • uses the log-distance equation d = 10^((RSSI0 − RSSI) / (10 x n)), where n is the environment-specific path-loss exponent (default 1.8 indoors)
  • a constant velocity Kalman smoother removes fast fades and outputs the distance every 250 ms

4. Buttons

Three tactile buttons used by the user to control the sound and threshold distance. The buttons are used to control the menu that is displayed onto the LCD screen.

5. Display Driver

SPI driver for an ST7735 1.8" TFT using the st7789 crate.

  • Shows a numeric distance (in metres with one decimal) for the current device.
  • Shows a bar for the current sound level.

6. Alert Handler

Generates a PWM sound on a passive buzzer whenever the measured distance is greater than the limit.

Log

Week 5 - 11 May

TODO

Week 12 - 18 May

TODO

Week 19 - 25 May

TODO

Hardware

The tracker is minimalist and everything fits on a breadboard and runs from a single Micro USB supply. The only active electronics are:

  • the Raspberry Pi Pico 2W which brings the RP2350 MCU
  • the CYW43439 Wi-Fi/BLE modem and a 1.8" SPI TFT for the user interface
  • three tactile buttons that let you control the menu
  • a passive buzzer that provides the sound alert

Aside from wires, resistors, diodes and transistors, no additional sensors or wireless modules are required. Distance estimation relies solely on the RSSI that the on-board BLE modem already outputs.

Schematics

TODO

Bill of Materials

DeviceUsagePrice
Raspberry Pi Pico 2WThe microcontroller2x35 RON
Passive BuzzerFor emitting sounds2 RON
Display TFT LCD 1.8"To display the map and menu34 RON
10 Male to male wiresWires2x5 RON
Buttons, resistors, transistorsFor connecting the components10 RON

Software

LibraryDescriptionUsage
st7789Display driver for ST7789Used for the display for the Pico Explorer Base
embadded-halHardware Abstraction LayerUsed to control the SPI and GPIO
pwmPulse width modulationFor controlling the passive buzzer
embassy-rpRP2350 support cratesUsed for initializing and interacting with peripherals
embedded-graphics2D graphics libraryUsed for drawing to the display
embedded-kalmanKalman filteringUsed for smoothing RSSI before distance computing
  1. link
  2. link