Odjezdová tabule městské hromadné dopravy v Plzni postavená na protokolu LoRaWAN a mikrokontroléru M5Stack Core2 používající data ze stránek PMDP.
Go to file
2022-12-21 12:43:32 +01:00
assets Added README banner 2022-12-20 21:21:46 +01:00
client Updated client config 2022-12-21 09:41:59 +01:00
server Added configuration 2022-12-20 19:43:27 +01:00
.gitignore Added configs to .gitignore 2022-12-20 19:44:21 +01:00
README.md Added pins to the README 2022-12-21 12:43:32 +01:00

Banner

Odjezdová tabule MHD

Odjezdová tabule městské hromadné dopravy v Plzni postavená na protokolu LoRaWAN a mikrokontroléru M5Stack Core2 používající data ze stránek PMDP.

Základní funkce

  • zobrazení aktuálního času a data
  • zobrazení nejbližších odjezdů ze zastávky se započítaným zpožděním
  • funkčnost na celém území Plzně a okolí
  • možnost filtrování zobrazovaných spojů
  • aktualizace zobrazených dat za chodu
  • automatické obnovení ztraceného připojení

🧰 Použité technologie

  • C/C++, Python, LoRaWAN
  • HTML, CSS, JavaScript, Vue.js

⚙️ Použité součástky

💡 Instalace a nastavení

Aby bylo s projektem možné pracovat, je potřeba zajistit několik následujících věcí.

Kód pro mikrokontrolér byl vyvíjen v Arduino IDE a použity byly knihovny M5Core2, M5GFX a M5-LoRaWAN. Serverová část byla vytvořena v Pythonu za použití knihoven PyYAML a Bottle, webové rozšíření poté za pomoci knihovny Vue.js (načítá se z CDN).

Pro fungování je potřeba doplnit konfigurační soubory config.yml (pro server) a config.h (pro mikrokontrolér).

Odesílání zpráv na mikrokontrolér probíhá přes REST API portálu lora.plzen.eu, kam je potřeba se zaregistrovat a nastavit údaje mikrokontroléru (detailnější informace v konfiguračních souborech).

Propojení LoRaWAN modulu s mikrokontrolérem je zajištěno pomocí rozhraní UART, je potřeba propojit následující piny:

modul mikrokontrolér
TXD G13 (RXD2)
RXD G14 (TXD2)
5V 5V
GND GND

Cíl projektu

Cílem práce je navržení a zprovoznění odjezdové tabule spojů plzeňské MHD, která bude fungovat na celém území Plzně a v blízkém okolí. Řešení bude založené na protokolu LoRaWAN a využívat bude mikrokontroléru M5Stack Core2 s komunikačním modulem LoRaWAN UNIT 868MHz (ASR6501).

Protokol

Pomocí protokolu LoRaWAN jsou přenášeny zprávy v podobě textového řetězce. Z důvodu snížení velikosti přenášených zpráv není vhodné data posílat například ve formátu JSON. Proto byl vytvořen vlastní úsporný protokol ke komunikaci s mikrokontrolérem.

Navržený protokol používá pro oddělení posílaných dat znak | a podporuje několik typů zpráv, které najdete níže.

  • data o spoji (1|4|1|Bory|104)
    • uložení či aktualizace informací o spoji
    • části:
      • identifikátor
      • číslo spoje (řetězec, např. N1)
      • typ (1 - tramvaj, 2 - trolejbus, 3 - autobus)
      • poslední zastávka
      • čas odjezdu (v minutách s desetinnou částí: 104 = 10.4 min.)
  • aktuální čas (TIME|1670453990)
    • nastavení aktuálního času a data
    • části:
      • značka, že se jedná o čas
      • čas ve vteřinách od 1. 1. 1970
  • vymazání dat (CLEAR)
    • vymazání všech uložených spojů (např. pro nahrání nových)

Architektura

Celý projekt se skládá ze dvou hlavních částí - serverové a klientské. Serverovou částí je myšlen program napsaný v Pythonu, který obstarává stahování aktuálních dat o odjezdech, jejich uchovávání, průběžnou aktualizaci a jejich odesílání prostřednictvím REST API portálu lora.plzen.eu na mikrokontrolér (klientské zařízení). Klient má poté za úkol tato data uchovávat, třídit, řadit a vhodně zobrazovat na displeji společně s aktuálním časem a datem.

Diagram

Serverová část

Jako první jsou stažena data o odjezdech do paměti, kde jsou uchovávána. Jejich aktualizace probíhá ve výchozím nastavení každých 30 sekund. V druhé fázi je zjištěno, na jaké zařízení mají být jaká data odeslána, a zařízeno jejich převedení do navrženého formátu a odeslání. Filtrovat odjezdy je možné pomocí ID zastávky, čísla linky, typu spoje (tramvaj, trolejbus, autobus) a konečné stanice. V případě zjištění změny zpoždění spoje jsou znovu odeslána data o daném spoji.

Klientská část

Mikrokontrolér je po zapnutí připojen do sítě LoRaWAN s nastavenými údaji a poté čeká na přicházející zprávy.

Po přijetí dat o spojích jsou tyto informace zapsány do paměti. Každých 6 sekund se provádí aktualizace displeje, kdy se vypíšou všechny dostupné informace. Na displej jsou vypisovány spoje seřazené podle času odjezdu od nejbližšího. Je vypsán pouze nejbližší spoj dané linky a konečné zastávky, jelikož je to pro cestující na zastávce nejdůležitější informací. Zobrazovány jsou dále pouze spoje, jejichž odjezd je za více než -0,3 minuty a za méně než 100 minut. Každou 6. vteřinu se také odečte jedna desetina minuty od odjezdu všech spojů a přičte jedna desetina minuty k zobrazovanému času.

Mikrokontrolér je schopen pracovat se všemi lokálními daty bez potřeby komunikace se serverem. Ve výchozím nastavení je však potřeba přijmout zprávu alespoň každou minut, jinak dojde k restartování spojení jak s LoRaWAN modulem, tak s LoRaWAN sítí. Díky tomu je možné znovu navázat spojení s modulem po jeho odpojení a připojení nebo obnovit spojení se sítí.

Webový server

Získaná data je díky webovému rozhraní a REST API na serverové části možné využít i k jiným účelům. Na vytvořeném HTTP serveru se nachází jednoduché rozhraní zobrazující odjezdy z vybrané zastávky, čehož je možné využít například k integraci odjezdů MHD na nástěnku v aplikaci Home Assistant nebo na jinou webovou stránku.

REST API

  • GET /stops
    • seznam sledovaných zastávek
  • GET /departures/:id
    • odjezdy ze zadané zastávky
    • :id nahraďte identifikátorem

Integrace do aplikace Home Assistant

  1. Otevřete ovládací panel v aplikaci Home Assistant
  2. Zvolte další možnosti (tři tečky v pravém horním rohu) a možnost "Upravit ovládací panel"
  3. Přidejte novou kartu v podobě webové stránky
  4. Vložte URL adresu HTTP serveru
  5. Nastavte libovolný poměr stran a uložte