NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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í.

Lekce 19 - Raspberry Pi - Zavlažovač rostlin - programová část

V předchozí lekci, Raspberry Pi - Zavlažovač rostlin, jsme si k Raspberry Pi připojili vodní čerpadlo, senzor vlhkosti půdy a reproduktor.

V dnešní lekci Raspberry Pi tutoriálu budeme pokračovat ve výrobě zařízení pro závlahu rostlin. Napíšeme si program, který bude číst a zpracovávat data ze senzoru a tím zařízení z předchozí lekce obsluhovat. Vysvětlíme si také, jak celý program funguje.

Zavlažovací systém

Program bude zjišťovat, zda je půda rostliny dostatečně vlhká. V případě, že ano, vypíše text. Pokud zjistí, že půda již vlhká není, spustí čerpadlo, které rostlinu zalije. V případě, že zavlažovači dojde voda, ohlásí nám to pomocí pípání reproduktoru.

Princip programu

Náš program bude mít nekonečnou smyčku, která bude mít tři podmínky. Nejprve musíme rozhodnout, co se stane, když bude půda suchá. Při splnění této podmínky program spustí čerpadlo na čtyři sekundy. Aby měla půda čas vodu absorbovat, měření senzorem vlhkosti se pomocí time pozastaví na jednu minutu. Druhá podmínka se týká dostupného objemu vody na zálivku. Abychom ke zjištění tohoto parametru nemuseli používat další senzor, provedeme jednoduchý výpočet. Z testování použitého čerpadla vyplývá, že za jednu sekundu zalije rostlinu 20 ml vody. Jedno zalití tedy vychází na 80 ml (4 s x 20 ml). Pokud máme jako zdroj vody sklenici o objemu 500 ml, můžeme provést šest cyklů zalévání. Poté nám zbude ve sklenici už jen 20 ml vody, což na další zalití nepostačí. Při každém použití čerpadla tedy zvýšíme proměnnou a o 1. Až proměnná dosáhne hodnoty 6, aktivuje se reproduktor a začne pípat. Tím nás upozorní, že je třeba vodu doplnit. Nakonec zpracujeme stav, kdy je dostatek vody a půda je stále dost vlhká. V našem případě se vypíše text.

Import knihoven

V rámci tvorby programu v této lekci budeme potřebovat importovat tři knihovny, konkrétně GPIO, time a datetime. Všechny tři knihovny již dobře známe z předchozích lekcí, proto jen krátce: GPIO knihovnu použijeme na ovládání GPIO portů. Knihovnu time nejčastěji používáme na pozastavení programu v určitém stavu. Datetime je pak knihovna, která nám dává informace o aktuálním čase a datu:

import RPi.GPIO as GPIO
import time
import datetime

Nastavení GPIO

Nyní si nastavíme mód GPIO na BCM. Musíme to udělat hned na začátku, aby nám kód nevracel chybu. Dále pak nastavíme proměnnou a (čítač počtu zalití) na hodnotu 0:

GPIO.setmode(GPIO.BCM)
a = 0

Smyčka

Pomocí while s hodnotou True si vytvoříme nekonečnou smyčku:

while(True):

Nastavení portu senzoru vlhkosti

První, co ve smyčce musíme udělat, je opět nastavit mód GPIO na BCM. Musíme to udělat znovu, protože na konci našich podmínek máme příkaz GPIO.cleanup, který jej zresetuje. Poté si vytvoříme proměnou senzorVlhkosti. Do ní si uložíme číslo portu, na kterém je připojen senzor vlhkosti. Protože chceme data přijímat, nastavíme GPIO.setup takto. Nejprve nastavíme hodnotu proměnné senzorVlhkosti. Dále pak nastavíme pin se senzorem na input prostřednictvím GPIO.IN:

GPIO.setmode(GPIO.BCM)
senzorVlhkosti=4
GPIO.setup(senzorVlhkosti, GPIO.IN)

První podmínka

V první podmínce budeme načítat vstup z pinu senzoru vlhkosti, který je nastaven na proměnné senzorVlhkosti. Podmínka se provede, pokud na vstupu bude hodnota True. Nejprve v podmínce nastavujeme pomocí GPIO.setup pin, na kterém je připojeno vodní čerpadlo, na output. Pin nastavíme na LOW aby se čerpadlo zapnulo. V tomto stavu ho ponecháme čtyři sekundy pomocí time.sleep. Poté čerpadlo zase vypneme nastavením hodnoty pinu na HIGH. Nesmíme zapomenou použít nakonec příkaz GPIO.cleanup. Proměnnou a potom inkrementujeme o jedničku, abychom věděli, kolikrát se podmínka provedla. Hodnotu v a budeme ještě potřebovat. Nakonec program uspíme na 60 sekund. Tím zajistíme, že půda stihne vstřebat všechnu vodu před dalším měření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á podmínka

Nyní musíme zajistit, aby nám v zavlažovači nemohla dojít voda. Podmínka se vykoná, pouze pokud proměnná a nabude hodnotu 6. V podmínce nejprve nastavíme na output pin, na kterém máme připojený reproduktor. Vytvoříme si proměnnou Rep a uložíme do ní GPIO.PWM. Tento příkaz nastaví pin na určitou frekvenci. My si nastavíme frekvenci 440. Pomocí proměnné Rep a příkazu start s hodnotou například 50 reproduktor začne pískat. Na konec podmínky si vložíme příkaz input a do něj text. Program tak bude čekat, dokud nedoplníme vodu a nestiskneme libovolnou klávesu:

if a==7:
        GPIO.setup(23, GPIO.OUT)
        Rec = GPIO.PWM(23,440)
        Rec.start(50)
        input("Stiskněte libovolnou klávesu.")

Třetí podmínka

Pokud nenastane první ani druhá podmínka, provede se se podmínka třetí. Jejím úkolem je pouze vypsání textu pomocí print, abychom věděli, že program (a zařízení) pracuje:

else:
       print("Rostlina má dost vody.")

Uživatelská přívětivost

Pokud nechceme, aby vás zařízení budilo s požadavkem na doplnění vody například hodinu po půlnoci, musíme se o správné načasování péče o rostlinu postarat. Na začátek naší smyčky while si doplníme kód, který nám zjistí aktuální čas a uloží jej do proměnné t. Do proměnné hodiny si pak uložíme, jaká je aktuálně hodina:

t = time.localtime()
hodiny = time.strftime("%H", t)

K první podmínce ve smyčce si pak pomocí and přidáme další podmínku, která musí být splněna - proměnná hodiny musí být větší než 10. Tato podmínka nám zajistí, aby nám zařízení nezačalo vydávat upozornění dříve, než v 10 hodin 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.")

 

Předchozí článek
Raspberry Pi - Zavlažovač rostlin
Všechny články v sekci
Raspberry Pi
Článek pro vás napsal Aleš Hlavín
Avatar
Uživatelské hodnocení:
4 hlasů
Raspberry
Aktivity