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