UD03T03_DashboardIoT

03_Modelo

πŸ“¦ DESARROLLO DEL MODELO (IotModel.java)

πŸ“‹ PASO 1: MODELO DE DATOS

🎯 Responsabilidad Única del Modelo

  • Almacenar:
    • InformaciΓ³n fija del sensor (nombre, modelo, ubicaciΓ³n).
    • Valores actuales de temperatura, humedad y presiΓ³n.
    • Valores mΓ‘ximos permitidos para cada magnitud.
  • Mantener histΓ³ricos de valores para cada magnitud.
  • Simular nuevas lecturas del sensor:
    • Generar valores aleatorios realistas.
    • Actualizar valores actuales.
    • Guardar el histΓ³rico.
  • Proporcionar los datos necesarios para el grΓ‘fico.
  • Detectar cuΓ‘ndo un valor supera su umbral mΓ‘ximo.

🧱 ESTRUCTURA COMPLETA DE LA CLASE

1.1. Constantes del Sensor

    // =========================
    // CONSTANTES DEL SENSOR
    // =========================
    private final String nombre = "Sonda Ambiental";
    private final String modelo = "DHT-Pro + BMP";
    private final String ubicacion = "Aula 2.1 (ventana)";

PropΓ³sito:Β InformaciΓ³n descriptiva del sensor fΓ­sico simulado.

DiseΓ±o:Β VariablesΒ finalΒ porque son caracterΓ­sticas fijas del dispositivo.


1.2. Umbrales de Alerta

    // =========================
    // UMBRALES (mΓ‘ximos)
    // =========================
    private static final double TEMP_MAX = 35.0;     // Β°C
    private static final double HUM_MAX  = 80.0;     // %
    private static final double PRES_MAX = 1035.0;   // hPa

PropΓ³sito:Β Valores mΓ‘ximos permitidos. Si se superan β†’ generar alerta.

Criterios de diseΓ±o:

  • static final: Constantes compartidas por todas las instancias
  • Valores realistas basados en condiciones ambientales tΓ­picas
  • FΓ‘cilmente modificables para diferentes contextos

1.3. Estado Actual del Sensor

    // =========================
    // VALORES ACTUALES DEL SENSOR
    // =========================
    private double tempActual = 22.0;
    private double humActual  = 45.0;
    private double presActual = 1015.0;

PropΓ³sito:Β Almacenar la ΓΊltima lectura generada.

Valores iniciales:Β Condiciones ambientales normales tΓ­picas de interior:

  • 22Β°C: Temperatura confortable
  • 45%: Humedad moderada
  • 1015 hPa: PresiΓ³n atmosfΓ©rica media a nivel del mar

1.4. Control de Tiempo

Variables explicadas:

Variable Tipo PropΓ³sito
tiempoSimulacion double Tiempo transcurrido desde inicio (eje X grΓ‘fico)
ultimaMedida LocalDateTime Timestamp real de ΓΊltima lectura
formatoFecha DateTimeFormatter Formato "02/02/2026 15:30:45"

1.5. ConfiguraciΓ³n de VisualizaciΓ³n

PropΓ³sito:

Constante Valor FunciΓ³n
MAX_PUNTOS_POR_SERIE 200 Solo se almacenarΓ‘n 200 valores en cada serie
VENTANA_TIEMPO 30.0s Segundos visibles en grΓ‘fico simultΓ‘neamente (eje X)

1.6. Constructor

    /**
     * Constructor: inicializa las series con sus nombres.
     * Los nombres aparecerΓ‘n en la leyenda del grΓ‘fico.
     */

πŸ”§ MΓ‰TODOS PRINCIPALES - DIAGRAMAS DE FLUJO

2.1. MΓ©todo generarLectura()

PropΓ³sito:Β Simular una nueva lectura del sensor con variaciones realistas.

