6. diel - Raspberry Pi - Magnetický senzor (otvorené / zatvorené dvere)
V predchádzajúcej lekcii, Raspberry Pi - Jednoduchý semafor , sme si vytvorili jednoduchý semafor.
V dnešnom Raspberry Pi tutoriálu zavítame do sveta IOT a bezpečnostných technológií. Vyrobíme si plošný spoj s pomocou magnetického senzora a Raspberry, ktorý nám bude signalizovať, či sú otvorené alebo zatvorené dvere. A môžeme si o tom informácie nechať posielať napr. Na e-mail.
Potrebné súčiastky
K dnešnému projektu budeme potrebovať iba tri veci:
- Raspberry Pi
- magnetický senzor
- Zdroj napájania / Klasické napájania pre Raspberry
Magnetický senzor
Náš magnetický senzor je založený na Reedovej princípe. Ten funguje
nasledovne. Je vytvorená sklenená banka. V tej máme máme plyn a 2 jazýčky
z feromagnetického materiálu. Akonáhle sa k banke priblíži magnet,
jazýčky sa ohnú, spoja a začnú viesť. Naopak, keď sa magnet od banky
oddiali, jazýčky sa vráti do pôvodnej polohy a viesť prestanú. To sú dve
situácie, ktoré môžu nastať. Pre počítač 1
a
0
. Pre nás otvorené dvere a zatvorené dvere.
Magnet pridáme na pohybujúce sa časť dverí, banku s jazýčkom niekam na futro, pretože od tej nám povedú drôty.
Zapojenie
Zapojenie je jednoduché. Magnetický senzor má dva vývody. Jeden zapojíme do ľubovoľného GPIO portu a druhý do ground. Tým vytvoríme obvod medzi Raspberry Pi a magnetickým senzorom:
Na vstup privádzame zem, pretože chceme pri zopnutom magnetu a zatvorených dverách na vstupe nulu (ako zatvorené).
Základné skript v Pythone
Do Pythone napíšeme tento jednoduchý kód, ktorý si následne vysvetlí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čiatok kódu je už dobre známe importovania knižníc. Importujeme si
jedinú potrebnú knižnicu a to knižnicu pre GPIO
porty.
Na riadku druhom ako obvykle budeme nastavovať mode (či budeme používať čísla portu na doske alebo GPIO čísla). Dnes sme si vybrali určovaní čísla pinu podľa dosky.
Na riadku treťom nastavujeme kanál GPIO portu na input na
rozdiel od minulej lekcie, kedy sme nastavovali kanál na
output kvôli ovládanie hodnotami HIGH a
LOW. Dnes budeme potrebovať výstup len 0
a
1
. Preto musíme ešte nastaviť tzv :. pull_up /
down na hodnotu PUD_UP
. Vstupná hodnota na GPIO porte
totiž inak neustále pláva niekde medzi 1
a 0
. GPIO
pin nám tak zostane na jednej hodnote podľa toho, aký bude výstup. V našom
prípade bude toto ideálne riešenie, pretože 1
= otvorené,
0
= zatvorené.
Premenná
Ďalej si vytvoríme premennú obsahujúci číslo podľa toho, či posledne bolo otvorené alebo zatvorené. Tak zabránime situácii, že by sa "otvorené" / "zatvorené" vypísalo viackrát po sebe.
Slučka
Na riadku piatom si vytvoríme cyklus while
, ktorý nám
zabezpečí neustále opakovanie programu. Práve hodnota True
v
podmienke cykle zabezpečí, že sa náš kód v slučke bude neustále
opakovať.
Nasledujúce riadky sú venované podmienke if
, ktorá je
nastavená týmto spôsobom: keď je na GPIO porte hodnota 1
(pravda), tak print()
vypíše, že sú dvere otvorené. Podmienka
bude splnená v momente, keď sú doštičky magnetického senzora od
seba (pretože otvorené dvere rozpojí obvod).
O podmienke o GPIO pinu je ďalej tiež pridaná rovnako dôležitá
podmienka, ktorá musí byť súčasne splnené s prvou a to, akú hodnotu má
a
. Zakaždým, keď sa stane podmienka a dvere sa otvoria, tak by
kód stále dookola vypisoval "otvorené", kým by sme dvere nezatvorili. To je
nepraktické. Preto nastavíme, aby zakaždým, keď if
vypíše
"otvorené", nastaví tiež hodnotu na 1
. Tým zamedzíme tomu, aby
kód stále dookola vypisoval "otvorené". Druhá podmienka znie, že
a
sa nesmie rovnať 1
. Táto podmienka je pridaná
pomocou and
a musia byť teda splnené obe.
Ďalšie tri riadky sú sekundárne. Používaná nemenej dôležitá
elif
podmienka sa vždy vyhodnotí po nepoužitie prvej podmienky
if
. V tejto podmienke nastavujeme, čo sa stane, ak je na vstupnom
pinu 0
- nepravda. V takom prípade print()
vypíše
"zatvorené" a znamená to, že doštičky magnetického senzora sú pri
sebe. Rovnako ako u if sme tu tiež nastaviť stopku
pomocou druhej podmienky, že sa a nesmie rovnať hodnote zatvorených dverí,
ktorá je na konci elif
vždy nastavená na 2
.
Skúška
Program si uložíme ako magnet.py
a spustíme si ho v
termináli pomocou príkazu:
python magnet.py
Skript jednoducho vypíše "otvorené", keď doštičky magnetického senzora budú ďaleko od seba a "zatvorené", keď doštičky budú pri sebe. Rovnako tak ako na obrázku nižšie:
Posielanie správy na email
Keď už máme hotový kód, ktorý nám ukazuje "otvorené" a "zatvorené", poďme si k nemu pridať aj niečo viac IOT. Pre dnešok to bude posielanie tejto skutočnosti na email. Využitie tohto systému môžeme vidieť napr. Ako bezpečnostné zariadenie na dverách k miestnosti s dôležitými dátami.
Python kód na posielanie dát zo senzora
Teraz si doplníme náš kód o časť, ktorá bude posielať správy. Celý kód bude nakoniec vyzerať 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é
Funkcia riadkov označených ako "nové" budú popísané na nasledujúcich
riadkoch. Na prvý pridanom riadku importujeme knižnicu smtplib
,
ktorej funkcia sme si už vysvetlili.
Riadok druhý obsahuje vytvorenie premenné server
, do ktorej
ukladáme informácie o serveri, cez ktorý sa naša správa bude posielať, ao
jeho portu.
Do tretice sa musíme prihlásiť na e-mail, z ktorého budeme e-maily posielať, pomocou e-mailovej adresy a hesla. Toto prihlásenie bude fungovať iba pre gmail účet. Gmail má verejne prístupný "smtp server". Tým pádom je pre naše účely ideálne.
Pri prvej spustení programu nám gmail ukáže hlášku, že sa prihlásenie nepodarilo a že máme skúsiť gmail podporu. Tá nás presmeruje na stránky služby Gmail, kde stačí kliknúť na odkaz - povoliť menej bezpečným aplikáciám prístup k svojmu účtu.
Na ďalšom riadku pošleme e-mail pomocou funkcie sendmail()
.
Tej musíme odovzdať vždy aspoň tri parametre:
- e-mail odosielateľa
- e-mail príjemcu
- správa, ktorú chceme príjemcovi poslať. V našom prípade je správou pre príjemcu informácie o tom, či sú dvere zatvorené, alebo naopak otvorené.
Posledný riadok je venovaný funkciu quit()
. Táto funkcia iba
ukončuje spojenie medzi serverom a klientom.
Skúška emailu
Nakoniec opäť kód uložíme a spustíme. Môžeme si všimnúť, že sa výpis v termináli nezmení. Na e-mailu si však môžeme všimnúť nových prijatých správ:
Formát prijatých e-mailov
Teraz si ukážeme, ako by mal e-mail vyzerať a prečo. Náš e-mail nebude mať žiadny predmet, pretože sme žiadny nezadali. Na pridanie predmetu by sme si museli do správy pridať časť:
"""
Subject:Predmet
Správa
"""
Tri úvodzovky nám dovoľujú zadať reťazec s viacerými riadkami.
Subject
nám do predmetu v správe pridá slovo "Predmet", ktoré
sme zadali. To sme my však nepotrebovali. Ďalej vidíme v e-maile našej
správu o stave dverí ( "otvorené" / "zatvorené"). Posledný informácií v
e-mailu je e-mailová adresa odosielateľa:
Čo je to SMTP?
SMTP je internetový protokol určený na prenos elektronickej pošty (e-mailov). Každý poskytovateľ e-mailových adries má svoj vlastný kontaktný SMTP server, na ktorý sa vždy email odosiela, než ide k príjemcovi. Keď teda pošlite e-mail, cestuje prvý krát na "smtp server" vášho e-mailu. Na tomto serveri beží služba MTA, ktorá zistí, kam má email poslať, a potom email spolu s protokolom SMTP odošle na správnu adresu.
V budúcej lekcii, Veľká rodina Raspberry Pi - Prehľad modelov a ich funkcií , si budeme hovoriť o celej veľkej rodine modelov Raspberry Pi.