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.
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.