📊 Diagramas de Arquitectura - Sistema Gateway Agrícola

🏗️ Arquitectura General del Sistema

graph TB
    subgraph "Hardware Layer"
        ESP8266[ESP8266 Microcontroller]
        SX1278[SX1278 LoRa Module]
        DS1302[DS1302 RTC Module]
        ANT[Antena LoRa]
    end

    subgraph "Software Layer"
        subgraph "Core Modules"
            NI[NodeIdentity]
            RM[RadioManager]
            RTCM[RtcManager]
            AL[AppLogic]
        end

        subgraph "Protocol Layer"
            PROTO[Protocol]
            MSG[Message Types]
        end

        subgraph "Data Management"
            ATMOS[Atmospheric Data]
            GROUND[Ground/GPS Data]
            LOGS[System Logs]
        end
    end

    subgraph "Network Layer"
        MESH[LoRa Mesh Network]
        NODES[Sensor Nodes]
    end

    ESP8266 --> NI
    ESP8266 --> RM
    ESP8266 --> RTCM
    ESP8266 --> AL

    SX1278 --> RM
    DS1302 --> RTCM
    ANT --> SX1278

    NI --> PROTO
    RM --> PROTO
    AL --> PROTO
    PROTO --> MSG

    AL --> ATMOS
    AL --> GROUND
    AL --> LOGS

    RM --> MESH
    MESH --> NODES

🔄 Flujo de Datos del Gateway

sequenceDiagram
    participant Gateway as Gateway
    participant Node1 as Sensor Node 1
    participant Node2 as Sensor Node 2
    participant RTC as RTC Module
    participant Log as System Log

    Note over Gateway: Inicialización del Sistema
    Gateway->>RTC: Inicializar RTC
    Gateway->>Log: Log: Sistema iniciado
    Gateway->>Gateway: Enviar ANNOUNCE

    loop Cada 30 segundos
        Gateway->>Gateway: Enviar ANNOUNCE
        Gateway->>Log: Log: ANNOUNCE enviado
    end

    Node1->>Gateway: HELLO
    Gateway->>Log: Log: Nodo 1 registrado
    Node2->>Gateway: HELLO
    Gateway->>Log: Log: Nodo 2 registrado

    loop Cada 5 minutos
        Gateway->>Node1: REQUEST_DATA_ATMOSPHERIC
        Node1->>Gateway: DATA_ATMOSPHERIC
        Gateway->>Log: Log: Datos atmosféricos recibidos
        Gateway->>Gateway: Almacenar datos

        Gateway->>Node2: REQUEST_DATA_ATMOSPHERIC
        Node2->>Gateway: DATA_ATMOSPHERIC
        Gateway->>Log: Log: Datos atmosféricos recibidos
        Gateway->>Gateway: Almacenar datos
    end

    loop Cada 12/24 horas
        Gateway->>Node1: REQUEST_DATA_GPS_GROUND
        Node1->>Gateway: DATA_GPS_GROUND
        Gateway->>Log: Log: Datos suelo/GPS recibidos
        Gateway->>Gateway: Almacenar datos
    end

🧩 Estructura Modular del Código

graph LR
    subgraph "Main Gateway"
        MAIN[main_gateway.ino]
    end

    subgraph "Core Classes"
        NI[NodeIdentity]
        RM[RadioManager]
        RTCM[RtcManager]
        AL[AppLogic]
    end

    subgraph "Support"
        CONFIG[config.h]
        PROTO[protocol.h]
    end

    MAIN --> NI
    MAIN --> RM
    MAIN --> RTCM
    MAIN --> AL

    NI --> CONFIG
    RM --> CONFIG
    RTCM --> CONFIG
    AL --> CONFIG

    AL --> PROTO
    RM --> PROTO

📡 Protocolo de Comunicación

