# bryanramosing-ux/proyecto-dispensador-iot architecture

> Architecture diagram of the GitHub repository bryanramosing-ux/proyecto-dispensador-iot, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/bryanramosing-ux/proyecto-dispensador-iot
- Repository: https://github.com/bryanramosing-ux/proyecto-dispensador-iot

## Overview

Este es un dispensador IoT local: el ESP32 detecta presencia, solicita una clasificación al PC y decide si dosifica; el PC obtiene fotos de la ESP32-CAM, las analiza y ofrece un panel de estado. El firmware también supervisa el nivel de la tolva y reporta alertas. El repositorio incluye además los diseños mecánicos y documentación para construir y calibrar el sistema. Las relaciones entre dispositivos se apoyan en el README; las conexiones internas no muestreadas se omiten cuando no hay evidencia directa.

Main entry points: [`ESP32/Dispensador_ESP32/Controlador.cpp`](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Controlador.cpp) (Máquina de estados), [`OpenCV/servidor_vision.py`](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/OpenCV/servidor_vision.py) (Servidor de visión), [`ESP32/Dispensador_ESP32/Red.cpp`](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Red.cpp) (Red ESP32), [`ESP32/Dispensador_ESP32/Ultrasonico.cpp`](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Ultrasonico.cpp) (Sensores ultrasónicos)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_control["Control embebido"]
  node_esp32["Controlador ESP32"]
  node_logic["Máquina de estados<br/>[Controlador.cpp]"]
  node_network["Red ESP32<br/>[Red.cpp]"]
  node_sensor["Sensores ultrasónicos<br/>[Ultrasonico.cpp]"]
  node_level["Nivel de tolva<br/>[NivelTolva.cpp]"]
  node_energy["Monitor de energía<br/>[Energia.cpp]"]
  node_doser["Dosificador MG995<br/>[Dosificador.cpp]"]
  node_cam["ESP32-CAM"]
end

subgraph group_vision["Visión y alertas"]
  node_server["Servidor de visión<br/>[servidor_vision.py]"]
  node_classifier["Clasificador mascota<br/>[clasificador.py]"]
  node_alerts["Gestor de alertas<br/>[alertas.py]"]
  node_model["MobileNetV2 ONNX"]
end

subgraph group_build["Diseño físico"]
  node_tower["Piezas de torre<br/>[generar_stl.py]"]
end

subgraph group_guides["Construcción y calibración"]
  node_assembly["Manual de armado"]
  node_wiring["Conexiones eléctricas"]
  node_calibration["Calibración de dosis"]
  node_powercalc["Cálculo energético<br/>[calculo_energia.py]"]
end

node_user(("Mascota / operador"))
node_ntfy["Servicio ntfy"]

node_user -->|"se acerca"| node_sensor
node_sensor -->|"detecta presencia"| node_logic
node_logic -->|"solicita clasificación"| node_network
node_network -->|"consulta local"| node_server
node_server -->|"solicita foto"| node_cam
node_server -->|"analiza fotos"| node_classifier
node_classifier -->|"infiere con"| node_model
node_server -->|"devuelve clase"| node_network
node_logic -->|"autoriza ración"| node_doser
node_logic -->|"verifica batería"| node_energy
node_logic -->|"consulta nivel"| node_level
node_level -->|"mide tolva"| node_sensor
node_logic -->|"envía alertas"| node_network
node_server -->|"registra alertas"| node_alerts
node_alerts -.->|"notifica celular"| node_ntfy
node_assembly -->|"guía montaje"| node_tower
node_wiring -->|"documenta conexiones"| node_esp32
node_calibration -.->|"ajusta dosis"| node_doser
node_powercalc -.->|"dimensiona energía"| node_energy

