Pouze tento týden sleva až 80 % na e-learning týkající se JavaScriptu
Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 30% výuky zdarma!
JavaScript týden

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.

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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.


 

Předchozí článek
Raspberry Pi - Jednoduchý semafor
Všechny články v sekci
Raspberry Pi
Článek pro vás napsal Aleš Hlavín
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Raspberry
Aktivity (4)

 

 

Komentáře

Avatar
jaromir.kapitan:20. ledna 9:45

Ahoj, pekna myslienka projektu. Tiez sa zacinam hrat s IoT, protokolom MQTT a podobne. Len jedina vec ktora mi bije do oci ako elektrotechnikovi: "Vyrobíme si plošný spoj" odporucam pouzit "Zapojíme si obvod/schému".

 
Odpovědět
20. ledna 9:45
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Aleš Hlavín
Brigádník
Avatar
Odpovídá na jaromir.kapitan
Aleš Hlavín:24. ledna 0:12

Ahoj, MQTT se budu věnovat v dalších lekcích. Prozatím děkuji za tvoji reakci. Cením si každého hodnocení.

 
Odpovědět
24. ledna 0:12
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.