Referencia de API

Esta sección proporciona la referencia completa de la API del Sistema Gateway Agrícola.

NodeIdentity API

Constructor

NodeIdentity();

Descripción: Constructor de la clase NodeIdentity.

Parámetros: Ninguno

Retorno: Instancia de NodeIdentity

getNodeID()

uint8_t getNodeID(size_t blacklist_len = 2, const uint8_t *blacklist = defaultBlacklist);

Descripción: Obtiene el identificador único del nodo.

Parámetros: - blacklist_len: Tamaño de la lista negra (default: 2) - blacklist: Array de valores prohibidos (default: [0x00, 0xFF])

Retorno: ID único entre 1-254

Ejemplo: .. code-block:: cpp

NodeIdentity identity; uint8_t nodeID = identity.getNodeID();

getDeviceMAC()

String getDeviceMAC();

Descripción: Recupera la dirección MAC del hardware.

Parámetros: Ninguno

Retorno: MAC address en formato «XX:XX:XX:XX:XX:XX»

Ejemplo: .. code-block:: cpp

String mac = identity.getDeviceMAC();

saveGetway()

void saveGetway(const uint8_t getwayAdress);

Descripción: Guarda la dirección del gateway asociado.

Parámetros: - getwayAdress: Dirección del gateway a guardar

Retorno: void

Ejemplo: .. code-block:: cpp

identity.saveGetway(0x10);

getGetway()

bool getGetway(uint8_t &stored_getway);

Descripción: Recupera la dirección del gateway guardada.

Parámetros: - stored_getway: Referencia donde se guardará la dirección

Retorno: true si existe gateway guardado, false en caso contrario

Ejemplo: .. code-block:: cpp

uint8_t gatewayAddr; if (identity.getGetway(gatewayAddr)) {

Serial.print(«Gateway: 0x»); Serial.println(gatewayAddr, HEX);

}

RadioManager API

Constructor

RadioManager(uint8_t address);

Descripción: Constructor de la clase RadioManager.

Parámetros: - address: Dirección única del nodo en la red

Retorno: Instancia de RadioManager

Ejemplo: .. code-block:: cpp

RadioManager radio(0x01);

init()

bool init();

Descripción: Inicializa el módulo de radio RFM95.

Parámetros: Ninguno

Retorno: true si la inicialización fue exitosa

Ejemplo: .. code-block:: cpp

if (!radio.init()) {

Serial.println(«Error al inicializar radio»);

}

sendMessage()

bool sendMessage(uint8_t to, uint8_t *data, uint8_t len, uint8_t flag);

Descripción: Envía mensaje a dirección específica.

Parámetros: - to: Dirección de destino - data: Puntero a datos a enviar - len: Longitud del mensaje - flag: Tipo de mensaje (protocolo)

Retorno: true si el envío fue exitoso

Ejemplo: .. code-block:: cpp

uint8_t data[] = {0x01, 0x02, 0x03}; if (radio.sendMessage(0x10, data, 3, 0x01)) {

Serial.println(«Mensaje enviado exitosamente»);

}

recvMessage()

bool recvMessage(uint8_t *buf, uint8_t *len, uint8_t *from, uint8_t *flag);

Descripción: Recibe mensaje de la red.

Parámetros: - buf: Buffer para datos recibidos - len: Puntero a longitud (entrada: máximo, salida: real) - from: Puntero a dirección del remitente - flag: Puntero a tipo de mensaje

Retorno: true si se recibió mensaje

Ejemplo: .. code-block:: cpp

uint8_t buffer[50]; uint8_t len = 50; uint8_t from, flag; if (radio.recvMessage(buffer, &len, &from, &flag)) {

Serial.print(«Mensaje de 0x»); Serial.print(from, HEX);

}

recvMessageTimeout()

bool recvMessageTimeout(uint8_t *buf, uint8_t *len, uint8_t *from, uint8_t *flag, uint16_t timeout);

Descripción: Recibe mensaje con timeout específico.

Parámetros: - buf: Buffer para datos recibidos - len: Puntero a longitud - from: Puntero a dirección del remitente - flag: Puntero a tipo de mensaje - timeout: Tiempo máximo de espera en ms

Retorno: true si se recibió mensaje dentro del timeout

Ejemplo: .. code-block:: cpp

uint8_t buffer[50]; uint8_t len = 50; uint8_t from, flag; if (radio.recvMessageTimeout(buffer, &len, &from, &flag, 5000)) {

Serial.println(«Mensaje recibido en 5 segundos»);

}

update()

void update();

Descripción: Actualiza estado interno del gestor.

Parámetros: Ninguno

Retorno: void

Ejemplo: .. code-block:: cpp

