IMG 0F8371049AA2 1 Saravati

Como Criar um Sistema de Irrigação Automática com ESP32-S3 e Interface Web

A irrigação inteligente é um dos projetos mais interessantes e úteis dentro do mundo da eletrônica e automação. Neste artigo, você vai aprender como montar um sistema completo de monitoramento da umidade do solo, utilizando a poderosa placa ESP32-S3 UNO, um sensor de umidade, um relé e uma bomba d’água.

image Saravati

Além de medir a umidade em tempo real, o projeto conta com uma interface web moderna, onde é possível:

  • Visualizar a umidade do solo em porcentagem
  • Definir o valor mínimo de umidade para acionar a bomba automaticamente
  • Ligar e desligar a bomba manualmente com um clique

Ideal para estudantes, makers e profissionais que buscam automatizar pequenos jardins, vasos ou projetos demonstrativos.

Componentes Utilizados

ComponenteFunção
ESP32-S3 UNOMicrocontrolador com Wi-Fi e Bluetooth
Sensor de umidade de soloMede o nível de umidade
Módulo relé 1 canalAciona a bomba d’água
Mini bomba 5VRealiza a irrigação
Jumpers / ProtoboardConexões

Os componentes mencionados acima, podem ser substituídos pelo Kit de Irrigação Automática da Saravati

image 1 Saravati

Ligações dos Componentes

  • Sensor de umidade:
    • Sinal → GPIO2 (IO2)
    • VCC → 5V
    • GND → GND
  • Relé:
    • IN → GPIO21 (IO21)
    • VCC → 5V
    • GND → GND
    • Saída do relé → bomba + fonte externa 5V

Interface Web Integrada

A grande vantagem do projeto é poder acessar uma interface web no navegador (do PC ou celular), criada pelo próprio ESP32, onde é possível monitorar e controlar o sistema sem aplicativos externos.

AD 4nXdXemTgDTrNt5x0pvizQREFLAPtmuMWVEyLaxqNPww1DqFjRoFV07bcE2C37Kht4Ciqm17G0dVxUSoT Saravati

Exemplo da interface:

Como funciona a lógica

  • O sensor lê a umidade do solo constantemente.
  • Se o modo automático estiver ativo:
    • Quando a umidade cai abaixo do valor configurado, a bomba é acionada.
    • Quando a umidade sobe acima do valor configurado, a bomba é desligada imediatamente.
  • Se o modo manual estiver ativo:
    • O usuário pode ligar ou desligar a bomba independentemente da umidade.

Acesso via Wi-Fi

O ESP32-S3 se conecta à sua rede Wi-Fi local. Ao iniciar, ele imprime no Serial Monitor o IP local. Basta digitar esse IP no navegador do celular ou do computador para acessar a interface.

Código completo do projeto

Abaixo está o código completo para ser carregado na placa ESP32-S3 UNO utilizando a Arduino IDE.

Não esqueça de substituir “SEU_WIFI” e “SUA_SENHA” pelo nome e senha da sua rede.

#include <WiFi.h>

#include <WebServer.h>

#define SENSOR_PIN 2

#define RELAY_PIN 21

const char* ssid = “SEU_WIFI”;

const char* password = “SUA_SENHA”;

WebServer server(80);

int umidade = 0;

int nivelMinimo = 30;

bool bombaLigada = false;

bool modoManual = false;

unsigned long ultimaLeitura = 0;

const unsigned long intervaloLeitura = 1000; // 1 segundo

