Lekce 6 - Raspberry Pi - Magnetický senzor (otevřené/zavřené dveře)
V předchozí lekci, Raspberry Pi - Jednoduchý semafor, jsme si vytvořili jednoduchý semafor.
V dnešním Raspberry Pi tutoriálu zavítáme do světa IOT a bezpečnostních technologií. Vyrobíme si plošný spoj s pomocí magnetického senzoru a Raspberry, který nám bude signalizovat, zda jsou otevřeny nebo zavřeny dveře. A můžeme si o tom informace nechat posílat např. na e-mail.
Potřebné součástky
K dnešnímu projektu budeme potřebovat pouze tři věci:
- Raspberry Pi
- Magnetický senzor
- Zdroj napájení/Klasické napájení pro Raspberry
Magnetický senzor
Náš magnetický senzor je založen na Reedově principu. Ten funguje
následovně. Je vytvořena skleněná baňka. V té máme máme plyn a 2
jazýčky z feromagnetického materiálu. Jakmile se k baňce přiblíží
magnet, jazýčky se ohnou, spojí a začnou vést. Naopak, když se magnet od
baňky oddálí, jazýčky se vrátí do původní polohy a vést přestanou. To
jsou dvě situace, které mohou nastat. Pro počítač 1
a
0
. Pro nás otevřené dveře a zavřené dveře.
Magnet přidáme na pohybující se část dveří, baňku s jazýčkem někam na futro, protože od té nám povedou dráty.
Zapojení
Zapojení je jednoduché. Magnetický senzor má dva vývody. Jeden zapojíme do libovolného GPIO portu a druhý do ground. Tím vytvoříme obvod mezi Raspberry Pi a magnetickým senzorem:
Na vstup přivádíme zem, protože chceme při sepnutém magnetu a zavřených dveřích na vstupu nulu (jako zavřeno).
Základní skript v Pythonu
Do Pythonu napíšeme tento jednoduchý kód, který si následně vysvětlíme:
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(18, GPIO.IN, pull_up_down = GPIO.PUD_UP) a = 0 while True: if GPIO.input(18) and a != 1: print("open") a = 1 elif GPIO.input(18) == False and a != 2: print("close") a = 2
GPIO
Začátek kódu je již dobře známé importování knihoven. Importujeme si
jedinou potřebnou knihovnu a to knihovnu pro GPIO
porty.
Na řádku druhém jako obvykle budeme nastavovat mode (zda budeme používat čísla portu na desce nebo GPIO čísla). Dnes jsme si vybrali určování čísla pinu podle desky.
Na řádku třetím nastavujeme kanál GPIO portu na input
na rozdíl od minulé lekce, kdy jsme nastavovali kanál na
output kvůli ovládání hodnotami HIGH a
LOW. Dnes budeme potřebovat výstup jen 0
a
1
. Proto musíme ještě nastavit tzv:.
pull_up/down na hodnotu PUD_UP
.
V elektrotechnice existují rezistory, které se nazývají pull up/down.
Tyto rezistory nastavují vstupní hodnotu, pokud není určována jiným
zařízením. Když tedy potřebujeme stálou hodnotu 1
,
pořídíme si pull up rezistor a naopak. Stejně funguje i tato funkce GPIO
portu, akorát my místo použití rezistoru sami nastavujeme výchozí hodnotu.
Vstupní hodnota na GPIO portu totiž jinak neustále pluje někde mezi
1
a 0
. GPIO pin nám takto zůstane na jedné hodnotě
podle toho, jaký bude výstup. V našem případě bude toto ideální
řešení, protože 1
= otevřeno, 0
= zavřeno.
Proměnná
Dále si vytvoříme proměnnou obsahující číslo podle toho, jestli posledně bylo otevřeno nebo zavřeno. Tak zabráníme situaci, že by se "otevřeno"/"zavřeno" vypsalo vícekrát po sobě.
Smyčka
Na řádku pátém si vytvoříme cyklus while
, který nám
zajistí neustálé opakování programu. Právě hodnota True
v
podmínce cyklu zajistí, že se náš kód ve smyčce bude neustále
opakovat.
Následující řádky jsou věnované podmínce if
, která je
nastavena tímto způsobem: když je na GPIO portu hodnota 1
(pravda), tak print()
vypíše, že jsou dveře otevřeny.
Podmínka bude splněna v momentě, kdy jsou destičky magnetického senzoru
od sebe (protože otevřené dveře rozpojí obvod).
K podmínce o GPIO pinu je dále také přidaná stejně důležitá
podmínka, která musí být současně splněna s první a to, jakou hodnotu
má a
. Pokaždé, když se stane podmínka a dveře se otevřou,
tak by kód stále dokola vypisoval "otevřeno", dokud bychom dveře nezavřeli.
To je nepraktické. Proto nastavíme, aby pokaždé, když if
vypíše "otevřeno", nastaví také hodnotu na 1
. Tím zamezíme
tomu, aby kód stále dokola vypisoval "otevřeno". Druhá podmínka zní, že
a
se nesmí rovnat 1
. Tato podmínka je přidaná
pomocí and
a musí být tedy splněny obě.
Další tři řádky jsou sekundární. Používaná neméně důležitá
elif
podmínka se vždy vyhodnotí po nepoužití první podmínky
if
. V této podmínce nastavujeme, co se stane, pokud je na
vstupním pinu 0
- nepravda. V takovém případě
print()
vypíše "zavřeno" a znamená to, že destičky
magnetického senzoru jsou u sebe. Stejně jako u
if jsme tu také nastavili stopku pomocí druhé podmínky, že
se a nesmí rovnat hodnotě zavřených dveří, která je na konci
elif
vždy nastavena na 2
.
Zkouška
Program si uložíme jako magnet.py
a spustíme si ho v
terminálu pomocí příkazu:
python magnet.py
Skript jednoduše vypíše "otevřeno", když destičky magnetického senzoru budou daleko od sebe a "zavřeno", když destičky budou u sebe. Stejně tak jako na obrázku níže:
Posílání zprávy na email
Když už máme hotový kód, který nám ukazuje "otevřeno" a "zavřeno", pojďme si k němu přidat také něco víc IOT. Pro dnešek to bude posílání této skutečnosti na email. Využití tohoto systému můžeme vidět např. jako bezpečnostní zařízení na dveřích k místnosti s důležitými daty.
Python kód na posílání dat ze senzoru
Nyní si doplníme náš kód o část, která bude posílat zprávy. Celý kód bude nakonec vypadat takto:
import RPi.GPIO as GPIO import smtplib // nové GPIO.setmode(GPIO.BOARD) GPIO.setup(18, GPIO.IN, pull_up_down = GPIO.PUD_UP) a = 0 while True: if GPIO.input(18) and a != 1: print("open") a = 1 server = smtplib.SMTP_SSL("smtp.gmail.com", 465) // nové server.login("váš gmail", "Heslo od vašeho gmailu") // nové server.sendmail("váš gmail/gmail odesílatele", "gmail příjemce", "otevřeny") // nové server.quit() // nové elif GPIO.input(18) == False and a != 2: print("close") a = 2 server = smtplib.SMTP_SSL("smtp.gmail.com", 465) // nové server.login("váš gmail", "vaše heslo") // nové server.sendmail("váš gmail/gmail odesílatele", "gmail příjemce", "zavřeny") // nové server.quit() // nové
Funkce řádků označených jako "nové" budou popsány na následujících
řádcích. Na první přidaném řádku importujeme knihovnu
smtplib
, jejíž funkce jsme si již vysvětlili.
Řádek druhý obsahuje vytvoření proměnné server
, do které
ukládáme informace o serveru, přes který se naše zpráva bude posílat, a o
jeho portu.
Do třetice se musíme přihlásit na e-mail, z kterého budeme e-maily posílat, pomocí e-mailové adresy a hesla. Toto přihlášení bude fungovat pouze pro gmail účet. Gmail má veřejně přístupný "smtp server". Tím pádem je pro naše účely ideální.
Při první spuštění programu nám gmail ukáže hlášku, že se přihlášení nezdařilo a že máme zkusit gmail podporu. Ta nás přesměruje na stránky gmailu, kde stačí kliknout na odkaz - povolit méně bezpečným aplikacím přístup ke svému účtu.
Na dalším řádku pošleme e-mail pomocí funkce sendmail()
.
Té musíme předat vždy alespoň tři parametry:
- e-mail odesílatele
- e-mail příjemce
- zpráva, kterou chceme příjemci poslat. V našem případě je zprávou pro příjemce informace o tom, zda jsou dveře zavřeny, nebo naopak otevřeny.
Poslední řádek je věnovaný funkci quit()
. Tato funkce pouze
ukončuje spojení mezi serverem a klientem.
Zkouška emailu
Nakonec opět kód uložíme a spustíme. Můžeme si všimnout, že se výpis v terminálu nezmění. Na e-mailu si však můžeme všimnout nově přijatých zpráv:
Formát přijatých e-mailů
Nyní si ukážeme, jak by měl e-mail vypadat a proč. Náš e-mail nebude mít žádný předmět, protože jsme žádný nezadali. Na přidání předmětu bychom si museli do zprávy přidat část:
"""
Subject:Předmět
Zpráva
"""
Tři uvozovky nám dovolují zadat řetězec s více řádky.
Subject
nám do předmětu ve zprávě přidá slovo "Předmět",
které jsme zadali. To jsme my však nepotřebovali. Dále vidíme v e-mailu
naší zprávu o stavu dveří ("otevřeno"/"zavřeno"). Poslední informací
v e-mailu je e-mailová adresa odesílatele:
Co je to SMTP?
SMTP je internetový protokol určen pro přenos elektronické pošty (e-mailů). Každý poskytovatel e-mailových adres má svůj vlastní kontaktní SMTP server, na který se vždy email odesílá, než jde k příjemci. Když tedy pošlete e-mail, cestuje prvně na "smtp server" vašeho e-mailu. Na tomto serveru běží služba MTA, která zjistí, kam má email poslat, a pak e-mail spolu s protokolem SMTP odešle na správnou adresu.
V příští lekci, Velká rodina Raspberry Pi - Přehled modelů a jejich funkcí, si budeme povídat o celé velké rodině modelů Raspberry Pi.