A Flutter Android app that intercepts Google Maps turn-by-turn navigation notifications and relays them in real time to a Raspberry Pi Zero W, which displays directional arrows and instruction text on an ST7735 1.8" LCD screen.
No API keys. No internet required. Works entirely on your local Wi-Fi network.
الاستماع
|
سجل الاحداث
|
الاعدادات
|
- The Android app listens to Google Maps notifications using
NotificationListenerService - Each turn instruction is sent via HTTP POST to the Raspberry Pi server
- The Pi renders a clean directional arrow + instruction text on the ST7735 display
- When navigation ends, the screen automatically returns to the idle waiting state
| Component | Model / Spec |
|---|---|
| Single-board computer | Raspberry Pi Zero W (or any Pi with GPIO) |
| Display | ST7735 — 1.8 inch — 160×128 pixels |
| Android phone | Any device running Android 9+ |
| Power supply | 5V micro-USB for Pi Zero W |
| Network | Shared Wi-Fi router or phone hotspot |
| ST7735 Pin | Function | Pi GPIO (BCM) | Physical Pin | Notes |
|---|---|---|---|---|
| VCC | Power | 3.3V | Pin 1 | |
| GND | Ground | GND | Pin 6 | Common ground |
| SCL / SCLK | SPI Clock | GPIO 11 | Pin 23 | Bitbang SPI |
| SDA / MOSI | SPI Data | GPIO 10 | Pin 19 | Bitbang SPI |
| CS / CE | Chip Select | GPIO 8 | Pin 24 | CE0 |
| DC / RS | Data/Command | GPIO 24 | Pin 18 | |
| RES / RST | Reset | GPIO 25 | Pin 22 | |
| BL / LED | Backlight | 3.3V | Pin 17 | Always on |
💡 Notes:
- The ST7735 must be powered from the 3.3V pin of the Pi — never use 5V!
- All GND pins must share a common ground with the Pi.
- This project uses bitbang SPI (software SPI) — no need to enable hardware SPI in
raspi-config. - Screen orientation is landscape
rotate=2— no physical flip needed.
Connect the Pi Zero W to the same Wi-Fi network as your Android phone. You can use a shared router or the phone's hotspot.
To Get IP from your phone seting
# set up your raspberry pi wifi seting
> sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
network={
ssid="HomeWiFi or phonewifi"
psk="**********************"
}
> sudo wpa_cli -i wlan0 reconfigure
> sudo reboot
ip=**.*39.105.40
|
flutter pub get
flutter runOr install the APK directly on your device.
The app needs permission to read notifications. On first launch it will prompt you — tap "فتح الإعدادات" and enable access for MapSniff.
permission
|
You can also open it manually:
Settings → Apps → Special App Access → Notification Access → MapSniff ✓
In the app, go to الإعدادات tab and set:
IP : **.39.105.40 ← your raspberry pi IP
Port: 5000
Tap اختبار to verify the connection, then tap حفظ الإعدادات.
Go to the main tab and tap بدء الإرسال. Open Google Maps, start navigation — the display will mirror every turn instruction in real time.
listening
|
| Direction | Arabic keywords | English keywords |
|---|---|---|
| ↑ Straight | استمر، واصل | continue, head |
| → Right | يمين، يميناً، انعطف يمين | right, turn right |
| ← Left | يسار، يساراً، انعطف يسار | left, turn left |
| ↩ U-Turn | دوران للخلف، استدر، ارجع | u-turn, uturn |
| ⟳ Roundabout | دوار، الدوار | roundabout, rotary |
| 📍 Arrived | وصلت، الوجهة | arrived, destination |
You can 3D print a custom case to house the Raspberry Pi Zero W and the ST7735 display together in a clean enclosure.
Leave openings for the screen, micro-USB power port, and ventilation slots.
Use PETG or PLA for the best results.
The case was modeled in Blender.
From the 3DFile folder the project includes:
| Endpoint | Method | Description |
|---|---|---|
/ping |
GET | Health check — returns {"status":"ok"} |
/nav |
POST | Send navigation instruction {"text":"..."} |
/reset |
POST | Force idle screen (navigation ended) |
Rive anmi + icon app Rive app
MapSniff/
├── lib/ # Flutter app
│ ├── main.dart
│ ├── home_screen.dart
│ ├── main_tab.dart
│ ├── log_tab.dart
│ ├── settings_tab.dart
│ ├── providers/
│ │ └── nav_provider.dart
│ ├── services/
│ │ └── pi_service.dart
│ ├── models/
│ │ └── log_entry.dart
│ └── widgets/
│ ├── status_card.dart
│ └── instruction_card.dart
├── android/ # Android native code
│ └── app/src/main/kotlin/
│ ├── MainActivity.kt
│ └── NavNotificationListenerService.kt
├── pi_server/
│ └── server.py. # Raspberry Pi Python server هنا ملف الروز بيري باي
└── 3DFile/
├── case.stl
└── cover.stl
# 3D printable case files هنا ملف الطباعة













