Smart zavlažování zahrady - kompletní DIY průvodce

Automatické zavlažování šetří vodu, čas a zajistí zdravé rostliny i během dovolené. V tomto podrobném návodu vám ukážu, jak postavit chytrý zavlažovací systém, který reaguje na počasí, vlhkost půdy a můžete ho ovládat odkudkoliv.
Proč smart zavlažování?
Klasické zavlažovací systémy jedou podle časovače bez ohledu na skutečnou potřebu. Chytrý systém:
- Měří vlhkost půdy - zalévá jen když je potřeba
- Sleduje počasí - přeskočí zavlažování před deštěm
- Různé zóny - každá část zahrady podle potřeby
- Vzdálené ovládání - kontrola odkudkoliv
- Statistiky - kolik vody spotřebujete
Komponenty systému
Základní hardware
1. Řídící jednotka
- ESP32/ESP8266 (200-400 Kč) - WiFi mikrokontrolér
- Raspberry Pi (1500-2500 Kč) - pokročilejší možnost
- Arduino + WiFi shield (800-1200 Kč) - klasika
2. Ventily a potrubí
Elektromagnetické ventily:
- 24V AC ventily (800-1500 Kč/kus)
- 12V DC ventily (600-1000 Kč/kus)
- Průměr podle průtoku (3/4" nebo 1")
Potrubí:
- PE hadice 16-25mm
- Spojky, kolena, T-kusy
- Kapkovače nebo postřikovače
3. Napájení
- 24V AC transformátor (500-800 Kč)
- Nebo 12V DC zdroj + relé board
4. Senzory
- Vlhkost půdy (150-300 Kč/kus)
- Déšť (200-400 Kč)
- Průtok vody (500-1000 Kč)
- Teplota/vlhkost vzduchu (200-400 Kč)
Příklad rozpočtu
Malá zahrada (4 zóny):
ESP32: 300 Kč
4x ventil 12V: 2400 Kč
Relé modul 8ch: 200 Kč
4x vlhkostní senzor: 800 Kč
Napájecí zdroj: 400 Kč
Krabice, kabely: 500 Kč
Potrubí a fitinky: 1500 Kč
Celkem: ~6100 Kč
Střední zahrada (8 zón):
Raspberry Pi: 2000 Kč
8x ventil 24V: 8000 Kč
Expandér + relé: 800 Kč
8x senzor: 1600 Kč
Trafo 24V: 800 Kč
Průtokoměr: 800 Kč
Instalační materiál: 2000 Kč
Celkem: ~16000 Kč
Plánování systému
1. Rozdělení na zóny
Podle typu rostlin:
- Zóna 1: Trávník (denně krátce)
- Zóna 2: Záhony (2-3x týdně déle)
- Zóna 3: Keře (1x týdně hodně)
- Zóna 4: Skleník (často málo)
Podle slunce:
- Jižní strana - častější zalévání
- Severní/stín - méně časté
2. Výpočet průtoku
Příklad výpočtu:
- Tlak vody: 3 bary
- Průtok kohoutku: 15 l/min
- Postřikovač: 2 l/min
- Max postřikovačů/zónu: 7
Kapkovače:
- Kapkovač: 2-4 l/hod
- Na zónu: až 50 kapkovačů
3. Rozvody vody
Hlavní přívodní potrubí:
- PE 25-32mm nebo 1"
- Zakopat 30-40cm (proti mrazu)
- Spád pro vypouštění
Rozvody k rostlinám:
- PE 16-20mm
- Nebo mikrotrubičky 4-6mm
- Uchycení kolíky
Sestavení elektroniky
ESP32 řešení (doporučeno)
Potřebné součástky:
- ESP32 DevKit
- 8-kanálové relé 5V
- Zdroj 5V/3A
- Svorkovnice
- Krabice IP65
- Propojovací kabely
Zapojení:
ESP32 -> Relé modul:
GPIO23 -> IN1 (Zóna 1)
GPIO22 -> IN2 (Zóna 2)
GPIO21 -> IN3 (Zóna 3)
GPIO19 -> IN4 (Zóna 4)
VIN -> VCC
GND -> GND
Vlhkostní senzory:
GPIO34 -> Senzor 1 (analog)
GPIO35 -> Senzor 2 (analog)
GPIO32 -> Senzor 3 (analog)
GPIO33 -> Senzor 4 (analog)
Ventily:
Relé NO -> Ventil (+)
Zdroj 12V -> Ventil (-)
Kód pro ESP32
#include <WiFi.h>
#include <WebServer.h>
#include <ArduinoJson.h>
// WiFi credentials
const char* ssid = "VaseWiFi";
const char* password = "VaseHeslo";
// Piny
const int zone_pins[] = {23, 22, 21, 19};
const int moisture_pins[] = {34, 35, 32, 33};
const int num_zones = 4;
// Nastavení
int moisture_threshold[] = {30, 40, 35, 45}; // %
int watering_duration[] = {300, 600, 900, 300}; // sekundy
WebServer server(80);
void setup() {
Serial.begin(115200);
// Nastavení pinů
for (int i = 0; i < num_zones; i++) {
pinMode(zone_pins[i], OUTPUT);
digitalWrite(zone_pins[i], LOW);
}
// WiFi připojení
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Připojování k WiFi...");
}
Serial.println("Připojeno! IP: " + WiFi.localIP().toString());
// Web server endpoints
server.on("/", handleRoot);
server.on("/status", handleStatus);
server.on("/water", handleWater);
server.on("/settings", handleSettings);
server.begin();
}
void loop() {
server.handleClient();
// Kontrola vlhkosti každých 30 minut
static unsigned long lastCheck = 0;
if (millis() - lastCheck > 1800000) { // 30 min
checkMoistureAndWater();
lastCheck = millis();
}
}
void checkMoistureAndWater() {
for (int i = 0; i < num_zones; i++) {
int moisture = readMoisture(i);
if (moisture < moisture_threshold[i]) {
Serial.println("Zóna " + String(i+1) + " suchá (" +
String(moisture) + "%) - zalévám");
waterZone(i, watering_duration[i]);
}
}
}
int readMoisture(int zone) {
int raw = analogRead(moisture_pins[zone]);
// Převod na procenta (kalibrovat podle senzoru)
// Sucho = 4095, Mokro = 1000
int percent = map(raw, 4095, 1000, 0, 100);
return constrain(percent, 0, 100);
}
void waterZone(int zone, int duration) {
digitalWrite(zone_pins[zone], HIGH);
delay(duration * 1000);
digitalWrite(zone_pins[zone], LOW);
}
void handleRoot() {
String html = R"(
<!DOCTYPE html>
<html>
<head>
<title>Smart Zavlažování</title>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<style>
body { font-family: Arial; margin: 20px; }
.zone { border: 1px solid #ddd; padding: 15px; margin: 10px 0; }
button { padding: 10px 20px; margin: 5px; }
.moisture { font-weight: bold; }
</style>
</head>
<body>
<h1>Smart Zavlažování</h1>
<div id='zones'></div>
<script>
function updateStatus() {
fetch('/status')
.then(r => r.json())
.then(data => {
let html = '';
data.zones.forEach((zone, i) => {
html += `
<div class='zone'>
<h3>Zóna ${i+1}</h3>
<p>Vlhkost: <span class='moisture'>${zone.moisture}%</span></p>
<p>Limit: ${zone.threshold}%</p>
<p>Stav: ${zone.active ? 'Zalévá' : 'Vypnuto'}</p>
<button onclick='waterZone(${i})'>Zalít (${zone.duration}s)</button>
</div>
`;
});
document.getElementById('zones').innerHTML = html;
});
}
function waterZone(zone) {
fetch(`/water?zone=${zone}`)
.then(() => updateStatus());
}
setInterval(updateStatus, 5000);
updateStatus();
</script>
</body>
</html>
)";
server.send(200, "text/html", html);
}
void handleStatus() {
StaticJsonDocument<512> doc;
JsonArray zones = doc.createNestedArray("zones");
for (int i = 0; i < num_zones; i++) {
JsonObject zone = zones.createNestedObject();
zone["moisture"] = readMoisture(i);
zone["threshold"] = moisture_threshold[i];
zone["duration"] = watering_duration[i];
zone["active"] = digitalRead(zone_pins[i]);
}
String response;
serializeJson(doc, response);
server.send(200, "application/json", response);
}
void handleWater() {
if (server.hasArg("zone")) {
int zone = server.arg("zone").toInt();
if (zone >= 0 && zone < num_zones) {
waterZone(zone, watering_duration[zone]);
server.send(200, "text/plain", "OK");
return;
}
}
server.send(400, "text/plain", "Bad Request");
}
Integrace s počasím
OpenWeatherMap API
#include <HTTPClient.h>
const char* api_key = "VAS_API_KLIC";
const char* city = "Prague,CZ";
bool willRainSoon() {
HTTPClient http;
String url = "http://api.openweathermap.org/data/2.5/forecast?q=" +
String(city) + "&appid=" + String(api_key);
http.begin(url);
int httpCode = http.GET();
if (httpCode == 200) {
String payload = http.getString();
StaticJsonDocument<2048> doc;
deserializeJson(doc, payload);
// Kontrola předpovědi na 6 hodin
for (int i = 0; i < 2; i++) {
String weather = doc["list"][i]["weather"][0]["main"];
if (weather == "Rain") {
return true;
}
}
}
http.end();
return false;
}
// V checkMoistureAndWater přidat:
if (willRainSoon()) {
Serial.println("Bude pršet, přeskakuji zalévání");
return;
}
Home Assistant integrace
ESPHome konfigurace
esphome:
name: smart-zavlazovani
platform: ESP32
board: esp32dev
wifi:
ssid: "VaseWiFi"
password: "VaseHeslo"
api:
password: "api-heslo"
ota:
password: "ota-heslo"
# Senzory vlhkosti
sensor:
- platform: adc
pin: GPIO34
name: "Vlhkost Zóna 1"
unit_of_measurement: "%"
filters:
- calibrate_linear:
- 2.8 -> 0.0
- 1.1 -> 100.0
update_interval: 30min
- platform: adc
pin: GPIO35
name: "Vlhkost Zóna 2"
# ... podobně pro další zóny
# Ovládání ventilů
switch:
- platform: gpio
pin: GPIO23
name: "Zavlažování Zóna 1"
id: zone1
icon: "mdi:water"
- platform: gpio
pin: GPIO22
name: "Zavlažování Zóna 2"
id: zone2
icon: "mdi:water"
# ... další zóny
# Automatizace
interval:
- interval: 30min
then:
- if:
condition:
sensor.in_range:
id: moisture_zone1
below: 30.0
then:
- switch.turn_on: zone1
- delay: 5min
- switch.turn_off: zone1
Home Assistant automatizace
automation:
- alias: "Ranní zalévání"
trigger:
- platform: time
at: "06:00:00"
condition:
- condition: numeric_state
entity_id: sensor.moisture_zone1
below: 40
- condition: numeric_state
entity_id: weather.home
attribute: precipitation_probability
below: 30
action:
- service: switch.turn_on
entity_id: switch.zavlazovani_zona_1
- delay: "00:05:00"
- service: switch.turn_off
entity_id: switch.zavlazovani_zona_1
- alias: "Upozornění na nízkou vlhkost"
trigger:
- platform: numeric_state
entity_id: sensor.moisture_zone2
below: 25
for: "01:00:00"
action:
- service: notify.mobile_app_phone
data:
title: "Zahrada vyschla!"
message: "Zóna 2 má vlhkost jen {{ states('sensor.moisture_zone2') }}%"
Mechanická instalace
Instalace ventilů
Umístění ventilové šachty
- Plastová šachta 30x40cm
- Drenáž na dně (štěrk)
- Přístup pro údržbu
Zapojení ventilů
Hlavní přívod → Hlavní uzávěr → Filtr → → Rozdvojka → Ventil 1 → Zóna 1 → Ventil 2 → Zóna 2 → atd.
Elektrické připojení
- Kabel CYKY 3x1.5 v chráničce
- Vodotěsné konektory
- Označení kabelů
Rozvody vody
Hlavní větve:
- Výkop 30-40cm
- Pískové lože
- Položení PE trubky
- Obsyp pískem
- Výstražná fólie
- Zásyp
Kapkovací hadice:
Rozteč kapkovačů:
- Zelenina: 30cm
- Keře: 50-100cm
- Stromy: kolem kmene
Uchycení:
- Plastové kolíky co 1m
- U kapkovačů oblouk
Kalibrace a ladění
Kalibrace vlhkostních senzorů
- Suchá země: Změřte hodnotu
- Zalitá země: Počkejte 30 min, změřte
- Ideální vlhkost: Dle typu rostlin (30-60%)
Optimalizace času zalévání
Testování:
1. Zalejte zónu 5 minut
2. Počkejte 1 hodinu
3. Zkontrolujte hloubku provlhčení
4. Upravte čas podle potřeby
Cílová hloubka:
- Trávník: 10-15cm
- Záhony: 20-30cm
- Keře/stromy: 40-60cm
Údržba systému
Sezónní údržba
Jaro:
- Kontrola těsnosti spojů
- Vyčištění filtrů
- Test všech zón
- Kalibrace senzorů
Podzim:
- Vypuštění systému
- Profuk vzduchem
- Demontáž ventilů (nebo glycerin)
- Zazimování elektroniky
Běžná údržba
- Týdně: Vizuální kontrola
- Měsíčně: Čištění kapkovačů
- Sezónně: Výměna filtrů
- Ročně: Kontrola kabeláže
Pokročilé funkce
Monitoring spotřeby vody
// Průtokoměr na GPIO25
volatile int pulseCount = 0;
float flowRate = 0;
float totalLiters = 0;
void IRAM_ATTR pulseCounter() {
pulseCount++;
}
void setupFlowMeter() {
pinMode(25, INPUT_PULLUP);
attachInterrupt(25, pulseCounter, FALLING);
}
void calculateFlow() {
// YF-S201: 450 pulzů = 1 litr
flowRate = pulseCount / 450.0 * 60; // L/min
totalLiters += pulseCount / 450.0;
pulseCount = 0;
}
Detekce úniků
automation:
- alias: "Detekce úniku vody"
trigger:
- platform: numeric_state
entity_id: sensor.flow_rate
above: 0.5
for: "00:30:00"
condition:
- condition: state
entity_id: group.all_zones
state: "off"
action:
- service: notify.mobile_app_phone
data:
title: "POZOR - Únik vody!"
message: "Průtok detekován bez aktivní zóny!"
Řešení problémů
Ventil se neotevírá
- Zkontrolujte napětí (multimetr)
- Manuální test ventilu
- Vyčistěte membránu
- Zkontrolujte cívku
Nerovnoměrné zalévání
- Zkontrolujte tlak vody
- Vyčistěte ucpané trysky
- Přidejte regulátor tlaku
- Rozdělte na více zón
Senzor vlhkosti nefunguje
- Očistěte elektrody
- Zkontrolujte hloubku
- Vyměňte za kapacitní typ
- Přidejte ochranu proti korozi
Cenové srovnání s komerčními systémy
Řešení | Cena | Funkce | Údržba |
---|---|---|---|
DIY ESP32 | 6-15k | Plná kontrola | Sám |
Gardena Smart | 20-40k | Omezené | Střední |
Rain Bird | 30-60k | Profesionální | Servis |
Hunter Hydrawise | 25-50k | Cloud | Servis |
Závěr
Stavba vlastního smart zavlažovacího systému není složitá a přináší plnou kontrolu nad vaší zahradou. Začněte jednoduše s několika zónami a postupně rozšiřujte. Investice se vrátí v úspoře vody a zdravějších rostlinách.
Tip: Začněte s jednou zkušební zónou a až si ověříte funkčnost, rozšiřte na celou zahradu.
Související články
- Vertikální zahrada s automatickým zavlažováním
- Automatizace domácnosti s Home Assistant
- Chytrý skleník - pěstování zeleniny celoročně