radio.update();

RtcManager API

Constructor

RtcManager(int ioPin, int sclkPin, int cePin);

Descripción: Constructor de la clase RtcManager.

Parámetros: - ioPin: Pin de datos bidireccional - sclkPin: Pin de reloj - cePin: Pin de habilitación

Retorno: Instancia de RtcManager

Ejemplo: .. code-block:: cpp

RtcManager rtc(RTC_DAT, RTC_CLK, RTC_RST);

begin()

bool begin();

Descripción: Inicializa el módulo RTC DS1302.

Parámetros: Ninguno

Retorno: true si la inicialización fue exitosa

Ejemplo: .. code-block:: cpp

if (rtc.begin()) {

Serial.println(«RTC inicializado correctamente»);

}

getDateTime()

RtcDateTime getDateTime();

Descripción: Obtiene fecha y hora actual del RTC.

Parámetros: Ninguno

Retorno: Fecha y hora actual como RtcDateTime

Ejemplo: .. code-block:: cpp

RtcDateTime now = rtc.getDateTime(); Serial.print(«Fecha: «); Serial.print(now.Year()); Serial.print(«/»); Serial.print(now.Month()); Serial.print(«/»); Serial.println(now.Day());

setDateTime()

bool setDateTime(const RtcDateTime& dateTime);

Descripción: Establece fecha y hora en el RTC.

Parámetros: - dateTime: Nueva fecha/hora a establecer

Retorno: true si se estableció correctamente

Ejemplo: .. code-block:: cpp

RtcDateTime newTime(2025, 7, 20, 14, 30, 0); if (rtc.setDateTime(newTime)) {

Serial.println(«Fecha/hora establecida correctamente»);

}

isDateTimeValid()

bool isDateTimeValid();

Descripción: Verifica si la fecha/hora del RTC es válida.

Parámetros: Ninguno

Retorno: true si la fecha/hora es válida

Ejemplo: .. code-block:: cpp

if (rtc.isDateTimeValid()) {

Serial.println(«RTC funcionando correctamente»);

}

getTimeString()

String getTimeString();

Descripción: Obtiene hora actual en formato string.

Parámetros: Ninguno

Retorno: Hora en formato «HH:MM»

Ejemplo: .. code-block:: cpp

String currentTime = rtc.getTimeString(); Serial.print(«Hora actual: «); Serial.println(currentTime);

compareCurrentTimeWith()

bool compareCurrentTimeWith(const String& targetTime);

Descripción: Compara hora actual con horario objetivo.

Parámetros: - targetTime: Horario objetivo («HH:MM»)

Retorno: true si coincide con hora actual

Ejemplo: .. code-block:: cpp

if (rtc.compareCurrentTimeWith(«12:00»)) {

Serial.println(«Es mediodía»);

}

isRunning()

bool isRunning();

Descripción: Verifica si el RTC está funcionando.

Parámetros: Ninguno

Retorno: true si el RTC está funcionando

Ejemplo: .. code-block:: cpp

if (rtc.isRunning()) {

Serial.println(«RTC funcionando correctamente»);

}

AppLogic API

Constructor

AppLogic(NodeIdentity identity, RadioManager radioMgr, RtcManager& rtcMgr);

Descripción: Constructor de la clase AppLogic.

Parámetros: - identity: Gestor de identidad del nodo - radioMgr: Gestor de comunicación LoRa - rtcMgr: Gestor de tiempo real

Retorno: Instancia de AppLogic

Ejemplo: .. code-block:: cpp

AppLogic logic(identity, radio, rtc);

begin()

void begin();

Descripción: Inicializa la lógica de aplicación.

Parámetros: Ninguno

Retorno: void

Ejemplo: .. code-block:: cpp

logic.begin();

update()

void update();

Descripción: Actualiza la lógica de aplicación.

Parámetros: Ninguno

Retorno: void

Ejemplo: .. code-block:: cpp

void loop() {

logic.update();

}

Estructuras de Datos

AtmosphericSample

struct AtmosphericSample {
    float temperature;    // Temperatura en °C
    float humidity;       // Humedad en %
    float pressure;       // Presión en hPa
    uint32_t timestamp;  // Timestamp de la muestra
};

GroundGpsPacket

struct GroundGpsPacket {
    float soilTemperature;  // Temperatura del suelo en °C
    float soilHumidity;     // Humedad del suelo en %
    float pH;               // pH del suelo
    float conductivity;     // Conductividad en μS/cm
    float latitude;         // Latitud GPS
    float longitude;        // Longitud GPS
    uint32_t timestamp;     // Timestamp de la muestra
};

MessageHeader

