Conectando...
Peso en plato
g
HX711 Live
Última ración
g
Raciones hoy
0
de 0 programadas
Total hoy
0g
Objetivo: g/día
🎮
Control de Dispensado
Manual
50g
El servo se detiene cuando el sensor llegue a esta cantidad
0
gramos
Peso actual
Servo
⏹ Cerrado
ESP32
❓ —
Depósito
— %
Próximas raciones hoy
📅
Cargando horarios...
🐾
Mascotas registradas
🐕
Sin mascotas aún
Registrar Mascota
Al guardar, la dieta y los horarios se aplican automáticamente al sistema.
🐾
Mascotas guardadas
0
🐕

Sin mascotas registradas

Nuevo Horario
El servo abre hasta alcanzar esta cantidad
📅
Horarios programados
0

Sin horarios

📋
Historial de alimentación
FechaHoraMascotaCantidadTipoResultado
Sin registros
📋
Estructura JSON en Firebase Realtime Database

Esta es la estructura exacta que usa la página. El ESP32 debe leer /control para actuar, y escribe en /sensor y /dispositivo.

📁 /mascotas/{id}

"mascotas": { "-NxABC123": { "nombre": "Firulais", "especie": "perro", "raza": "Labrador", "edad": 3, "peso_kg": 12.5, "condicion": "normal", "alimento": "royal_canin", "dieta": { "gramos_dia": 240, "gramos_racion": 80, "raciones_dia": 3, "kcal_dia": 888 }, "timestamp": 1717200000000 } }

📁 /horarios/{id}

"horarios": { "-NxHOR001": { "mascota_id": "-NxABC123", // ID de la mascota "mascota_nombre": "Firulais", "hora": "08:00", "gramos": 80, // hasta cuántos gramos dispensar "nombre": "Desayuno", "dias": "L,M,X,J,V,S,D", "activo": true, "timestamp": 1717200000000 } }

📁 /control ← La web ESCRIBE aquí · el ESP32 LO LEE

"control": { "modo": "manual", // "manual" | "automatico" "dispensar": { "activo": true, // true = abrir servo "gramos_objetivo": 80, // detenerse al llegar aquí "mascota_id": "-NxABC123", // qué mascota se está alimentando "mascota_nombre": "Firulais", "tipo": "manual", // "manual" | "automatico" "timestamp": 1717200000000 } }

📁 /sensor ← El ESP32 ESCRIBE aquí · la web LO LEE

"sensor": { "peso": 47.3, // gramos actuales en el plato (HX711) "deposito": 75 // % de comida restante en el depósito }

📁 /dispositivo ← El ESP32 ESCRIBE aquí

"dispositivo": { "online": true, "servo": "abierto", // "abierto" | "cerrado" "ultima_act": 1717200000000 }

📁 /historial/{id} ← Ambos escriben aquí

"historial": { "-NxHIST01": { "mascota_id": "-NxABC123", "mascota_nombre": "Firulais", "gramos": 78.5, // lo que realmente cayó (del sensor) "gramos_objetivo": 80, // lo que se había pedido "tipo": "automatico", // "manual" | "automatico" "fecha": "12/06/2025", "hora": "08:03", "timestamp": 1717200000000 } }
🔄
Flujo de comunicación Web ↔ Firebase ↔ ESP32
🌐 Página Web
Escribe en /control/dispensar
Escribe en /control/modo
Escribe en /mascotas
Escribe en /horarios
Lee de /sensor, /dispositivo, /historial
🤖 ESP32
Lee de /control/dispensar
Lee de /control/modo
Lee de /horarios
Escribe en /sensor/peso
Escribe en /dispositivo/servo
Escribe en /historial
🔄 Flujo dispensado
1. Web escribe activo:true + gramos
2. ESP32 detecta el cambio
3. ESP32 abre el servo
4. Peso sube en /sensor/peso
5. Al llegar al objetivo → cierra servo
6. ESP32 escribe en /historial
7. Web escribe activo:false
HTMLEOF