Diagrama de Flujo Detallado:

        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ generarLectura()             β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   ↓
    ╔══════════════════════════════════════════╗
    β•‘ FASE 1: VARIACIONES NORMALES             β•‘
    β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•¦β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
                   β”‚
                   ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ tempActual = limitarRango(           β”‚
        β”‚   tempActual + rnd(-0.8, 0.8),       β”‚
        β”‚   10, 40)                             β”‚
        β”‚                                       β”‚
        β”‚ ExplicaciΓ³n:                          β”‚
        β”‚ - Suma variaciΓ³n: -0.8Β°C a +0.8Β°C    β”‚
        β”‚ - Limita resultado entre 10Β°C y 40Β°C β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ humActual = limitarRango(            β”‚
        β”‚   humActual + rnd(-1.6, 1.6),        β”‚
        β”‚   20, 90)                             β”‚
        β”‚                                       β”‚
        β”‚ ExplicaciΓ³n:                          β”‚
        β”‚ - Suma variaciΓ³n: -1.6% a +1.6%      β”‚
        β”‚ - Limita resultado entre 20% y 90%   β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ presActual = limitarRango(           β”‚
        β”‚   presActual + rnd(-1.1, 1.1),       β”‚
        β”‚   980, 1040)                          β”‚
        β”‚                                       β”‚
        β”‚ ExplicaciΓ³n:                          β”‚
        β”‚ - Suma variaciΓ³n: -1.1 a +1.1 hPa    β”‚
        β”‚ - Limita entre 980 y 1040 hPa        β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   ↓
    ╔══════════════════════════════════════════╗
    β•‘ FASE 2: PICOS ALEATORIOS (eventos)      β•‘
    β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•¦β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
                   β”‚
                   ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ ΒΏRandom < 0.05? (5% probabilidad)    β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              SÍ ←──      β”‚ NO
              β”‚           ↓
              ↓     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
     β”‚ tempActual +=      β”‚       β”‚
     β”‚ rnd(4, 8)          β”‚       β”‚
     β”‚                    β”‚       β”‚
     β”‚ (Pico: +4Β°C a +8Β°C)β”‚       β”‚
     β”‚ Simula: ventana    β”‚       β”‚
     β”‚ abierta, sol       β”‚       β”‚
     β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
              β”‚                    β”‚
              └────→ β”Œ ← ← ← ← ← β†β”˜
                     β”‚
                     ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ ΒΏRandom < 0.05? (5% prob.)       β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              SÍ ←──      β”‚ NO
              β”‚           ↓
              ↓     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
     β”‚ humActual +=       β”‚       β”‚
     β”‚ rnd(8, 15)         β”‚       β”‚
     β”‚                    β”‚       β”‚
     β”‚ (Pico: +8% a +15%) β”‚       β”‚
     β”‚ Simula: lluvia,    β”‚       β”‚
     β”‚ vapor de agua      β”‚       β”‚
     β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
              β”‚                    β”‚
              └────→ β”Œ ← ← ← ← ← β†β”˜
                     β”‚
                     ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ ΒΏRandom < 0.05? (4% prob. aprox) β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              SÍ ←──      β”‚ NO
              β”‚           ↓
              ↓     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
     β”‚ presActual +=          β”‚   β”‚
     β”‚ rnd(8, 18)             β”‚   β”‚
     β”‚                        β”‚   β”‚
     β”‚ (Pico: +8 a +18 hPa)   β”‚   β”‚
     β”‚ Simula: cambio         β”‚   β”‚
     β”‚ meteorolΓ³gico          β”‚   β”‚
     β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
              β”‚                    β”‚
              └────→ β”Œ ← ← ← ← ← β†β”˜
                     β”‚
                     ↓
    ╔══════════════════════════════════════════╗
    β•‘ FASE 3: ACTUALIZAR TIMESTAMP             β•‘
    β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•¦β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
                   β”‚
                   ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ ultimaMedida = LocalDateTime.now()   β”‚
        β”‚                                       β”‚
        β”‚ Captura fecha/hora actual del sistemaβ”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   ↓
                 (FIN)