struct MessageHeader {
    uint8_t type;          // Tipo de mensaje
    uint8_t source;        // Dirección origen
    uint8_t destination;   // Dirección destino
    uint8_t length;        // Longitud de datos
    uint32_t timestamp;    // Timestamp
};

Constantes del Sistema

Tipos de Mensaje

#define MSG_TYPE_HELLO 0x01            // Mensaje HELLO
#define MSG_TYPE_ANNOUNCE 0x02         // Mensaje ANNOUNCE
#define MSG_TYPE_DATA_REQUEST 0x03     // Solicitud de datos
#define MSG_TYPE_DATA_RESPONSE 0x04    // Respuesta de datos
#define MSG_TYPE_CHANGE_ID 0x05        // Cambio de ID

Configuración de Red

#define MAX_NODES 250                    // Número máximo de nodos
#define NUMERO_MUESTRAS_ATMOSFERICAS 8   // Muestras atmosféricas por nodo
#define CANTIDAD_MUESTRAS_SUELO 2        // Muestras de suelo por nodo
#define RH_MESH_MAX_MESSAGE_LEN 50       // Longitud máxima de mensaje

Timeouts y Delays

#define TIMEOUTGRAL 2000                 // Timeout general (2 segundos)
#define INTERVALOANNOUNCE 5000           // Intervalo de announce (5 segundos)
#define INTERVALOATMOSPHERIC 30000       // Intervalo atmosférico (30 segundos)
#define DELAY_BETWEEN_NODES 200          // Delay entre nodos (200ms)

Pines de Hardware

#define RFM95_CS 2   // Pin Chip Select (D4 en ESP8266)
#define RFM95_INT 5  // Pin Interrupción (D1 en ESP8266)
#define RTC_CLK 18   // Pin CLK del DS1302 (D3 en ESP8266)
#define RTC_DAT 19   // Pin DAT del DS1302 (D2 en ESP8266)
#define RTC_RST 4    // Pin RST del DS1302 (D0 en ESP8266)

Ejemplos de Uso

Inicialización Completa

#include "node_identity.h"
#include "radio_manager.h"
#include "rtc_manager.h"
#include "app_logic.h"

NodeIdentity identity;
RadioManager radio(identity.getNodeID());
RtcManager rtc(RTC_DAT, RTC_CLK, RTC_RST);
AppLogic logic(identity, radio, rtc);

void setup() {
    Serial.begin(115200);

    if (!radio.init()) {
        Serial.println("Error al inicializar radio");
        return;
    }

    if (!rtc.begin()) {
        Serial.println("Error al inicializar RTC");
        return;
    }

    logic.begin();
}

void loop() {
    logic.update();
}

Comunicación Básica

// Enviar mensaje
uint8_t data[] = {0x01, 0x02, 0x03};
if (radio.sendMessage(0x10, data, 3, MSG_TYPE_DATA_REQUEST)) {
    Serial.println("Mensaje enviado exitosamente");
}

// Recibir mensaje
uint8_t buffer[50];
uint8_t len = 50;
uint8_t from, flag;
if (radio.recvMessage(buffer, &len, &from, &flag)) {
    Serial.print("Mensaje recibido de 0x");
    Serial.print(from, HEX);
    Serial.print(" con flag 0x");
    Serial.println(flag, HEX);
}

Programación Temporal

// Verificar si es hora de muestreo
if (rtc.compareCurrentTimeWith("08:00")) {
    // Solicitar datos atmosféricos
    logic.requestAtmosphericData();
}

if (rtc.compareCurrentTimeWith("12:00")) {
    // Solicitar datos de suelo
    logic.requestGroundGpsData();
}

Gestión de Datos

// Acceder a datos almacenados
for (auto& node : logic.AtmosphericSampleNodes) {
    uint8_t nodeID = node.first;
    auto& samples = node.second;

    Serial.print("Datos del nodo 0x");
    Serial.print(nodeID, HEX);
    Serial.println(":");

    for (int i = 0; i < NUMERO_MUESTRAS_ATMOSFERICAS; i++) {
        auto& sample = samples[i];
        Serial.printf("Muestra %d: Temp=%.1f°C, Hum=%.1f%%\n",
                     i, sample.temperature, sample.humidity);
    }
}

Manejo de Errores

// Verificar estado del sistema
if (!rtc.isDateTimeValid()) {
    Serial.println("RTC con problemas de integridad");
}

if (!rtc.isRunning()) {
    Serial.println("RTC detenido");
}

if (!radio.init()) {
    Serial.println("Error al inicializar radio");
}

Para más información sobre el uso específico de cada API, consulta la documentación detallada de cada clase en las secciones correspondientes.