Po co powstał ten projekt?
Jeśli działasz w cyfrowym radiu DMR i chcesz mieć stały podgląd aktywności na wybranym kanale (TalkGroup) bez potrzeby odpalania komputera, ten projekt jest dla Ciebie.
Zbudowałem przenośny monitor DMR oparty o ESP32, który łączy się przez WiFi z siecią BrandMeister, wyświetla na kolorowym ekranie TFT 4″ aktualnie nadającego operatora, historię ostatnich transmisji, czas trwania nadawania i zapisuje logi na kartę SD. Wszystko w jednym, kompaktowym urządzeniu.
Co dokładnie robi ten program?
Program działa w pętli, nasłuchując na WebSocketach danych z BrandMeister i reagując na pojawiający się ruch w TalkGroup 260. Oto jego główne funkcjonalności:
📡 Łączność z BrandMeister przez WebSocket
Nawiązuje bezpieczne połączenie (SSL) z API BrandMeister.
Subskrybuje wszystkie zdarzenia (
join everything).Automatycznie wznawia połączenie w razie przerwania.
👤 Wyświetlanie aktywnego operatora
Pokazuje znak wywoławczy (np.
SP5XYZ).Wyświetla imię operatora lub alias TalkerAlias.
Podaje ID operatora oraz numer TalkGroup.
Mierzy i wyświetla czas trwania bieżącej transmisji (format MM:SS).
📜 Historia ostatnich operatorów
Przechowuje w pamięci ostatnich 4 operatorów (maksymalnie).
Wyświetla ich znak, nazwę, TG oraz godzinę transmisji.
Unika duplikowania tego samego operatora z rzędu – jeśli ten sam wraca, aktualizuje tylko znacznik czasu.
💾 Logowanie do pliku CSV na karcie SD
Każda zakończona transmisja jest zapisywana w pliku
/dmr_log.csvna karcie SD.Log zawiera: datę i godzinę rozpoczęcia, datę i godzinę zakończenia, znak, nazwę, ID, TG oraz czas trwania w sekundach.
Automatycznie tworzy nagłówek pliku, jeśli nie istnieje.
Zapisane dane możemy odczytać w programie który czyta pliki *.csv.
Przykładowe dane zapisane na karcie SD:
🎨 Przyjazny interfejs użytkownika
Wyświetlacz TFT 4″ (480×320 px) z płynną obsługą graficzną.
Ikona radia zmienia kolor w zależności od stanu RX.
Wizualizacja trwania transmisji za pomocą animowanego paska (fale radiowe).
Zegar NTP (synchronizacja czasu z Internetu) w prawym górnym rogu.
Status połączenia z BrandMeister – zielone/czerwone kółko.
🔧 Konfiguracja z karty SD
Dane WiFi (SSID i hasło) są odczytywane z pliku
config.txtna karcie SD – nie musisz ich hardkodować w programie. W ten sposób nie musisz ingerować w program by zalogować się do swojej sieci WiFi. Wystarczy zmienić dane na karcie SD.Format pliku:
SSID=moja_siec PASS=moje_haslodane te zapisujemy na karcie SD w pliku o nazwie config.txt
Co znajduje się w środku? – zaglądamy do kodu
Kod ma około 1800 linii i jest podzielony na logiczne sekcje. Oto najważniejsze fragmenty:
🔹 Komunikacja z BrandMeister
Sercem programu jest obsługa WebSocket. Funkcja webSocketEvent()
odbiera dane JSON, które przychodzą w dwóch zagnieżdżonych warstwach –
najpierw wyciąga właściwy payload, potem deserializuje go i sprawdza,
czy DestinationID pasuje do monitorowanego TG (260). Jeśli tak – wywołuje nowaAktywnosc().
🔹 Logika końca transmisji
Funkcja sprawdzKoniecRX()
sprawdza, czy od ostatniego odebranego pakietu minęło więcej niż 2500
ms. Jeśli tak – uznaje transmisję za zakończoną, zapisuje log na SD i
przełącza ekran w stan czuwania.
🔹 Efektowny interfejs
Użyłem bibliotek Adafruit GFX i ST7796S do obsługi wyświetlacza. Funkcja rysujIkoneRadia() rysuje ikonę, która świeci na zielono podczas odbioru, a na ciemnoszaro w stanie czuwania. Animacja RX (animacjaRX()) to paski imitujące fale radiowe – odświeżane co 150 ms.
🔹 Historia i logika deduplikacji
dodajDoHistorii()
przesuwa starsze wpisy w dół i wstawia nowego operatora na pierwszą
pozycję. Co ważne – jeśli ten sam operator pojawia się ponownie, nie
jest dodawany drugi raz, a jedynie aktualizowany jest jego znacznik
czasu.
Jak uruchomić ten projekt na swoim ESP32?
Potrzebne elementy
ESP32 (np. Wemos D1 R32, NodeMCU-32S) Ja zrobiłem to na ESP32 WROOM-32U.
Wyświetlacz TFT z kontrolerem ST7796S (lub kompatybilny, 4″ 480×320 px SPI)
Karta microSD (do zapisu logów i konfiguracji)
Kabel USB, zasilanie 5V
Nie zamieszczam schematu bo na podstawie definicji pinów można to zrobić bez problemu.
Konfiguracja
Sformatuj kartę SD jako FAT32.
W katalogu głównym karty utwórz plik
config.txto zawartości:SSID=TwojaNazwaWiFi PASS=TwojeHasloWiFiZainstaluj wymagane biblioteki w Arduino IDE lub PlatformIO:
WiFi.hWebSocketsClient.hArduinoJson.h(wersja 6.x)Adafruit_GFX.hAdafruit_ST7796S_kbv.hSD.htime.h
Sprawdź piny w sekcji
KONFIGURACJA SPRZETOWA– dopasuj do swojej płytki.Skompiluj i wgraj na ESP32.
Niektóre piny są zdublowane dla wyświetlacza i karty SD. To nie jest błąd. TAK MA BYĆ!
Dla kogo jest ten projekt?
Krótkofalowców i pasjonatów łączności cyfrowej DMR.
Twórców projektów IoT szukających ciekawego zastosowania dla ESP32.
Programistów embedded, którzy chcą zobaczyć, jak integrować WebSocket, JSON i wyświetlacz w jednym urządzeniu.
Podsumowanie
Projekt pokazuje, jak z pozornie prostego mikrokontrolera można zbudować zaawansowane urządzenie monitorujące z graficznym interfejsem, zapisem danych i komunikacją przez Internet. Kod jest napisany przejrzyście, z podziałem na funkcje, co ułatwia modyfikacje – na przykład można zmienić monitorowany TalkGroup, dodać więcej historii lub zintegrować z własnym API.
NOWA WERSJA I NOWE MOŻLIWOŚCI
DMR Monitor HF5WWL - Wersja 4.3 MULTI z obsługą wielu grup
Co nowego?
Najważniejszą zmianą w wersji 4.3 MULTI jest możliwość monitorowania wielu grup DMR jednocześnie. Dotychczas urządzenie śledziło wyłącznie polską grupę 260. Teraz możesz dowolnie konfigurować, które grupy chcesz obserwować.
Jak to działa?
Plik konfiguracyjny monitored_tg.txt
Na karcie SD wystarczy utworzyć plik monitored_tg.txt i wpisać w nim numery grup, które chcemy monitorować. Każda grupa w osobnej linii:
260
26077
260042
1
2Nowa funkcja: monitorowanie wszystkich grup z prefiksem 260
Jeśli chcesz śledzić wszystkie grupy zaczynające się od 260 (np. 260, 26077, 260042, 260123, itd.), wystarczy wpisać w pliku:
260*To szczególnie przydatne, gdy interesują Cię wszystkie lokalne grupy w Twoim regionie.
Łączenie opcji
Możesz też łączyć oba sposoby:
# Wszystkie grupy z prefiksem 260
260*
# Dodatkowo inne grupy
1
2
3 Monitor oczekuje na aktywność na wybranych grupach:Zmieniły się też zapisy w logu. Teraz wyglądają tak:Co z dotychczasową funkcjonalnością?
Działanie z grupą 260 - jeśli brak pliku
monitored_tg.txt, program domyślnie monitoruje grupę 260 (zgodnie z poprzednią wersją)Logowanie do CSV - bez zmian, nadal zapisuje wszystkie aktywności
Wyświetlacz i interfejs - bez zmian, zachowano dotychczasowy wygląd
Połączenie z BrandMeister - bez zmian
Przykładowe zastosowania
Monitorowanie lokalnych grup - wpisz wszystkie lokalne grupy w swoim regionie
Śledzenie konkretnych rozmów - dodaj tylko interesujące Cię grupy
Obserwacja ruchu w całym prefiksie 260 - użyj
260*Mieszane - monitoruj grupę 260, wszystkie podgrupy 260 i dodatkowe grupy zagraniczne
Wymagania
Karta SD z plikami:
config.txt- dane WiFi (SSID i hasło)monitored_tg.txt- lista grup do monitorowania (opcjonalnie)Plik dmr_log.csv zostanie utworzony automatycznie o ile go już nie utworzono.
Kompatybilność
Zmiany są w pełni kompatybilne wstecznie. Jeśli nie utworzysz pliku monitored_tg.txt, program zachowa się identycznie jak poprzednia wersja i będzie monitorować tylko grupę 260.
Podsumowanie
Nowa wersja DMR Monitora daje użytkownikowi pełną kontrolę nad tym, które grupy chce obserwować. To proste, ale bardzo użyteczne ulepszenie, które sprawia, że urządzenie staje się jeszcze bardziej wszechstronnym narzędziem do monitorowania ruchu DMR.
Krótki filmik prezentujący pracę prototypu.
Cały kod w formacie *.bin możesz otrzymać bezpłatnie po kontakcie przez e-mail
- Jeżeli do mnie napiszesz możesz dostać program z usuniętym moim znakiem (wpiszę Twój znak).
✍️ Autor: Robert HF5WWL
📅 Data projektu: Lipiec / sierpień 2026 r.
📍 Lokalizacja: Wołomin, POLSKA
📁 Coś nie jasne? Pytaj poprzez e-mail (hf5wwl@gmail.com) lub w komentarzu
🛠️ Poziom trudności: Łatwy (jak się ma oprogramowanie) 😊
#HamRadio
#DMRradio
#TalkGroup260
#AmateurRadio
#DigitalRadio
#RadioMonitor
#SP5WWL
