String gerarPagina() {

  String html = R”rawliteral(

    <!DOCTYPE html>

    <html>

    <head>

      <meta name=”viewport” content=”width=device-width, initial-scale=1″>

      <style>

        body { font-family: Arial; text-align: center; background: #f2f2f2; }

        .container { padding: 20px; margin: auto; max-width: 400px; background: white; border-radius: 10px; box-shadow: 0 0 10px #ccc; }

        h2 { color: #333; }

        input[type=range] { width: 100%; }

        button { padding: 10px 20px; font-size: 16px; margin-top: 10px; }

        .status { font-size: 18px; margin-top: 10px; }

      </style>

    </head>

    <body>

      <div class=”container”>

        <h2>Monitor de Umidade</h2>

        <p><strong>Umidade do solo:</strong> <span id=”umidade”>–</span>%</p>

        <label for=”nivel”>Nivel minimo para ligar bomba:</label><br>

        <input type=”range” id=”nivel” min=”0″ max=”100″ value=”%NIVEL%”>

        <p><span id=”nivelVal”>%NIVEL%</span>%</p>

        <button onclick=”toggleManual()”><span id=”modo”>Modo: Automatico</span></button>

        <button onclick=”toggleBomba()”>Bomba <span id=’estado’>DESLIGADA</span></button>

        <p class=”status” id=”statusText”>Ultima leitura: agora</p>

      </div>

      <script>

        setInterval(() => {

          fetch(‘/data’).then(r => r.json()).then(data => {

            document.getElementById(‘umidade’).innerText = data.umidade;

            document.getElementById(‘estado’).innerText = data.bomba ? ‘LIGADA’ : ‘DESLIGADA’;

            document.getElementById(‘modo’).innerText = ‘Modo: ‘ + (data.manual ? ‘Manual’ : ‘Automatico’);

            document.getElementById(‘statusText’).innerText = ‘Ultima leitura: agora’;

          });

        }, 1000);

        document.getElementById(“nivel”).addEventListener(“input”, function() {

          document.getElementById(“nivelVal”).innerText = this.value;

          fetch(‘/setnivel?valor=’ + this.value);

        });

        function toggleManual() {

          fetch(‘/manual’);

        }

        function toggleBomba() {

          fetch(‘/toggle’);

        }

      </script>

    </body>

    </html>

  )rawliteral”;

  html.replace(“%NIVEL%”, String(nivelMinimo));

  return html;

}

void handleRoot() {

  server.send(200, “text/html”, gerarPagina());

}

void handleData() {

  String json = “{“;

  json += “\”umidade\”:” + String(umidade) + “,”;

  json += “\”bomba\”:” + String(bombaLigada ? “true” : “false”) + “,”;

  json += “\”manual\”:” + String(modoManual ? “true” : “false”);

  json += “}”;

  server.send(200, “application/json”, json);

}

void handleSetNivel() {

  if (server.hasArg(“valor”)) {

    nivelMinimo = server.arg(“valor”).toInt();

    Serial.print(“Nivel minimo ajustado para: “);

    Serial.println(nivelMinimo);

  }

  server.send(200, “text/plain”, “OK”);

}

void handleManual() {

  modoManual = !modoManual;

  Serial.print(“Modo manual: “);

  Serial.println(modoManual ? “Ativado” : “Desativado”);

  server.send(200, “text/plain”, “OK”);

}

void handleToggle() {

  bombaLigada = !bombaLigada;

  digitalWrite(RELAY_PIN, bombaLigada ? HIGH : LOW);

  Serial.print(“Bomba “);

  Serial.println(bombaLigada ? “LIGADA (manual)” : “DESLIGADA (manual)”);

  server.send(200, “text/plain”, “OK”);

}

void setup() {

  pinMode(RELAY_PIN, OUTPUT);

  digitalWrite(RELAY_PIN, LOW);

  Serial.begin(115200);

  WiFi.begin(ssid, password);

  Serial.print(“Conectando ao Wi-Fi”);

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(“.”);

  }

  Serial.println(“\nWi-Fi conectado: ” + WiFi.localIP().toString());

  server.on(“/”, handleRoot);

  server.on(“/data”, handleData);

  server.on(“/setnivel”, handleSetNivel);

  server.on(“/manual”, handleManual);

  server.on(“/toggle”, handleToggle);

  server.begin();

}

void loop() {

  server.handleClient();

  if (millis() – ultimaLeitura > intervaloLeitura) {

    int leituraBruta = analogRead(SENSOR_PIN);

    umidade = map(leituraBruta, 0, 4095, 100, 0);

    ultimaLeitura = millis();

    Serial.print(“Umidade: “);

    Serial.print(umidade);

    Serial.println(” %”);

  }

  if (!modoManual) {

    bool novaBomba = (umidade < nivelMinimo);

    if (novaBomba != bombaLigada) {

      bombaLigada = novaBomba;

      digitalWrite(RELAY_PIN, bombaLigada ? HIGH : LOW);

      Serial.println(bombaLigada ? “Bomba LIGADA (automatico)” : “Bomba DESLIGADA (automatico)”);

    }

  }

}

Conclusão

Este projeto mostra como a combinação de ESP32-S3 + interface web pode criar sistemas automatizados práticos e inteligentes. Seja para estudos, protótipos ou soluções reais, você pode expandi-lo com notificações, gráficos e muito mais.

Se gostou do projeto, compartilhe com outros makers e aproveite para personalizar conforme sua criatividade!

Saiba mais sobre a parceria Saravati e Sara Educação

Este “Guia de Montagem” é uma colaboração especial entre a Saravati e a Sara Educação, criado pelo Professor Felipe Rosa. Nosso objetivo é enriquecer a comunidade de entusiastas da eletrônica, IoT e automação com recursos educacionais de alta qualidade. Através dessa parceria, buscamos inspirar e capacitar criadores em seus projetos, disponibilizando esses guias em nosso blog e nas redes sociais.

@saravatirobotica no Instagram e Tiktok

@sara.educacao no Instagram e Tiktok