Fejlesztői dokumentáció - GaborPinter/Automatikus_parkolohaz GitHub Wiki

Automatikus parkolóház
fejlesztői dokumentáció

Feladatunk egy automatikus parkolóház elkészítése volt, ennek a fejlesztői részét szeretnénk bemutatni.

Tervezési fázis

Miután megkaptuk a feladatot, elkezdtük tervezni, hogy milyen módon oldjuk meg a lehető legjobban ezt a projektet. Először az Arduino nevű mikrovezérlőn szerettük volna megvalósítani a terveinket, de aztán rátaláltunk a Raspberry Sense HAT nevű kiegészítőre.

Felhasznált eszközök

- Raspberry Pi 3 Mobel B+
- Raspberry Sense HAT

Ezeket szeretnénk néhány mondatban bemutatni.

Az eszközök rövid bemutatása

Első sorban szeretnénk néhány mondatban bemutatni az eszközt, hiszen fontos, hogy megértsük, hogy mivel dolgozunk. Kettő eszközt használunk, a Raspberry Pi 3 Model B+ alaplap, illetve a hozzá külön csatlakoztatható Raspberry Sense HAT. Elösszőr az alaplapot szeretnénk bemutatni.

Raspberry pi 3b+ specifikációk :
- CPU : Broadcom, Cortex-A53 64-bit , 1.4 GHz
- Memória : 1 GB SDRAM
- USB : 4 x USB 2.0
- HDMI kimenet
- SD kártya támogatás

Nem csak a processzor sebesség növekedett, hanem új WIFI vezérlőt és BlueTooth chip-et kapott a leújabb Raspberry Pi 3 Model B+. Kétsávos 2.4 GHz és 5 GHz-en működő WIFI 802.11.b/g/n/ac került bele. Valamint már a 4.2-es Bluetooth protokollt és BLE-t is támogat. Így nagyszerű loT eszközöket lehet építeni belőle. Az ethernet interfész is tovább gyorsult. Mostmár gigabit interfész van az alaplapon, mely maximális sebessége 300Mbps. Ez a Gigabit Ethernet over USB 2.0-nak köszönhető. Az egyik legfontosabb tulajdonsága, hogy az a legújabb Raspberry Pi 3 Model B+ is PI-HAT kompatibilis. Akár a következő ötleteket is meg lehet valósítani ezzel a készülékkel: Robot vezérlésére tökéletes, használható lakás automatizálására, Szervert és cloud szervert lehet vele üzemeltetni, stb.

Most pedig néhány szót a Sense HAT kiegészítőről.
A RaspBerry Pi és a Sense HAT összekapcsolása nagyon sok izgalmas lehetőséget nyújt. A szenzorok segítségével olyan helyeken is lehet kutatásokat végezni, ahova az ember nem, csak egy Raspberry fér be. Ott meg lehet mérni például, milyen gyorsan mozog a Pi (sebességmérés), mekkora a levegő hőmérséklete, páratartalma, mi a térbeli elhelyezkedése a PI-nek, stb. A 8x8-as LED Mátrixon kijelezhetők a különböző szenzorokról érkező adatok, egy iránytű programmal a mágneses északi irányt mutathatjuk vagy egyszerűen csak játszhatunk vele Tetrist, Pongot. Egy klassz kis joystick is helyet kapott a modulon. A joystickkal beavatkozhatsz a Raspberry PI Sense HAT futó programjaiba is. Egy izgalmas kiegészítő modul Raspberry Pi-hez, amely a Nemzetközi Űrállomás tudományos programjában is szerepel. Gyorsulásmérőjével meghatározhatók a térbeli mozgás paraméterei, ezentúl 3D gyroscope és magnetométer is található a modulon. A tudományos kísérletekhez elengedhetetlen hőmérséklet, páratartalom és légnyomás szenzorok is helyet kaptak rajta.

Az eszköz üzembe helyezése

Miután tisztába vagyunk azzal, hogy mivel fogunk dolgozni, a következő lépés az eszköz összeszerelése.
Szükséges eszközök: 1 darab HDMI kábel, 1 darab legalább 2.5 A tápegység, 1 darab billentyűzet, 1 darab egér, 1 darab monitor, aminek van HDMI csatlakozója, 1 darab mikro SD kártya, amire előre telepítve van a Raspbian OS

Az összeszerelés lépései:
1) Az egér és a billentyűzet csatlakoztatása az USB portokon keresztül
2) A HDMI csatlakoztatása a monitor és a raspberry portjához
3) Utolsó lépésként pedig a tápegységet kell csatlakoztatni

Ha a leírtaknak megfelelően elvégeztük a szükséges lépéseket, akkor a pi 3 B+ alaplap egyből be fog kapcsolni, amint csatlakoztattuk a tápegységet. A bekapcsolás után nincs más dolgunk, mint az asztalon található beadando.py nevű Thonny fájlt megnyitni, ezután pedig a képen bekarikázott zöld nyílra kell kattintani és elindul a program.