stateDiagram-v2
    [*] --> Inicialización
    Inicialización --> EnviandoANNOUNCE
    EnviandoANNOUNCE --> EsperandoHELLO
    EsperandoHELLO --> RegistrandoNodos
    RegistrandoNodos --> SolicitandoDatosAtmosféricos
    SolicitandoDatosAtmosféricos --> RecibiendoDatosAtmosféricos
    RecibiendoDatosAtmosféricos --> SolicitandoDatosSuelo
    SolicitandoDatosSuelo --> RecibiendoDatosSuelo
    RecibiendoDatosSuelo --> EsperandoHELLO

    EsperandoHELLO --> ErrorComunicación
    ErrorComunicación --> EsperandoHELLO

    RecibiendoDatosAtmosféricos --> ErrorDatos
    ErrorDatos --> SolicitandoDatosAtmosféricos

    RecibiendoDatosSuelo --> ErrorDatos
    ErrorDatos --> SolicitandoDatosSuelo

🗂️ Estructura de Datos

classDiagram
    class AtmosphericSample {
        +float temperature
        +float humidity
        +uint32_t timestamp
    }

    class GroundGpsPacket {
        +float soilMoisture
        +float soilTemperature
        +float pH
        +float conductivity
        +float latitude
        +float longitude
        +uint32_t timestamp
    }

    class AppLogic {
        -map~uint8_t, array~ atmosphericSamples
        -map~uint8_t, array~ groundGpsSamples
        -map~uint8_t, string~ nodeMacs
        +begin()
        +update()
        -requestAtmosphericData()
        -requestGroundGpsData()
    }

    class NodeIdentity {
        -uint8_t nodeId
        -string macAddress
        +getNodeID()
        +validateKey()
    }

    class RadioManager {
        -RH_RF95 radio
        -RHMesh manager
        +init()
        +sendMessage()
        +recvMessage()
    }

    class RtcManager {
        -RtcDS1302 rtc
        +begin()
        +getDateTime()
        +setDateTime()
    }

    AppLogic --> AtmosphericSample
    AppLogic --> GroundGpsPacket
    AppLogic --> NodeIdentity
    AppLogic --> RadioManager
    AppLogic --> RtcManager

📊 Logs del Sistema

Ejemplo de Log de Inicialización

[2025-01-15 08:30:15] INFO: Sistema Gateway Agrícola iniciado
[2025-01-15 08:30:15] INFO: NodeIdentity inicializado - MAC: AA:BB:CC:DD:EE:FF
[2025-01-15 08:30:16] INFO: RadioManager inicializado - Frecuencia: 915MHz
[2025-01-15 08:30:16] INFO: RTC inicializado - Fecha: 2025-01-15 08:30:16
[2025-01-15 08:30:17] INFO: AppLogic inicializado - Modo Gateway
[2025-01-15 08:30:17] INFO: ANNOUNCE enviado - Broadcast a la red

Ejemplo de Log de Comunicación

[2025-01-15 08:30:45] INFO: HELLO recibido de nodo 0x42 - MAC: 11:22:33:44:55:66
[2025-01-15 08:30:45] INFO: Nodo registrado - ID: 0x42, MAC: 11:22:33:44:55:66
[2025-01-15 08:30:50] INFO: HELLO recibido de nodo 0x7A - MAC: AA:BB:CC:DD:EE:FF
[2025-01-15 08:30:50] INFO: Nodo registrado - ID: 0x7A, MAC: AA:BB:CC:DD:EE:FF
[2025-01-15 08:35:00] INFO: Solicitando datos atmosféricos a nodo 0x42
[2025-01-15 08:35:02] INFO: Datos atmosféricos recibidos de nodo 0x42
[2025-01-15 08:35:02] INFO: Temperatura: 25.3°C, Humedad: 65.2%
[2025-01-15 08:35:05] INFO: Solicitando datos atmosféricos a nodo 0x7A
[2025-01-15 08:35:07] INFO: Datos atmosféricos recibidos de nodo 0x7A
[2025-01-15 08:35:07] INFO: Temperatura: 24.8°C, Humedad: 68.1%

Ejemplo de Log de Errores

[2025-01-15 08:40:00] WARN: Timeout en solicitud a nodo 0x42
[2025-01-15 08:40:00] WARN: Reintentando solicitud a nodo 0x42
[2025-01-15 08:40:03] ERROR: Nodo 0x42 no responde - Agregado a nodesDown
[2025-01-15 08:40:05] INFO: Datos atmosféricos recibidos de nodo 0x7A
[2025-01-15 08:40:05] INFO: Temperatura: 25.1°C, Humedad: 66.3%

