Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

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.")

 

Predchádzajúci článok
Raspberry Pi - Zavlažovač rastlín
Všetky články v sekcii
Raspberry Pi
Článok pre vás napísal Aleš Hlavín
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Raspberry
Aktivity