Reklama

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

Automatický zavlažovací systém na zahradě s chytrým ovládáním přes mobil a senzory vlhkosti

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ů

  1. Umístění ventilové šachty

    • Plastová šachta 30x40cm
    • Drenáž na dně (štěrk)
    • Přístup pro údržbu
  2. Zapojení ventilů

    Hlavní přívod → Hlavní uzávěr → Filtr → 
    → Rozdvojka → Ventil 1 → Zóna 1
               → Ventil 2 → Zóna 2
               → atd.
    
  3. Elektrické připojení

    • Kabel CYKY 3x1.5 v chráničce
    • Vodotěsné konektory
    • Označení kabelů

Rozvody vody

Hlavní větve:

  1. Výkop 30-40cm
  2. Pískové lože
  3. Položení PE trubky
  4. Obsyp pískem
  5. Výstražná fólie
  6. 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ů

  1. Suchá země: Změřte hodnotu
  2. Zalitá země: Počkejte 30 min, změřte
  3. 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á

  1. Zkontrolujte napětí (multimetr)
  2. Manuální test ventilu
  3. Vyčistěte membránu
  4. 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íCenaFunkceÚdržba
DIY ESP326-15kPlná kontrolaSám
Gardena Smart20-40kOmezenéStřední
Rain Bird30-60kProfesionálníServis
Hunter Hydrawise25-50kCloudServis

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

Reklama