Ejemplo de Log de Datos de Suelo/GPS

[2025-01-15 12:00:00] INFO: Solicitando datos suelo/GPS a nodo 0x42
[2025-01-15 12:00:03] INFO: Datos suelo/GPS recibidos de nodo 0x42
[2025-01-15 12:00:03] INFO: Humedad suelo: 45.2%, Temp suelo: 18.5°C
[2025-01-15 12:00:03] INFO: pH: 6.8, Conductividad: 1250 µS/cm
[2025-01-15 12:00:03] INFO: GPS: Lat: -34.6037, Lon: -58.3816
[2025-01-15 12:00:05] INFO: Solicitando datos suelo/GPS a nodo 0x7A
[2025-01-15 12:00:08] INFO: Datos suelo/GPS recibidos de nodo 0x7A
[2025-01-15 12:00:08] INFO: Humedad suelo: 52.1%, Temp suelo: 19.2°C
[2025-01-15 12:00:08] INFO: pH: 7.1, Conductividad: 1380 µS/cm
[2025-01-15 12:00:08] INFO: GPS: Lat: -34.6042, Lon: -58.3821

🔧 Configuración de Hardware

graph TB
    subgraph "ESP8266 Pins"
        D1[D1 - GPIO5 - RTC_CLK]
        D2[D2 - GPIO4 - RTC_DAT]
        D3[D3 - GPIO0 - RTC_RST]
        D4[D4 - GPIO2 - RFM95_CS]
        D5[D5 - GPIO14 - RFM95_INT]
        D6[D6 - GPIO12 - RFM95_RST]
    end

    subgraph "Connections"
        ESP8266[ESP8266 NodeMCU]
        RFM95[RFM95 LoRa Module]
        RTC[DS1302 RTC Module]
        ANT[Antena LoRa]
    end

    ESP8266 -->|SPI| RFM95
    RFM95 --> ANT

    ESP8266 -->|3-Wire| RTC

📈 Métricas del Sistema

Capacidades del Gateway

  • Nodos máximos: 250 nodos

  • Muestras atmosféricas por nodo: 8 muestras

  • Muestras suelo/GPS por nodo: 2 muestras

  • Intervalo ANNOUNCE: 5 segundos (debug) / 2 minutos (producción)

  • Intervalo datos atmosféricos: 30 segundos (debug) / 8 minutos (producción)

  • Intervalo datos suelo/GPS: 12 y 24 horas

Consumo de Memoria

  • AtmosphericSample: 6 bytes por muestra

  • GroundGpsPacket: 24 bytes por muestra

  • Total por nodo: 8 × 6 + 2 × 24 = 96 bytes

  • Total 250 nodos: 24 KB de datos


Diagramas generados con Mermaid para la documentación del Sistema Gateway Agrícola

Diagrama de Conexiones de la Placa

A continuación se muestra un diagrama en bloques que representa las conexiones físicas entre la placa principal (ESP8266/ESP32) y los módulos periféricos utilizados en el sistema:

%% Incluido desde docs/diagramas_arquitectura/conexiones_placa.mmd

graph TD
    ESP[ESP8266 / ESP32]
    LORA[LoRa SX1278]
    RTC[RTC DS1302]
    DHT[DHT22 Sensor]
    GPS[GPS Neo-6M]
    POWER[Fuente de Alimentación]

    POWER --> ESP
    ESP -- SPI (MOSI/MISO/SCK/CS) --> LORA
    ESP -- 3-wire (IO/SCLK/CE) --> RTC
    ESP -- GPIO (D2) --> DHT
    ESP -- UART (RX/TX) --> GPS
    LORA -- Antena --> ANT[Antena 433MHz]

El archivo fuente editable de este diagrama se encuentra en: docs/diagramas_arquitectura/conexiones_placa.mmd.

Descripción:

  • La placa ESP8266/ESP32 se conecta a los módulos LoRa, RTC, DHT22 y GPS mediante diferentes interfaces (SPI, 3-wire, GPIO, UART).

  • La fuente de alimentación provee energía a la placa principal.

  • El módulo LoRa se conecta a una antena externa para la comunicación inalámbrica de largo alcance.