CΓ³digo Completo:

    /**
     * Genera una nueva lectura del sensor con variaciones aleatorias.
     * 
     * Algoritmo:
     * 1. Aplica pequeΓ±as variaciones a cada magnitud
     * 2. Limita los valores entre mΓ­nimos y mΓ‘ximos realistas
     * 3. Aleatoriamente genera "picos" para simular eventos
     * 4. Actualiza la marca de tiempo
     */
    public void generarLectura() {
        // FASE 1: Variaciones normales (pequeΓ±os cambios graduales)
        tempActual = limitarRango(tempActual + rnd(-0.8, 0.8), 10, 40);
        humActual  = limitarRango(humActual  + rnd(-1.6, 1.6), 20, 90);
        presActual = limitarRango(presActual + rnd(-1.1, 1.1), 980, 1040);

        // FASE 2: Picos aleatorios (simulan eventos repentinos)
        if (ThreadLocalRandom.current().nextDouble() < 0.05) {
            tempActual += rnd(4, 8);  // Pico de temperatura
        }
        if (ThreadLocalRandom.current().nextDouble() < 0.05) {
            humActual += rnd(8, 15);  // Pico de humedad
        }
        if (ThreadLocalRandom.current().nextDouble() < 0.05) {
            presActual += rnd(8, 18); // Pico de presiΓ³n
        }

        // FASE 3: Actualizar timestamp
        ultimaMedida = LocalDateTime.now();
    }

MΓ©todos Auxiliares:

    /**
     * Genera un nΓΊmero aleatorio en el rango [min, max).
     * Usa ThreadLocalRandom para mejor rendimiento en entornos concurrentes.
     * 
     * @param min Valor mΓ­nimo (inclusivo)
     * @param max Valor mΓ‘ximo (exclusivo)
     * @return NΓΊmero aleatorio en el rango
     */
    private double rnd(double min, double max) {
        return ThreadLocalRandom.current().nextDouble(min, max);
    }

    /**
     * Limita un valor entre un mΓ­nimo y un mΓ‘ximo (clamp).
     * 
     * @param v Valor a limitar
     * @param min LΓ­mite inferior
     * @param max LΓ­mite superior
     * @return Valor limitado
     */
    private double limitarRango(double v, double min, double max) {
        return Math.max(min, Math.min(max, v));
    }

ExplicaciΓ³n del algoritmo clamp:

Si v < min  β†’ retorna min
Si v > max  β†’ retorna max
Si min ≀ v ≀ max β†’ retorna v

2.2. MΓ©todo agregarPuntosASeries()

PropΓ³sito:Β AΓ±adir los valores actuales a las series del grΓ‘fico, si los checkbox de la serie estΓ‘n seleccionados.

Diagrama de Flujo:

        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ agregarPuntosASeries(              β”‚
        β”‚   tempHabilitada,                  β”‚
        β”‚   humHabilitada,                   β”‚
        β”‚   presHabilitada,                  β”‚
        β”‚   incrementoTiempo)                β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                  β”‚
                  ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ actualizamos el tiempo de la        |
        | simulaciΓ³n con el nuevo incremento  |
        | de timepo                           |
        β”‚ (Avanzar tiempo del eje X)          β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                  β”‚
                  ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ si el checkbox de la serie          |
        | correspondiente estΓ‘ marcado        β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             SÍ ─        β”‚ NO
                β”‚        |
                ↓        └───────┐
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚ AΓ±ade punto a la serie:  β”‚ β”‚
    β”‚ (tiempo, temperatura)    β”‚ β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
               β”‚                 β”‚
               ↓                 β”‚
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
    β”‚ Elimina puntos         β”‚   β”‚
    β”‚ antiguos si tamaΓ±o>200 |   β”‚ 
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
               β”‚                 β”‚
               └────→ β”Œ ← ← ← ←  β”˜
                      β”‚
                      ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ repetir para todos lo sensores  β”‚
        β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           SÍ─           β”‚ NO
             β”‚           ↓
      [Mismo proceso]  [Continuar]
             |           β”‚
             β”‚           β”‚
             └────→ β”Œ ← β†β”˜
                    β”‚
                    ↓
                  (FIN)

2.3. MΓ©todo recortarSerie()

