IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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
Raspberry Pi

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:

Raspberry Pi

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:

Raspberry Pi

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:

Raspberry Pi

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:

Raspberry Pi

Č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.


 

Predchádzajúci článok
Raspberry Pi - Jednoduchý semafor
Všetky články v sekcii
Raspberry Pi
Preskočiť článok
(neodporúčame)
Veľká rodina Raspberry Pi - Prehľad modelov a ich funkcií
Článok pre vás napísal Aleš Hlavín
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Raspberry
Aktivity