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.

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
Componente | Função |
ESP32-S3 UNO | Microcontrolador com Wi-Fi e Bluetooth |
Sensor de umidade de solo | Mede o nível de umidade |
Módulo relé 1 canal | Aciona a bomba d’água |
Mini bomba 5V | Realiza a irrigação |
Jumpers / Protoboard | Conexões |
Os componentes mencionados acima, podem ser substituídos pelo Kit de Irrigação Automática da Saravati

Ligações dos Componentes
- Sensor de umidade:
- Sinal → GPIO2 (IO2)
- VCC → 5V
- GND → GND
- Sinal → GPIO2 (IO2)
- Relé:
- IN → GPIO21 (IO21)
- VCC → 5V
- GND → GND
- Saída do relé → bomba + fonte externa 5V
- IN → GPIO21 (IO21)
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.
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.
- Quando a umidade cai abaixo do valor configurado, a bomba é acionada.
- Se o modo manual estiver ativo:
- O usuário pode ligar ou desligar a bomba independentemente da umidade.
- 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.