Manter nossos pets bem hidratados é fundamental para a saúde deles, mas nossa rotina corrida às vezes nos faz esquecer de trocar a água ou recarregar o bebedouro. Este projeto resolve esse problema criando um sistema inteligente que monitora o nível da água e reabastece automaticamente quando necessário, além de enviar notificações para seu celular.
Visão Geral do Projeto
- O que vamos construir: Sistema completo Arduino + sensores + bomba + app
- Resultado: Bebedouro que funciona sozinho e mantém água sempre fresca
- Nível de dificuldade: Intermediário/Avançado
- Tempo de construção: 8 a 12 horas (distribuídas em um fim de semana)
- Custo estimado: R$ 400 a R$ 700
Por que automatizar o bebedouro do seu pet?
Pets precisam de água fresca e limpa constantemente:
- Hidratação constante: Cães precisam de 50-100ml por kg/dia
- Saúde renal: Gatos são propensos a problemas renais por desidratação
- Emergências: Sistema previne que o pet fique sem água
- Tranquilidade: Monitoramento remoto quando você não está em casa
- Água fresca: Renovação automática evita água parada
Material Necessário
Eletrônicos principais:
- Arduino Uno R3 - R$ 60-90
- Sensor ultrassônico HC-SR04 - R$ 15-30
- Bomba d'água submersível 5V - R$ 35-60
- Módulo relé 5V 1 canal - R$ 20-35
- Display LCD 16x2 com I2C - R$ 25-45
- ESP8266 NodeMCU (para WiFi) - R$ 35-50
- Buzzer ativo 5V - R$ 5-10
Estrutura física:
- Reservatório de água 5L - R$ 20-35
- Tigela do pet (inox) - R$ 25-45
- Mangueira silicone 8mm (2m) - R$ 15-25
- Caixa plástica vedada - R$ 20-35
- Suporte/base MDF - R$ 25-40
Componentes auxiliares:
- Fonte 9V 2A - R$ 30-45
- Protoboard + jumpers - R$ 20-30
- Resistores + capacitores - R$ 8-20
- Parafusos e conectores - R$ 15-25
Custo total: R$ 400-700
⚠️ Importante: As marcas mencionadas são citadas apenas para fins educativos e informativos. Não possuímos qualquer parceria comercial com essas empresas.
Como Funciona o Sistema
Fluxo de operação automática:
- Monitoramento: Sensor ultrassônico mede nível da água na tigela
- Análise: Arduino processa dados e determina se precisa reabastecer
- Ação: Bomba é acionada automaticamente para adicionar água
- Notificação: App móvel informa sobre reabastecimentos
- Display: LCD mostra status em tempo real
- Segurança: Sistema tem proteções contra operação a seco
Recursos inteligentes:
- Reabastecimento automático quando água baixa
- Horários programados para renovação da água
- Contador de consumo diário do pet
- Alertas de manutenção (limpeza, filtro)
- Modo manual via app para forçar reabastecimento
- Histórico de consumo para acompanhar saúde
Esquema de Ligações
Arduino Uno Componente
============= ==================
Digital 2 → HC-SR04 (Trigger)
Digital 3 → HC-SR04 (Echo)
Digital 4 → Relé bomba (IN)
Digital 5 → Buzzer
Digital 7 → LED Status (verde)
Digital 8 → LED Alerta (vermelho)
Digital 9 → Botão manual
A4 (SDA) → Display LCD (SDA)
A5 (SCL) → Display LCD (SCL)
5V → Alimentação sensores
GND → Terra comum
ESP8266 - Para conectividade WiFi:
ESP8266 Arduino/Componentes
============= ==================
D1 (GPIO5) → Arduino TX (pino 1)
D2 (GPIO4) → Arduino RX (pino 0)
3.3V → Alimentação própria
GND → Terra comum
Sistema hidráulico:
Reservatório 5L → Mangueira → Bomba → Mangueira → Tigela Pet
↑ ↓
└─────────── Recirculação (opcional) ←──────────┘Código Principal Arduino
Programa completo do bebedouro:
Ver código completo
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
// =============== CONFIGURAÇÕES DOS PINOS ===============
#define TRIGGER_PIN 2
#define ECHO_PIN 3
#define RELAY_PUMP_PIN 4
#define BUZZER_PIN 5
#define LED_STATUS_PIN 7
#define LED_ALERT_PIN 8
#define BUTTON_PIN 9
// =============== CONFIGURAÇÕES DO SISTEMA ===============
#define WATER_LOW_LEVEL 15 // cm (quando ativar bomba)
#define WATER_HIGH_LEVEL 5 // cm (quando parar bomba)
#define PUMP_MAX_TIME 10000 // 10 segundos máximo
#define DAILY_REFRESH_HOUR 8 // Renovação diária às 8h
#define CONSUMPTION_RESET_HOUR 0 // Reset contador à meia-noite
// =============== OBJETOS GLOBAIS ===============
LiquidCrystal_I2C lcd(0x27, 16, 2);
SoftwareSerial espSerial(10, 11); // RX, TX para ESP8266
// =============== VARIÁVEIS GLOBAIS ===============
float waterLevel = 0; // cm
bool pumpActive = false;
unsigned long pumpStartTime = 0;
unsigned long lastMeasurement = 0;
unsigned long dailyConsumption = 0; // ml
unsigned long totalRefills = 0;
unsigned long lastRefillTime = 0;
// Estados do sistema
enum SystemState {
MONITORING,
FILLING,
ERROR,
MAINTENANCE
};
SystemState currentState = MONITORING;
String lastError = "";
// =============== SETUP PRINCIPAL ===============
void setup() {
Serial.begin(9600);
espSerial.begin(9600);
initializePins();
initializeDisplay();
// Teste inicial dos componentes
testSystemComponents();
currentState = MONITORING;
Serial.println("Bebedouro iniciado - Modo monitoramento");
displayWelcomeMessage();
playStartupSound(
</>);
}
// =============== LOOP PRINCIPAL ===============
void loop() {
unsigned long currentTime = millis();
// Leitura do sensor a cada 2 segundos
if (currentTime - lastMeasurement >= 2000) {
measureWaterLevel();
lastMeasurement = currentTime;
}
// Processamento baseado no estado atual
switch (currentState) {
case MONITORING:
processMonitoring();
break;
case FILLING:
processFilling();
break;
case ERROR:
processError();
break;
case MAINTENANCE:
processMaintenance();
break;
}
// Verificações de segurança
checkSafetyConditions();
// Atualização da interface
updateDisplay();
updateLEDs();
// Processamento de comandos
handleButtonPress();
handleWiFiCommands();
// Tarefas programadas
checkScheduledTasks();
delay(100);
}
// =============== INICIALIZAÇÃO ===============
void initializePins() {
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PUMP_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_STATUS_PIN, OUTPUT);
pinMode(LED_ALERT_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Estado inicial seguro
digitalWrite(RELAY_PUMP_PIN, LOW);
digitalWrite(LED_STATUS_PIN, HIGH);
digitalWrite(LED_ALERT_PIN, LOW);
}
void initializeDisplay() {
lcd.init();
lcd.backlight();
lcd.clear();
}
void testSystemComponents() {
lcd.setCursor(0, 0);
lcd.print("Testando...");
// Teste do sensor ultrassônico
measureWaterLevel();
if (waterLevel > 0 && waterLevel < 50) {
lcd.setCursor(0, 1);
lcd.print("Sensor: OK");
} else {
lcd.setCursor(0, 1);
lcd.print("Sensor: ERRO");
lastError = "Sensor ultrassônico";
}
delay(2000);
// Teste da bomba (1 segundo)
lcd.setCursor(0, 1);
lcd.print("Bomba: Teste...");
digitalWrite(RELAY_PUMP_PIN, HIGH);
delay(1000);
digitalWrite(RELAY_PUMP_PIN, LOW);
lcd.setCursor(0, 1);
lcd.print("Bomba: OK ");
delay(1000);
}
// =============== MEDIÇÃO DE NÍVEL ===============
void measureWaterLevel() {
// Enviar pulso ultrassônico
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
// Medir tempo de retorno
unsigned long duration = pulseIn(ECHO_PIN, HIGH);
// Calcular distância em cm
float distance = (duration * 0.034) / 2;
// Filtro simples para evitar leituras erráticas
if (distance > 0 && distance < 50) {
waterLevel = (waterLevel * 0.8) + (distance * 0.2); // Filtro passa-baixa
}
// Debug
Serial.print("Nível água: ");
Serial.print(waterLevel);
Serial.println(" cm");
}
// =============== PROCESSAMENTO DE ESTADOS ===============
void processMonitoring() {
// Verificar se precisa reabastecer
if (waterLevel >= WATER_LOW_LEVEL) {
startRefilling("Nível baixo detectado");
}
// Modo standby normal
digitalWrite(LED_STATUS_PIN, HIGH);
digitalWrite(LED_ALERT_PIN, LOW);
}
void processFilling() {
unsigned long elapsedTime = millis() - pumpStartTime;
// Verificar se atingiu nível adequado
if (waterLevel <= WATER_HIGH_LEVEL) {
stopRefilling("Nível adequado atingido");
return;
}
// Timeout de segurança
if (elapsedTime >= PUMP_MAX_TIME) {
stopRefilling("Timeout de segurança");
currentState = ERROR;
lastError = "Bomba não conseguiu reabastecer";
return;
}
// Indicação visual durante reabastecimento
digitalWrite(LED_STATUS_PIN, (millis() / 500) % 2); // Piscar a cada 500ms
}
void processError() {
// Piscar LED de alerta
digitalWrite(LED_ALERT_PIN, (millis() / 300) % 2);
digitalWrite(LED_STATUS_PIN, LOW);
// Som de alerta a cada 10 segundos
static unsigned long lastAlert = 0;
if (millis() - lastAlert >= 10000) {
playErrorSound();
lastAlert = millis();
}
// Permitir reset manual
if (digitalRead(BUTTON_PIN) == LOW) {
delay(100); // Debounce
if (digitalRead(BUTTON_PIN) == LOW) {
currentState = MONITORING;
lastError = "";
Serial.println("Estado de erro resetado manualmente");
}
}
}
void processMaintenance() {
// Modo manutenção - sistema pausado
digitalWrite(LED_STATUS_PIN, LOW);
digitalWrite(LED_ALERT_PIN, (millis() / 1000) % 2); // Piscar lento
// Sair da manutenção com botão
if (digitalRead(BUTTON_PIN) == LOW) {
delay(2000); // Pressão longa
if (digitalRead(BUTTON_PIN) == LOW) {
currentState = MONITORING;
Serial.println("Saindo do modo manutenção");
}
}
}
// =============== CONTROLE DA BOMBA ===============
void startRefilling(String reason) {
if (pumpActive) return; // Já está reabastecendo
pumpActive = true;
pumpStartTime = millis();
currentState = FILLING;
digitalWrite(RELAY_PUMP_PIN, HIGH);
Serial.println("Reabastecimento iniciado: " + reason);
sendNotification("Reabastecendo", reason);
// Estimativa de volume adicionado (aproximada)
float volumeToAdd = (WATER_LOW_LEVEL - WATER_HIGH_LEVEL) * 10; // cm para ml (aprox)
dailyConsumption += volumeToAdd;
totalRefills++;
lastRefillTime = millis();
}
void stopRefilling(String reason) {
if (!pumpActive) return;
pumpActive = false;
currentState = MONITORING;
digitalWrite(RELAY_PUMP_PIN, LOW);
Serial.println("Reabastecimento parado: " + reason);
sendNotification("Concluído", reason);
playCompletionSound();
}
// =============== VERIFICAÇÕES DE SEGURANÇA ===============
void checkSafetyConditions() {
// Verificar se sensor está funcionando
if (waterLevel <= 0 || waterLevel > 50) {
if (currentState != ERROR) {
currentState = ERROR;
lastError = "Sensor fora de alcance";
digitalWrite(RELAY_PUMP_PIN, LOW); // Parar bomba por segurança
}
}
// Verificar se bomba não está travada
if (pumpActive && (millis() - pumpStartTime) > PUMP_MAX_TIME) {
currentState = ERROR;
lastError = "Bomba com problema";
digitalWrite(RELAY_PUMP_PIN, LOW);
}
}
// =============== INTERFACE E DISPLAY ===============
void updateDisplay() {
lcd.clear();
// Primeira linha: Status principal
lcd.setCursor(0, 0);
switch (currentState) {
case MONITORING:
lcd.print("Agua: ");
lcd.print(20 - waterLevel, 1); // Converter para nível em %
lcd.print("cm OK");
break;
case FILLING:
lcd.print("Reabastecendo...");
break;
case ERROR:
lcd.print("ERRO: ");
lcd.print(lastError.substring(0, 9));
break;
case MAINTENANCE:
lcd.print("Manutencao");
break;
}
// Segunda linha: Informações adicionais
lcd.setCursor(0, 1);
if (currentState == FILLING) {
unsigned long elapsed = (millis() - pumpStartTime) / 1000;
lcd.print("Tempo: ");
lcd.print(elapsed);
lcd.print("s");
} else if (currentState == MONITORING) {
lcd.print("Consumo:");
lcd.print(dailyConsumption);
lcd.print("ml");
} else if (currentState == ERROR) {
lcd.print("Botao p/ reset");
}
}
void updateLEDs() {
// LEDs já são controlados nos estados individuais
// Esta função pode ser expandida para padrões mais complexos
}
void displayWelcomeMessage() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bebedouro Smart");
lcd.setCursor(0, 1);
lcd.print("Pet System v1.0");
delay(3000);
}
// =============== SONS E ALERTAS ===============
void playStartupSound() {
tone(BUZZER_PIN, 1000, 200);
delay(250);
tone(BUZZER_PIN, 1500, 200);
delay(250);
tone(BUZZER_PIN, 2000, 200);
}
void playCompletionSound() {
tone(BUZZER_PIN, 800, 100);
delay(150);
tone(BUZZER_PIN, 1000, 100);
delay(150);
tone(BUZZER_PIN, 1200, 100);
}
void playErrorSound() {
for (int i = 0; i < 3; i++) {
tone(BUZZER_PIN, 400, 200);
delay(300);
}
}
// =============== ENTRADA DO USUÁRIO ===============
void handleButtonPress() {
static unsigned long lastPress = 0;
if (digitalRead(BUTTON_PIN) == LOW && (millis() - lastPress) > 500) {
lastPress = millis();
if (currentState == MONITORING) {
// Reabastecimento manual
startRefilling("Acionamento manual");
} else if (currentState == ERROR) {
// Reset de erro
currentState = MONITORING;
lastError = "";
Serial.println("Erro resetado pelo usuário");
}
}
}
// =============== COMUNICAÇÃO WiFi ===============
void handleWiFiCommands() {
if (espSerial.available()) {
String command = espSerial.readStringUntil('\n');
command.trim();
if (command == "STATUS") {
sendStatusToApp();
} else if (command == "REFILL") {
startRefilling("Comando do app");
} else if (command == "RESET") {
currentState = MONITORING;
lastError = "";
} else if (command == "MAINTENANCE") {
currentState = MAINTENANCE;
}
}
}
void sendStatusToApp() {
String status = "";
status += "LEVEL:" + String(20 - waterLevel) + ";";
status += "STATE:" + String(currentState) + ";";
status += "CONSUMPTION:" + String(dailyConsumption) + ";";
status += "REFILLS:" + String(totalRefills) + ";";
espSerial.println(status);
Serial.println("Status enviado: " + status);
}
void sendNotification(String title, String message) {
String notification = "NOTIFY:" + title + ":" + message;
espSerial.println(notification);
Serial.println("Notificação: " + notification);
}
// =============== TAREFAS PROGRAMADAS ===============
void checkScheduledTasks() {
static unsigned long lastDailyCheck = 0;
// Verificar tarefas uma vez por minuto
if (millis() - lastDailyCheck >= 60000) {
lastDailyCheck = millis();
// Aqui você pode adicionar verificação de hora real (RTC)
// Por simplicidade, usando apenas contadores
// Reset diário do consumo (simula meia-noite)
static unsigned long dayStart = millis();
if (millis() - dayStart >= 86400000) { // 24 horas
dailyConsumption = 0;
totalRefills = 0;
dayStart = millis();
Serial.println("Contador diário resetado");
}
}
}App Móvel Básico (ESP8266)
Código para ESP8266 - Conectividade WiFi:
Ver código completo
#include <ESP8266WiFi.h>
#include <ESPAsyncWebServer.h>
#include <SoftwareSerial.h>
// Configurações WiFi
const char* ssid = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA";
// Comunicação com Arduino
SoftwareSerial arduinoSerial(D1, D2); // RX, TX
AsyncWebServer server(80);
// Dados recebidos do Arduino
String currentLevel = "0";
String systemState = "0";
String dailyConsumption = "0";
String totalRefills = "0";
void setup() {
Serial.begin(115200);
arduinoSerial.begin(9600);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("WiFi conectado: " + WiFi.localIP().toString());
setupWebServer();
}
void loop() {
// Processar comandos do Arduino
if (arduinoSerial.available()) {
String data = arduinoSerial.readStringUntil('\n');
processArduinoData(data);
}
// Solicitar status a cada 10 segundos
static unsigned long lastRequest = 0;
if (millis() - lastRequest >= 10000) {
arduinoSerial.println("STATUS");
lastRequest = millis();
}
delay(100);
}
void setupWebServer() {
// Página principal
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
String html = getMainPage();
request->send(200, "text/html", html);
});
// API para dados do bebedouro
server.on("/api/status", HTTP_GET, [](AsyncWebServerRequest *request){
String json = "{";
json += "\"level\":\"" + currentLevel + "\",";
json += "\"state\":\"" + systemState + "\",";
json += "\"consumption\":\"" + dailyConsumption + "\",";
json += "\"refills\":\"" + totalRefills + "\"";
json += "}";
request->send(200, "application/json", json);
});
// Comando para reabastecer
server.on("/api/refill", HTTP_POST, [](AsyncWebServerRequest *request){
arduinoSerial.println("REFILL");
request->send(200, "application/json", "{\"status\":\"ok\"}");
});
server.begin();
}
String getMainPage() {
return R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<title>Bebedouro Pet Smart</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body {
font-family: Arial, sans-serif;
background: linear-gradient(135deg, #4A90E2, #7B68EE);
color: white;
text-align: center;
padding: 20px;
margin: 0;
}
.container {
max-width: 400px;
margin: 0 auto;
background: rgba(0,0,0,0.3);
padding: 30px;
border-radius: 20px;
box-shadow: 0 10px 30px rgba(0,0,0,0.3);
}
.status-card {
background: rgba(255,255,255,0.1);
margin: 15px 0;
padding: 20px;
border-radius: 15px;
backdrop-filter: blur(10px);
}
.level-display {
font-size: 3em;
font-weight: bold;
margin: 20px 0;
color: #4CAF50;
}
.btn {
background: linear-gradient(45deg, #4CAF50, #45a049);
color: white;
border: none;
padding: 15px 30px;
border-radius: 25px;
font-size: 1.1em;
cursor: pointer;
margin: 10px;
transition: all 0.3s;
}
.btn:hover { transform: translateY(-2px); }
.stats { display: flex; justify-content: space-around; }
.stat { text-align: center; }
.stat-value { font-size: 1.5em; font-weight: bold; }
.stat-label { font-size: 0.9em; opacity: 0.8; }
</style>
</head>
<body>
<div class="container">
<h1>Bebedouro Smart</h1>
<div class="status-card">
<div>Nível da Água</div>
<div class="level-display" id="waterLevel">--</div>
<div id="statusText">Carregando...</div>
</div>
<div class="status-card">
<div class="stats">
<div class="stat">
<div class="stat-value" id="consumption">--</div>
<div class="stat-label">ml hoje</div>
</div>
<div class="stat">
<div class="stat-value" id="refills">--</div>
<div class="stat-label">reabastecimentos</div>
</div>
</div>
</div>
<button class="btn" onclick="refillNow()">Reabastecer Agora</button>
<button class="btn" onclick="location.reload()">Atualizar</button>
</div>
<script>
function updateStatus() {
fetch('/api/status')
.then(response => response.json())
.then(data => {
document.getElementById('waterLevel').textContent = data.level + ' cm';
document.getElementById('consumption').textContent = data.consumption;
document.getElementById('refills').textContent = data.refills;
let status = '';
switch(data.state) {
case '0': status = 'Monitorando'; break;
case '1': status = 'Reabastecendo'; break;
case '2': status = 'Erro'; break;
case '3': status = 'Manutenção'; break;
default: status = 'Desconhecido';
}
document.getElementById('statusText').textContent = status;
})
.catch(error => {
document.getElementById('statusText').textContent = 'Erro de conexão';
});
}
function refillNow() {
fetch('/api/refill', {method: 'POST'})
.then(response => response.json())
.then(data => {
alert('Reabastecimento iniciado!');
setTimeout(updateStatus, 1000);
});
}
// Atualizar a cada 5 segundos
setInterval(updateStatus, 5000);
updateStatus();
</script>
</body>
</html>
)rawliteral";
}
void processArduinoData(String data) {
// Processar dados no formato "LEVEL:10;STATE:0;CONSUMPTION:250;REFILLS:5;"
if (data.startsWith("LEVEL:")) {
int levelStart = data.indexOf("LEVEL:") + 6;
int levelEnd = data.indexOf(";", levelStart);
currentLevel = data.substring(levelStart, levelEnd);
int stateStart = data.indexOf("STATE:") + 6;
int stateEnd = data.indexOf(";", stateStart);
systemState = data.substring(stateStart, stateEnd);
int consStart = data.indexOf("CONSUMPTION:") + 12;
int consEnd = data.indexOf(";", consStart);
dailyConsumption = data.substring(consStart, consEnd);
int refillStart = data.indexOf("REFILLS:") + 8;
int refillEnd = data.indexOf(";", refillStart);
totalRefills = data.substring(refillStart, refillEnd);
}
}Montagem Física
Estrutura do bebedouro:
- Base principal: MDF 40x30cm com furos para componentes
- Reservatório: Fixado na parte traseira, elevado
- Tigela: Posicionada na frente, com sensor acima
- Eletrônica: Caixa vedada na lateral
- Mangueiras: Conexões silicone entre reservatório e tigela
Instalação hidráulica:
Reservatório (5L) → Válvula → Bomba → Filtro → Tigela Pet
↑ ↓
Eletrônica ←──── Sensor ←─────┘Cuidados importantes:
- Vedação: Proteger eletrônica da umidade
- Alimentação: Fonte estável e filtrada
- Limpeza: Acesso fácil para manutenção
- Segurança: Cabos protegidos dos pets
Distribuição do Tempo de Construção
Total: 8-12 horas
Montagem eletrônica (3-4 horas):
- Soldagem dos componentes: 1-2 horas
- Conexões e testes: 1 hora
- Montagem na caixa vedada: 1 hora
Programação e testes (2-3 horas):
- Upload do código Arduino: 30 minutos
- Configuração ESP8266 e WiFi: 1 hora
- Testes de comunicação: 30 minutos
- Calibração do sensor: 1 hora
Sistema hidráulico (2-3 horas):
- Instalação da bomba: 1 hora
- Conexão das mangueiras: 1 hora
- Testes de vedação: 30 minutos
- Ajustes de pressão: 30 minutos
Estrutura física (1-2 horas):
- Corte e montagem da base MDF: 1 hora
- Fixação dos componentes: 30 minutos
- Acabamento: 30 minutos
Calibração e ajustes finais (1-2 horas):
- Calibração precisa do sensor: 30 minutos
- Teste do ciclo completo: 30 minutos
- Ajustes de software: 30 minutos
- Documentação das configurações: 30 minutos
Configuração e Calibração
Calibração do sensor:
- Medir distâncias: Tigela vazia vs. cheia
- Ajustar constantes no código
- Testar ciclo completo de reabastecimento
- Validar precisão com medições manuais
Configuração WiFi:
Ver código completo
// Configurar no ESP8266
const char* ssid = "SUA_REDE_WIFI";
const char* password = "SUA_SENHA";
// Para primeira configuração, criar hotspot próprio:
void setupWiFiManager() {
WiFiManager wifiManager;
wifiManager.autoConnect("BebedouroPet_Setup");
Serial.println("WiFi configurado!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}Ajustes do sistema:
Ver código completo
// Personalizar para seu pet: #define WATER_LOW_LEVEL 15 // Ajustar conforme tamanho da tigela #define WATER_HIGH_LEVEL 5 // Nível máximo desejado #define PUMP_MAX_TIME 10000 // Tempo máximo de bomba ligada #define PET_CONSUMPTION_DAILY 500 // ml esperado por dia
Recursos Avançados Opcionais
1. Sensor de qualidade da água:
Ver código completo
#define TDS_SENSOR_PIN A1 // Sensor de sólidos dissolvidos
void checkWaterQuality() {
int tdsValue = analogRead(TDS_SENSOR_PIN);
float tdsConcentration = tdsValue * (5.0 / 1024.0) * 1000;
if (tdsConcentration > 300) { // PPM muito alto
currentState = MAINTENANCE;
lastError = "Trocar filtro";
sendNotification("Alerta", "Água precisa ser trocada");
}
}2. Integração com assistentes de voz:
Ver código completo
// Comandos Alexa via IFTTT
server.on("/alexa/refill", HTTP_GET, [](AsyncWebServerRequest *request){
arduinoSerial.println("REFILL");
request->send(200, "text/plain", "Reabastecimento iniciado");
});
server.on("/alexa/status", HTTP_GET, [](AsyncWebServerRequest *request){
String response = "Nível da água: " + currentLevel + " centímetros. ";
response += "Consumo hoje: " + dailyConsumption + " mililitros.";
request->send(200, "text/plain", response);
});3. Histórico e análise de dados:
Ver código completo
#include <EEPROM.h>
struct DailyData {
unsigned long date;
int consumption;
int refills;
float avgLevel;
};
void saveDailyData() {
DailyData today;
today.date = millis() / 86400000; // Dias desde inicialização
today.consumption = dailyConsumption;
today.refills = totalRefills;
today.avgLevel = 20 - waterLevel;
// Salvar no EEPROM (último endereço disponível)
int address = EEPROM.length() - sizeof(DailyData);
EEPROM.put(address, today);
EEPROM.commit();
}Solução de Problemas
Problemas comuns e soluções:
Sensor ultrassônico lendo errado:
- Verificar alimentação 5V estável
- Limpar sensores (poeira interfere)
- Ajustar posicionamento (evitar superfícies inclinadas)
- Adicionar filtro por software (média móvel)
Bomba não liga:
- Testar relé manualmente (digitalWrite(RELAY_PUMP_PIN, HIGH))
- Verificar alimentação da bomba (5V ou 12V)
- Confirmar conexões do relé (IN, VCC, GND)
- Verificar se bomba não está travada
App não conecta:
- Confirmar ESP8266 na mesma rede WiFi
- Verificar IP no monitor serial
- Testar ping para o ESP8266
- Verificar firewall/roteador
Pet não usa o bebedouro:
- Posicionar na altura correta
- Manter água sempre fresca
- Limpeza regular da tigela
- Transição gradual do bebedouro antigo
Código de diagnóstico:
Ver código completo
void runDiagnostics() {
Serial.println("=== DIAGNÓSTICO BEBEDOURO ===");
// Teste sensor
measureWaterLevel();
Serial.print("Sensor: ");
Serial.println(waterLevel > 0 && waterLevel < 50 ? "OK" : "ERRO");
// Teste bomba
Serial.print("Bomba: ");
digitalWrite(RELAY_PUMP_PIN, HIGH);
delay(500);
digitalWrite(RELAY_PUMP_PIN, LOW);
Serial.println("Testada");
// Teste WiFi
Serial.print("WiFi: ");
Serial.println(WiFi.status() == WL_CONNECTED ? "Conectado" : "Desconectado");
// Teste display
lcd.clear();
lcd.print("Teste Display");
Serial.println("Display: Testado");
Serial.println("=============================");
}Manutenção e Cuidados
Rotina de manutenção:
Diariamente:
- Verificar nível do reservatório
- Observar comportamento do pet
- Conferir funcionamento via app
Semanalmente:
- Limpeza completa da tigela
- Verificação das mangueiras
- Teste manual do sistema
Mensalmente:
- Limpeza do reservatório
- Calibração do sensor
- Backup dos dados
- Verificação das conexões elétricas
Trimestralmente:
- Troca/limpeza do filtro de água
- Lubrificação da bomba (se necessário)
- Atualização do firmware
- Revisão geral do sistema
Sinais de alerta:
Ver código completo
void checkMaintenanceAlerts() {
static unsigned long lastClean = 0;
// Alerta limpeza (7 dias)
if (millis() - lastClean > 604800000) {
sendNotification("Manutenção", "Hora de limpar o sistema");
lastClean = millis();
}
// Consumo anormal
if (dailyConsumption < PET_CONSUMPTION_DAILY * 0.3) {
sendNotification("Alerta", "Pet bebendo pouco - verificar saúde");
}
if (dailyConsumption > PET_CONSUMPTION_DAILY * 2.0) {
sendNotification("Alerta", "Consumo alto - possível vazamento");
}
}Análise de Custos e Benefícios
Comparação de investimento:
| Item | DIY | Comercial Premium |
|---|---|---|
| Custo inicial | R$ 400-700 | R$ 1.200-2.500 |
| Customização | Total | Limitada |
| Manutenção | Barata | Assistência técnica |
| Recursos | Expandível | Fixos |
| Aprendizado | Alto | Zero |
ROI estimado:
- Economia vs. comercial: R$ 800-1.800
- Tempo economizado: 5-10 min/dia
- Tranquilidade: Inestimável
- Payback: Imediato (qualidade de vida)
Benefícios para o pet:
- Hidratação constante: Água sempre disponível
- Saúde melhorada: Prevenção de problemas renais
- Água limpa: Renovação automática
- Monitoramento: Detecção precoce de problemas
Expansões Futuras
Versão 2.0 - Melhorias planejadas:
Ver código completo
// Recursos futuros a implementar: // - Sensor de presença do pet // - Análise de padrões de consumo // - Integração com veterinário // - Filtro UV para esterilização // - Aquecimento para inverno // - Câmera para monitoramento visual
Integração com outros projetos:
- Alimentador automático: Sincronizar horários
- Monitoramento de saúde: Análise integrada
- Casa inteligente: Integração MQTT/Home Assistant
- App unificado: Controle de todos os dispositivos pet
Código QR para configuração rápida:
Gerar QR code com:
- SSID da rede WiFi
- Senha da rede
- IP do bebedouro
- Link para manual online
Comparação: Bebedouro vs. Porta Pet
| Aspecto | Porta Pet | Bebedouro |
|---|---|---|
| Dificuldade | Iniciante/Intermediário | Intermediário/Avançado |
| Tempo | 4-6 horas | 8-12 horas |
| Custo | R$ 600-900 | R$ 400-700 |
| Programação | Python simples | Arduino + ESP8266 |
| Riscos | Baixos | Água + eletricidade |
| Manutenção | Baixa | Média |
| Impacto na saúde | Exercício | Hidratação vital |
Conclusão
Com investimento de R$ 400-700, você cria um sistema completo que:
Benefícios imediatos:
- Hidratação automática do pet 24/7
- Monitoramento remoto via celular
- Alertas de manutenção e problemas
- Água sempre fresca e limpa
Vantagens técnicas:
- Sistema expandível e customizável
- Manutenção simples e barata
- Código aberto para modificações
- Integração com casa inteligente
Tranquilidade para o dono:
- Pet nunca fica sem água
- Monitoramento de saúde básico
- Controle total mesmo longe de casa
- Base para outros projetos pet
Próximos passos:
- Monte o protótipo em protoboard primeiro
- Teste por 1-2 semanas para ajustes
- Implemente a versão final
- Documente personalizações específicas
- Considere evoluir para o alimentador automático
Este projeto é o primeiro passo perfeito para criar um ecossistema completo de automação para pets. Seu amigo de quatro patas vai adorar ter água fresca sempre disponível, e você ficará tranquilo sabendo que ele está sempre bem hidratado!
Por que este projeto é mais desafiador que a porta pet:
- Múltiplos sistemas: Eletrônico + hidráulico + software
- Segurança crítica: Combinação água + eletricidade
- Calibração complexa: Sensores precisam ajuste fino
- Estados de sistema: Lógica de controle mais elaborada
- Comunicação dupla: Arduino ↔ ESP8266 ↔ App
Mas não se deixe intimidar! O resultado é extremamente gratificante e seu pet terá um sistema de hidratação que rivaliza com produtos comerciais de milhares de reais.
Série Completa: Automação Inteligente para Pets
Este bebedouro faz parte de uma série completa de projetos para criar um ecossistema inteligente para seu pet. Confira os outros projetos:
🍽️ Comedouro Inteligente com IA
Sistema que reconhece cada gato e controla a alimentação individual. Ideal para múltiplos pets ou dietas especiais.
- • Reconhecimento facial por IA
- • Controle de porções personalizadas
- • Monitoramento nutricional
- • R$ 300-500 | 4-6 horas
🚪 Porta Inteligente com IA
Porta automática que reconhece especificamente seu pet, permitindo entrada e saída seguras e controladas.
- • Reconhecimento visual do pet
- • Abertura automática
- • Controle de horários
- • R$ 600-900 | 4-6 horas
💡 Dica de Implementação
Ordem recomendada: Comece com o comedouro (mais simples), depois o bebedouro (intermediário) e por último a porta (requer mais instalação). Dessa forma você desenvolve experiência gradualmente e pode integrar os sistemas no final.