19. diel - Raspberry Pi - Zavlažovač rastlín - programová časť
V predchádzajúcej lekcii, Raspberry Pi - Zavlažovač rastlín , sme si k Raspberry Pi pripojili vodné čerpadlo, senzor vlhkosti pôdy a reproduktor.
V dnešnej lekcii Raspberry Pi tutoriálu budeme pokračovať vo výrobe zariadení na závlahu rastlín. Napíšeme si program, ktorý bude čítať a spracovávať dáta zo senzora, a tým zariadenie z predchádzajúcej lekcie obsluhovať. Vysvetlíme si tiež, ako celý program funguje.
Zavlažovací systém
Program bude zisťovať, či je pôda rastliny dostatočne vlhká. V prípade, že áno, vypíše text. Ak zistí, že pôda už vlhká nie je, spustí čerpadlo, ktoré rastlinu zaleje. V prípade, že zavlažovači dôjde voda, ohlási nám to pomocou pípania reproduktora.
Princíp programu
Náš program bude mať nekonečnú slučku, ktorá bude mať tri podmienky.
Najprv musíme rozhodnúť, čo sa stane, keď bude pôda suchá. Pri splnení
tejto podmienky program spustí čerpadlo na štyri sekundy. Aby mala pôda čas
vodu absorbovať, meranie senzorom vlhkosti sa pomocou time
pozastaví na jednu minútu. Druhá podmienka sa týka dostupného objemu vody
na zálievku. Aby sme na zistenie tohto parametra nemuseli používať ďalší
senzor, vykonáme jednoduchý výpočet. Z testovania použitého čerpadla
vyplýva, že za jednu sekundu zaleje rastlinu 20ml vody. Jedno zaliatie teda
vychádza na 80ml (4s x 20ml). Ak máme ako zdroj vody pohár s objemom 500 ml,
môžeme vykonať šesť cyklov zalievania. Potom nám zostane v pohári už len
20 ml vody, čo na ďalšie zaliatie nepostačí. Pri každom použití
čerpadla teda zvýšime premennú a
1. Až premenná dosiahne
hodnotu 6, aktivuje sa reproduktor a začne pípať. Tým nás upozorní, že
treba vodu doplniť. Nakoniec spracujeme stav, kedy je dostatok vody a pôda je
stále dosť vlhká. V našom prípade sa vypíše text.
Import knižníc
V rámci tvorby programu v tejto lekcii budeme potrebovať importovať tri
knižnice, konkrétne GPIO, time a datetime. Všetky tri
knižnice už dobre poznáme z predchádzajúcich lekcií, preto len krátko:
GPIO knihovnu
použijeme na ovládanie GPIO portov. Knižnicu
time
najčastejšie používame na pozastavenie programu v určitom
stave. Datetime
je potom knižnica, ktorá nám dáva informácie o
aktuálnom čase a dátume:
import RPi.GPIO as GPIO import time import datetime
Nastavenie GPIO
Teraz si nastavíme mód GPIO na BCM
. Musíme to urobiť hneď
na začiatku, aby nám kód nevracal chybu. Ďalej potom nastavíme premennú
a
(počítač počtu zaliatí) na hodnotu 0:
GPIO.setmode(GPIO.BCM)
a = 0
Slučka
Pomocou while
s hodnotou True
si vytvoríme
nekonečnú slučku:
while(True):
Nastavenie portu senzora vlhkosti
Prvé, čo v slučke musíme urobiť, je opäť nastaviť mód GPIO na
BCM
. Musíme to urobiť znova, pretože na konci našich podmienok
máme príkaz GPIO.cleanup
, ktorý ho zresetuje. Potom si
vytvoríme premenou senzorVlhkosti
. Do nej si uložíme číslo
portu, na ktorom je pripojený senzor vlhkosti. Pretože chceme dáta
prijímať, nastavíme GPIO.setup
takto. Najprv nastavíme hodnotu
premennej senzorVlhkosti
. Ďalej potom nastavíme pin so senzorom
na input
prostredníctvom GPIO.IN
:
GPIO.setmode(GPIO.BCM)
senzorVlhkosti=4
GPIO.setup(senzorVlhkosti, GPIO.IN)
Prvá podmienka
V prvej podmienke budeme načítať vstup z pinu senzora vlhkosti, ktorý je
nastavený na premenné senzorVlhkosti
vlhkosti. Podmienka sa
vykoná, ak na vstupe bude hodnota True
. Najprv v podmienke
nastavujeme pomocou GPIO.setup
pin, na ktorom je pripojené vodné
čerpadlo, na output
. Pin nastavíme na LOW
aby sa
čerpadlo zaplo. V tomto stave ho ponecháme štyri sekundy pomocou
time.sleep
. Potom čerpadlo zase vypneme nastavením hodnoty pinu
na HIGH
. Nesmieme zabudnúť použiť nakoniec príkaz
GPIO.cleanup
. Premennú a
potom inkrementujeme o
jedničku, aby sme vedeli, koľkokrát sa podmienka vykonala. Hodnotu v
a
budeme ešte potrebovať. Nakoniec program uspíme na 60 sekúnd.
Tým zaistíme, že pôda stihne vstrebať všetku vodu pred ďalším
meraním:
if GPIO.input(senzorVlhkosti): GPIO.setup(14, GPIO.OUT) GPIO.output(14,GPIO.LOW) time.sleep(4) GPIO.output(14,GPIO.HIGH) GPIO.cleanup() a=a+1 time.sleep(60)
Druhá podmienka
Teraz musíme zaistiť, aby nám v zavlažovači nemohla dôjsť voda.
Podmienka sa vykoná, iba ak premenná a
nadobudne hodnotu
6
. V podmienke najskôr nastavíme na output
pin, na
ktorom máme pripojený reproduktor. Vytvoríme si premennú Rep
a
uložíme do nej GPIO.PWM
. Tento príkaz nastaví pin na určitú
frekvenciu. My si nastavíme frekvenciu 440
. Pomocou premennej
Rep
a príkazu start
s hodnotou napríklad
50
reproduktor začne pískať. Na koniec podmienky si vložíme
príkaz input
a do neho text. Program tak bude čakať, kým
nedoplníme vodu a nestlačíme ľubovoľný kláves:
if a==7: GPIO.setup(23, GPIO.OUT) Rec = GPIO.PWM(23,440) Rec.start(50) input("Stiskněte libovolnou klávesu.")
Tretia podmienka
Pokiaľ nenastane prvá ani druhá podmienka, vykoná sa podmienka tretia.
Jej úlohou je iba vypísanie textu pomocou print
, aby sme vedeli,
že program (a zariadenie) pracuje:
else: print("Rostlina má dost vody.")
Užívateľská prívetivosť
Pokiaľ nechceme, aby vás zariadenie budilo s požiadavkou na doplnenie vody
napríklad hodinu po polnoci, musíme sa o správne načasovanie starostlivosti
o rastlinu postarať. Na začiatok našej slučky while
si
doplníme kód, ktorý nám zistí aktuálny čas a uloží ho do premennej
t
. Do premennej hodiny
si potom uložíme, aká je
aktuálne hodina:
t = time.localtime()
hodiny = time.strftime("%H", t)
K prvej podmienke v slučke si potom pomocou and
pridáme
ďalšiu podmienku, ktorá musí byť splnená - premenná hodiny
musí byť väčšia ako 10
. Táto podmienka nám zaistí, aby nám
zariadenie nezačalo vydávať upozornenia skôr, ako o 10. hodine ráno:
if a==7 and hodiny>10:
Celý kód programu
import RPi.GPIO as GPIO import time import datetime GPIO.setmode(GPIO.BCM) a = 0 while(True): t = time.localtime() hodiny = time.strftime("%H", t) GPIO.setmode(GPIO.BCM) senzorVlhkosti=4 GPIO.setup(senzorVlhkosti, GPIO.IN) if GPIO.input(senzorVlhkosti): GPIO.setup(14, GPIO.OUT) GPIO.output(14,GPIO.LOW) time.sleep(4) GPIO.output(14,GPIO.HIGH) GPIO.cleanup() a=a+1 time.sleep(60) if a==7 and hodiny>10: GPIO.setup(23, GPIO.OUT) Rec = GPIO.PWM(23,440) Rec.start(50) input("Stiskněte libovolnou klávesu.") else: print("Rostlina má dost vody.")