Introducción

La estación meteorológica mide temperatura, humedad, velocidad y dirección del viento, presión atomsférica y precipitación. Las mediciones se reportan a este sitio cada 10 minutos.

Cada transductor está acompañado de un dispositvo Arduino que transforma los datos del sensor a un formato común a todos los sensores y los envía en forma inalámbrica a un único Arduino que recolecta todas las mediciones y para luego ser registradas en el sitio.

Transmisión de datos

La comunicación se hace a través de dispositivos nRF24L01 en breakouts de YourDuino usando las librerías RF24 y RF24Network. El termómetro/higrómetro y recolector de datos usan las versiones de alta potencia del nRF24L01. Todos los dispositivos transmiten a máxima potencia.

Todos los componentes transmiten cuando lo desean. La topología es un árbol en el que el nodo 0 (recolector) escucha los envíos de todos los componentes. Los componentes no se comunican entre sí.

Cada componente tiene asociado un ID de dispositivo y formato de paquete que es interpretado por el recolector. La estrucutra de datos en común es como sigue.

El formato básico del paquete está dado por la siguiente estructura csgba_payload_t:

struct csgba_payload_t {
    csgba_header_t payload_header;
    int values[3];
}                       

La misma define un encabezado común y la posibilidad de enviar hasta tres palabras de 16 bits (48 bits en total) de contenido. El encabezado está dado por la siguiente estructura csgba_header_t:

struct csgba_header_t {
    unsigned long uptime;
    unsigned long packets_sent;
    unsigned long packets_lost;
};                      

El mismo está pensando para enviar información sobre el estado de funcionamiento del componente.

Las librerías RF24 y RF24Network se instancian y usan de la siguiente manera:

#include <RF24Network.h>
#include <RF24.h>

#define CSGBA_CHANNEL 105
#define PACKET_TYPE 100

RF24 radio(CE_PIN, CS_PIN);
RF24Network network(radio);

const uint16_t master_node = 0;
const uint16_t this_node = 1;

/**
* Estructuras de datos csgba_header_t
* y csgba_payload_t implicitas
*/

void setup(void) {
    radio.begin();
    radio.setPALevel(RF24_PA_MAX);
    network.begin(CSGBA_CHANNEL, this_node);
}

void loop() {
    radio.powerUp();
    network.update();

    RF24NetworkHeader network_header(master_node);
    network_header.type = PACKET_TYPE;
    csgba_header.uptime = millis();
    csgba_header.packets_sent++;
    payload = {csgba_header /* csgba_header_t */, { value0, value1, value2 }}; // csgba_payload_t

    if(!network.write(network_header, &payload, sizeof(payload))) {
        csgba_header.packets_lost++;
    }

    radio.powerDown();
}
                    

En el ejemplo, value0, value1 y value2 son los valores que cada dispositivo defina transmitir. Así mismo, cada dispositivo define un tiempo entre cada iteración, en el que la radio permanece apagada.


¿Comentarios y/o sugerencias? Podés contactarte por correo electrónico, Twitter o Facebook.