109 lines
6.7 KiB
Markdown
109 lines
6.7 KiB
Markdown
![Banner](/assets/banner.png)
|
|
|
|
# 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
|
|
|
|
- [M5Stack Core2](https://shop.m5stack.com/products/m5stack-core2-esp32-iot-development-kit)
|
|
- [LoRaWAN UNIT 868MHz (ASR6501)](https://shop.m5stack.com/products/lorawan-unit-868mhz-asr6501-with-antenna)
|
|
- kabely k propojení
|
|
|
|
### 💡 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](https://github.com/m5stack/M5Core2/), [M5GFX](https://github.com/m5stack/M5GFX) a [M5-LoRaWAN](https://github.com/m5stack/M5-LoRaWAN). Serverová část byla vytvořena v Pythonu za použití knihoven [PyYAML](https://pyyaml.org/) a [Bottle](https://github.com/bottlepy/bottle), webové rozšíření poté za pomoci knihovny [Vue.js](https://vuejs.org/) (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](https://documenter.getpostman.com/view/17338/plzen-lora-20/7LjE5H2) portálu [lora.plzen.eu](https://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](https://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](/assets/architektura.svg)
|
|
|
|
### 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](https://home-assistant.io) 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
|