Prezentuję kolejny mały projekt zrealizowany na ESP32. Tym razem padło na ESP32-S3-Zero czyli malutka płytka, wielkości 2 złotówki.
Zaskoczyło mnie jak prosto można pobrać informacje za pomocą BLE z taniego adaptera OBD2 na ELM327.
Głównym celem było pobieranie informacji i wyświetlanie na telefonie dwóch parametrów w czasie (prawie) rzeczywistym:
- aktualnej prędkości samochodu;
- prędkości obrotowej silnika.
Dodatkowo urządzenie pokazuje temperaturę płynu chłodzącego i temperaturę powietrza dolotowego. Są to informacje pomocnicze, dlatego odświeżane są rzadziej, aby nie obciążać niepotrzebnie komunikacji z ECU.
Drugim założeniem była możliwość używania urządzenia w różnych samochodach. W tym celu adres wybranego adaptera BLE nie jest wpisany na stałe w programie. Jest wybierany z poziomu strony konfiguracyjnej i zapisywany w pamięci flash ESP32.
Do komunikacji z telefonem wykorzystano Wi‑Fi w trybie Access Point.
ESP32 tworzy własną sieć (parametry do zmiany w kodzie programu):
SSID: OBD2-ESP32
Hasło: 12345678
Adres: http://192.168.4.1
Dane na ekranie są przesyłane przez WebSocket, dzięki czemu strona nie musi być odświeżana w całości przy każdej zmianie wartości.
Odczyty prędkości i RPM są wykonywane naprzemiennie. Dzięki temu adapter nie otrzymuje kilku poleceń jednocześnie, co poprawiło stabilność komunikacji.
Konfiguracja adaptera
Po pierwszym uruchomieniu ESP32 nie korzysta z żadnego z góry ustalonego adresu MAC. Użytkownik otwiera stronę:
http://192.168.4.1/obd
Następnie uruchamia skanowanie BLE. Lista pokazuje znalezione urządzenia wraz z:
nazwą;
adresem MAC;
typem adresu BLE;
poziomem sygnału RSSI.
Po wybraniu właściwego adaptera jego adres oraz typ są zapisywane w pamięci NVS przy użyciu biblioteki Preferences. Dane zapisane w ten sposób pozostają po restarcie ESP32.
Przy kolejnych uruchomieniach urządzenie korzysta bezpośrednio z zapisanego adaptera. Nie trzeba ponownie skanować otoczenia ani ręcznie wpisywać adresu MAC.
Przed uruchomieniem programu należy włączyć zapłon. Sam moduł BLE może być widoczny bez zapłonu, ale komunikacja z ECU zwykle nie będzie wtedy możliwa.
Podczas pierwszego uruchomienia warto:
włożyć adapter do gniazda OBD2;
włączyć zapłon;
rozłączyć telefon od adaptera, jeśli był wcześniej używany;
uruchomić ESP32;
połączyć telefon z siecią Wi‑Fi ESP32;
wejść na stronę konfiguracji adaptera;
wybrać właściwe urządzenie z listy.
Ważne było także ograniczenie liczby komend wysyłanych do ELM327.
Tanie klony tych adapterów nie zawsze dobrze radzą sobie z bardzo szybkim odpytywaniem.
W tym przypadku użyto adapter podobny jak na zdjęciu:
W finalnej wersji:
- prędkość i RPM są odczytywane naprzemiennie co 250ms;
- każda komenda musi zakończyć się odpowiedzią lub timeoutem;
- między komendami zachowywany jest krótki odstęp;
- temperatury są odczytywane znacznie rzadziej;
- skanowanie BLE nie jest uruchamiane podczas aktywnego połączenia.
Takie rozwiązanie okazało się stabilniejsze niż wysyłanie kilku PID-ów w krótkich odstępach.
W projekcie znajdują się trzy główne widoki:
/ — główny dashboard
/pids — mapa obsługiwanych PID-ów
/obd — skanowanie i wybór adaptera
Załączam w archiwum zip plik projektu oraz konfiguracyjny Platformio.
Projekt został przygotowany przy wsparciu AI, więc jest dobrze udokumentowany komentarzami.
Nie gwarantuję, że jest napisany zgodnie ze sztuką i dobrymi praktykami oraz pozbawiony błędów.
To jest szybki prototyp, zamieszczam - a może kogoś zainspiruję do zrobienia swojej, lepszej wersji.
Fajne? Ranking DIY