Felmerülő problémák

A fejlesztés során túl sok problémába nem ütköztünk bele, de amikor igen, akkor az rengeteg időt és energiát igényelt a felkutatása és kijavítása.

Az első gonddal már a legelején találkoztunk, amikor megpróbáltuk megrendelni a szükséges alaplapot és a hozzá tartozó kiegészítőt. Meglátogattunk személyesen is, illetve az interneten is körbe néztünk rengeteg boltot és áruházat, de sajnos mindenhol azt kaptuk válaszul, hogy chiphiány van a koronavírus miatt és majd csak hónapok múlva lesz újra készleten. Végül az interneten keresztül találtunk rá az egyetlen darabra, amit azonnal meg is rendeltünk. A Sense Hat kiegészítőt már sokkal könnyebben meg tudtuk szerezni.

A második probléma Sense Hat-on az volt, hogy a pixelek egymás után úgy jelenjenek meg, hogy az előtte lévő pixel kialudjon. Ez a funkció az autók mozgásához kellettek. Rengeteg tesztelés és interneten töltött idő után rátaláltunk a sleep nevű metódusra. A pixelek megfelelő időben való felvillanását azaz az autók mozgatását a Sleep() metódussal oldottuk meg ami vár egy értéket hogy mennyit várjon a program a felvillanás előtt. A Sleep() metódust a Time nevű belső könyvtárból importáltuk.

Itt látható a megoldásunk:
for i in range(63,58,-1):
sleep(0.5)
if i != 59:
t[i] = red
if i <63 or i == 60:
t[i+1] = black
sense.set_pixels(t),kiirSorompo()

Az első sorban a for ciklussal bejárjuk a számokat 63-től 58-ig csökkenő sorrendben. Ezután a sleep metódust felhasználva megállítjuk a ciklust egy rövid időre, majd újraindul. Betöltjük egy tömbe a számokat, kivéve az 59-et és adunk nekik piros színt. Ezután pedig a megjelenés előtti pixelt kikapcsoljuk. Végül kiíratjuk a t tömböt és a sorompót.

A következő probléma az a parkoló autók kiválasztása és a helyükre beparkoló autók helyének kiválasztása volt. Szerettük volna a legtöbb birtokunkba lévő eszközre valamit programozni, ilyen volt a joystick is. A tervünk az volt, hogy a jobbra és balra joystickoláskor a parkolóba lévő szabad, illetve a távozó autót válasszuk ki, előbbit sárga színnel, míg utóbbit zöld színnel jeleztük. Erre a problémára az alábbi programot használtuk:

for event in sense.stick.get_events():
if event.action == "released":
if event.direction == "left":
sense.set_pixel(x,y,green)
if event.direction == "right":
sense.set_pixel(x,y,yellow)

A kódot néhány mondatban szeretnénk részletezni. Az első sorban bejárjuk a Sense Hat-nak a joystick eseményeit. A második sorban feltételt írtunk, a további sor akkor fusson le, amikor elengedtük a joystickot és visszaugrik az elejére. A további sorokban látható még egy if, attól függ, hogy balra vagy jobbra húzzuk a sticket, sárga színű lesz a pixel, illetve zöld.

Miután ezt sikeresen megcsináltuk, már találkoztunk is a következő problémával. Ki tudtuk választani azokat a területeket is, ahol parkolt autó, így az új autó rá tudott parkolni, illetve amikor azt akartuk, hogy egy parkoló autó hagyja el a parkolót, akkor ki tudtuk választani azokat a helyeket is, ahol nem állt parkoló. Ezen felül még az is előfordult, hogy miután kiválasztottuk a helyet és elváltottunk róla, törölte az ott lévő színt. Ezeket a problémákat úgy orvosoltuk, hogy elmentettük a pixelek színét, így ha elváltunk róla, akkor ugyanúgy törli, de olyan gyorsan beszínezi, hogy az emberi szem nem látja. Azt pedig, hogy az foglalt pixeleket ne tudjuk kiválasztani, létrehoztunk mindegyik helyre egy bool változójót, amiknek alapból False volt az értéke és ha a hely foglalt, akkor megváltoztattuk az értékét True-ra. Ezután már csak egy if metódussal kellet rászűrnünk azokra a helyekre, ahol az érték False.

Könyvtárak importálása