click node_esp32 "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Dispensador_ESP32.ino"
click node_logic "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Controlador.cpp"
click node_network "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Red.cpp"
click node_sensor "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Ultrasonico.cpp"
click node_level "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/NivelTolva.cpp"
click node_energy "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Energia.cpp"
click node_doser "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Dosificador.cpp"
click node_cam "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32_CAM/Camara_ESP32CAM/Camara_ESP32CAM.ino"
click node_server "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/OpenCV/servidor_vision.py"
click node_classifier "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/OpenCV/clasificador.py"
click node_alerts "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/OpenCV/alertas.py"
click node_model "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/tree/claude/quirky-gates-y17370/OpenCV/model"
click node_tower "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/Mechanical/generar_stl.py"
click node_assembly "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/Documentation/manual_armado/Manual_de_Armado.md"
click node_wiring "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/Documentation/wiring/tabla_conexiones.md"
click node_calibration "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/Documentation/calibration/analizar_dosificacion.py"
click node_powercalc "https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/Documentation/power/calculo_energia.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_esp32,node_logic,node_network,node_sensor,node_level,node_energy,node_doser,node_cam toneBlue
class node_server,node_classifier,node_alerts,node_model toneAmber
class node_tower toneMint
class node_assembly,node_wiring,node_calibration,node_powercalc toneRose
class node_user,node_ntfy toneIndigo
```

## Components

### Control embebido

- [Controlador ESP32](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Dispensador_ESP32.ino): `ESP32/Dispensador_ESP32/Dispensador_ESP32.ino`
- [Máquina de estados](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Controlador.cpp): `ESP32/Dispensador_ESP32/Controlador.cpp`
- [Red ESP32](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Red.cpp): `ESP32/Dispensador_ESP32/Red.cpp`
- [Sensores ultrasónicos](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Ultrasonico.cpp): `ESP32/Dispensador_ESP32/Ultrasonico.cpp`
- [Nivel de tolva](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/NivelTolva.cpp): `ESP32/Dispensador_ESP32/NivelTolva.cpp`
- [Monitor de energía](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Energia.cpp): `ESP32/Dispensador_ESP32/Energia.cpp`
- [Dosificador MG995](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32/Dispensador_ESP32/Dosificador.cpp): `ESP32/Dispensador_ESP32/Dosificador.cpp`
- [ESP32-CAM](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/ESP32_CAM/Camara_ESP32CAM/Camara_ESP32CAM.ino): `ESP32_CAM/Camara_ESP32CAM/Camara_ESP32CAM.ino`

### Visión y alertas

- [Servidor de visión](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/OpenCV/servidor_vision.py): `OpenCV/servidor_vision.py`
- [Clasificador mascota](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/OpenCV/clasificador.py): `OpenCV/clasificador.py`
- [Gestor de alertas](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/OpenCV/alertas.py): `OpenCV/alertas.py`
- [MobileNetV2 ONNX](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/tree/claude/quirky-gates-y17370/OpenCV/model): `OpenCV/model`

### Diseño físico

- [Piezas de torre](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/Mechanical/generar_stl.py): `Mechanical/generar_stl.py`

### Construcción y calibración

- [Manual de armado](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/Documentation/manual_armado/Manual_de_Armado.md): `Documentation/manual_armado/Manual_de_Armado.md`
- [Conexiones eléctricas](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/Documentation/wiring/tabla_conexiones.md): `Documentation/wiring/tabla_conexiones.md`
- [Calibración de dosis](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/Documentation/calibration/analizar_dosificacion.py): `Documentation/calibration/analizar_dosificacion.py`
- [Cálculo energético](https://github.com/bryanramosing-ux/proyecto-dispensador-iot/blob/claude/quirky-gates-y17370/Documentation/power/calculo_energia.py): `Documentation/power/calculo_energia.py`

### Other components

- **Mascota / operador**
- **Servicio ntfy**

## Connections

- Mascota / operador → Sensores ultrasónicos: se acerca (evidence: `README.md`)
- Sensores ultrasónicos → Máquina de estados: detecta presencia (evidence: `README.md`)
- Máquina de estados → Red ESP32: solicita clasificación (evidence: `README.md`)
- Red ESP32 → Servidor de visión: consulta local (evidence: `README.md`)
- Servidor de visión → ESP32-CAM: solicita foto (evidence: `OpenCV/servidor_vision.py`)
- Servidor de visión → Clasificador mascota: analiza fotos (evidence: `OpenCV/servidor_vision.py`)
- Clasificador mascota → MobileNetV2 ONNX: infiere con (evidence: `OpenCV/clasificador.py`)
- Servidor de visión → Red ESP32: devuelve clase (evidence: `README.md`)
- Máquina de estados → Dosificador MG995: autoriza ración (evidence: `README.md`)
- Máquina de estados → Monitor de energía: verifica batería (evidence: `README.md`)
- Máquina de estados → Nivel de tolva: consulta nivel (evidence: `README.md`)
- Nivel de tolva → Sensores ultrasónicos: mide tolva
- Máquina de estados → Red ESP32: envía alertas
- Servidor de visión → Gestor de alertas: registra alertas (evidence: `OpenCV/servidor_vision.py`)
- Gestor de alertas → Servicio ntfy: notifica celular (evidence: `README.md`)
- Manual de armado → Piezas de torre: guía montaje (evidence: `README.md`)
- Conexiones eléctricas → Controlador ESP32: documenta conexiones (evidence: `README.md`)
- Calibración de dosis → Dosificador MG995: ajusta dosis (evidence: `README.md`)
- Cálculo energético → Monitor de energía: dimensiona energía (evidence: `README.md`)