PropΓ³sito:Β Evitar crecimiento infinito de memoria eliminando puntos antiguos.

Diagrama de Flujo:

        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ recortarSerie(serie)          β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   ↓
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ tamaΓ±o de serie > MAX_PUNTOS_POR_SERIE |
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              SÍ ←──      β”‚ NO
              β”‚           ↓
              ↓     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ (FIN)
   β”‚ Si size=250 puntos:        β”‚  β”‚
   β”‚   eliminar = 250 - 200 = 50β”‚  β”‚
   β”‚   Elimina primeros 50    β”‚  β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
            β”‚                      β”‚
            └─────→ β”Œ ← ← ← ← ← ← β”˜
                    β”‚
                    ↓
                  (FIN)

calcularLimiteInferiorX() y calcularLimiteSuperiorX()

PropΓ³sito:Β Crear efecto de "ventana deslizante" en el grΓ‘fico.

Diagrama de Flujo Combinado:

╔══════════════════════════════════════════════════════════╗
β•‘            VENTANA DESLIZANTE - LΓ“GICA                   β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

FASE INICIAL (t ≀ 30s):
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ GrΓ‘fico muestra: [0s ──────── 30s]     β”‚
β”‚ Ventana FIJA al principio              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

TRANSICIΓ“N (t = 35s):
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ calcularLimiteInferiorX()              β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ ΒΏtiempoSimulacion > VENTANA_TIEMPO?β”‚ β”‚
β”‚ β”‚ ΒΏ35 > 30?                          β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚          β”‚ SÍ                          β”‚
β”‚          ↓                             β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ return tiempoSimulacion -          β”‚ β”‚
β”‚ β”‚        VENTANA_TIEMPO              β”‚ β”‚
β”‚ β”‚ return 35 - 30 = 5s                β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

RESULTADO:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ GrΓ‘fico muestra: [5s ──────── 35s]     β”‚
β”‚ Ventana DESLIZANTE (se mueve)          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

FASE AVANZADA (t = 60s):
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ LimiteInferior: 60 - 30 = 30s          β”‚
β”‚ LimiteSuperior: 60s                    β”‚
β”‚ GrΓ‘fico muestra: [30s ─────── 60s]     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2.4. ValidaciΓ³n de Umbrales

MΓ©todos hayAlertaXXX()

PropΓ³sito:Β Detectar si alguna magnitud supera su umbral mΓ‘ximo.

MΓ©todos getMensajeAlertaXXX()

PropΓ³sito:Β Generar mensajes descriptivos para mostrar en la UI con los sigueitne formatos:

  • "Temp = XX.X Β°C (mΓ‘x YY.Y)".
  • "Hum = XX.X % (mΓ‘x YY.Y)"
  • "Pres = XXXX.X hPa (mΓ‘x YYYY.Y)"

Ejemplos de salida:

"Temp = 36.2 Β°C (mΓ‘x 35.0)"
"Hum = 85.7 % (mΓ‘x 80.0)"
"Pres = 1038.4 hPa (mΓ‘x 1035.0)"

2.5. Formateo de Valores

MΓ©todos getXXXFormateada()

PropΓ³sito:Β Convertir valores numΓ©ricos a String con formato especΓ­fico para UI.

  • NΓΊmeros con 1 decimal
  • Fecha "dd/MM/yyyy HH:mm:ss"

2.6. MΓ©todo resetearDatos()

PropΓ³sito:Β Reiniciar toda la simulaciΓ³n a su estado inicial.

Diagrama de Flujo:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ resetearDatos()        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ (Eliminar TODOS los puntos   β”‚
β”‚  de la serie temperatura)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ (Eliminar TODOS los puntos   β”‚
β”‚  de la serie humedad)        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ (Eliminar TODOS los puntos   β”‚
β”‚  de la serie presiΓ³n)        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ (Resetear contador tiempo)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ (Borrar timestamp)           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           ↓
         (FIN)

2.7. Getters BΓ‘sicos

PropΓ³sito: Proporcionar acceso de solo lectura a los atributos privados.