A Python lehetővé teszi, hogy nagyobb terjedelmű scripteket, programcsomagokat a belső struktúrájának megfelelően tagoljunk és ezt a programszövegben is jelezzük. Erre szolgálnak a modulok, amelyek logikailag összetartozó programrészeket fognak egybe. A modul neve az azt tartalmazó file neve. A modulok kiterjesztése .py a konvenciónak megfelelően. Egy modul neve a modulon belül a __name__ modul-globális szimbólumon keresztül hozzáférhető. Modulokat más scriptekből az import vagy from module import * utasításokkal importálhatunk. Az első forma a teljes modult, a második a modul bizonyos függvényeit importálja (a `*' helyett vesszővel elválasztott felsorolás is állhat). A második formában a `*' használatánál a `_'-sal kezdődő függvények nem importálódnak. A modulok állományrendszerbeli keresése a PYTHONPATH környezeti változóban felsorolt könyvtárak sorrendjében történik.

A projektünkben a következő importokat használtuk:
-from sense_hat import SenseHat:
Ezzel érjük el a Sense Hat metódusait(set_pixel, get_pixel, show_message)
-from time import *:
Ezzel érjük el a sleep metódust, amit már az előbb leírtunk.
-import mysql.connector as mariadb:
Ez az import a mysql szerver eléréséhez szükséges.
-import random:
A random számgeneráláshoz használtuk fel.
-import smtplib:
Itt kérjük le az email címhez szükséges kapcsolatot.

Használt szerverek

1,MYSQL

Az adatbázisunk egy MySQL szerver, ebben a következő információkat tároljuk: a felhasználó azonosítója, a felhasználó neve, az autó rendszáma, a felhasználó bankkártyaszáma. A MySQL egy többfelhasználós, többszálú, SQL-alapú relációs adatbázis-kezelő szerver. Ez az egyik legismertebb a világon, ennek az oka az, hogy költséghatékony és egyszerűen lehet kezelni, továbbá teljesen nyílt forráskódú.

Első sorban telepíteni kellett a raspberry készülékünkre a MySQL-t a terminálon keresztül. Ezt a „sudo apt install mariadb-server” parancsal tudjuk megtenni. A telepítés előtt ellenőrizzük, hogy kapcsolódtunk-e a hálózathoz, mert szükséges. A telepítés befejezését követően létre kell hoznunk egy felhasználót, aminek admin jogosultságot kell adnunk, így létre tudjuk hozni az adatbázisunkat.

Ezt a következő paranccsal tudjuk megtenni:
CREATE USER ’pelda’@’localhost’ IDENTIFIED BY ’jelszo’;
Most már be tudunk lépni: mysql -u pelda -p
Kérni fogja az előbb megadott jelszót: jelszo
Utolsó lépésként hozzuk létre az adatbázist és a táblát: CREATE DATABASE ’adatbazisnev’; CREATE TABLE autok (…);
Most már csak az a feladatunk, hogy a python programunk és a mariadb szerver között megteremtsük a kapcsolatot, ezt az alábbi kóddal tettük meg:
mariadb_connection = mariadb.connect(user ='mark', password = '123456', host = 'Localhost', port = '3306')
create_cursor = mariadb_connection.cursor()
create_cursor.execute("USE adatbazis")
Végül az sql paranccsal kapott eredményeket egy tömbbe raktuk, amit a későbbi belépéskor használtunk fel:
create_cursor.execute('SELECT id FROM autok Order by id desc LIMIT 1')
eredmeny = create_cursor.fetchall()
eredmeny2 = [i[0] for i in eredmeny]

2,SMTP

Ez egy kommunikációs protokoll, aminek a feladata az emailek Interneten történő továbbítása. A MySQL szerverrel ellentétben ezt nem kell telepíteni külön a terminálon keresztül, mivel a python könyvtárban megtalálható, csak importolnunk kell.

A projektünkben a következőképpen írtuk meg a kódot: emailcim = input("Az email cím formátuma: [email protected]\nA parkoló elhagyásához adja meg az email címét: ")
szamocska = random.choice(ar)
server = smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login("[email protected]", "123456Qw")
msg = "A bankszámlájáról " +str(szamocska)+"Ft került levonásra. Köszönjük, hogy nálunk parkolt."
server.sendmail("[email protected]", emailcim,msg.encode("utf-8"))
server.quit()
print("Email cím sikeresen elküldve, viszont látásra.")
Ezt is szeretnénk néhány mondatban bemutatni. Az első sorban létrehozunk egy emailcim nevű string-et, aminek az értéke a felhasználó által beírt email cím lesz. A következő sorban létrehozunk egy szamocska nevű int-et, amihez egy véletlenszám generátort használtunk 1 és 10000 között. Ezután kapcsolódunk a szerverhez, ahol megadjuk azt, hogy milyen formátumú emailt fogadjunk el, illetve a kommunikációs portot, ami az 587. Létrehozunk egy msg stringet, amit majd elküldünk az emailben. Meghívjuk a server sendmail metódusát, megadjuk a küldő email címét, a felhasználó álltal beírt email címet, és az előbb említett üzenetet. Alapértelmezett esetben az ékezetes betűket nem érzékeli a rendszer, ezért kellett utf-8-ra az encode metódussal átkódolnunk. Utolsó lépésként kilépünk a szerverből és értesítjük a felhasználót, hogy el tudtuk küldeni az emailt.

Képek a kész projektről

⚠️ **GitHub.com Fallback** ⚠️