O Internet das Cousas (IoT) é unha das tecnoloxías máis relevantes hoxe en día. As capacidades computacionais de circuitos integrados de tamaño reducido incrementouse nos últimos anos, mentres o Big Data se volveu, así mesmo, máis relevante.

Un dispositivo IoT pode verse como un que executa unha pequena fragmento de código que abarca a recoleción de información de un ou máis sensores e o envío desta a unha rede, para máis tarde ser procesada xunto coa información enviada dende outros dispositivos IoT. Isto da a posibilidade, por exemplo, de despregar dispositivos IoT arredor dunha cidade para medir niveis de contaminación en cada área.

Durante o Summer Course no ISCTE-IUL Instituto Universitário de Lisboa, tiven a oportunidade de introducirme no mundo de IoT: LORA WAN, computación na nube, sistemas interactivos, retos de seguridade, etc. Ao final deste curso dunha semana, fixemos varios proxectos por equivos e, no noso caso, creamos unha Proba de Concepto IoT: O Detector de Tráfico Aéreo.

A idea

Se nunca estivéchedes en Lisboa, pode que non vos dérades conta do que estou falando: a cidade está moi cercana ao aeroporto. De feito, a universidade é o mellor exemplo disto: cada hora, numerosos avións causan contaminación acústica suficiente para facerlle frear ao profesorado.

Para medir esta contaminación acústica, usamos un CHIP Arduino Nano cun sensor acústico para detectar alteracións acústicas. Este Arduino conectábase a unha The Things Network, unha rede LoRa pública, con varias gateways despregadas por Lisboa.

Flight Radar

Flight Radar

Image: Avións sobre Lisboa

Arquitectura

Plane Detector Architecture

Image: Arquitectura do proxecto Detector de Tráfico Aéreo

A idea xeral doproxecto é ter un dispositivo IoT que envíe datos a unha base de datos e ao noso teléfono:

Dispositivo IoT

TTN Gateways in Lisbon

Image: Gateways da rede The Things Network en Lisboa

Conexión

O dispositivo conéctase á rede TTN a través de LoRa. Para conectarse á rede, é necesario rexistrar o dispositivo na rede para que poidas autenticalo e permitir o envío de datos á Gateway TTN.

TTN Pannel

Image:Consola TTN

No dispositivo, usarase a APP Key para autenticar cada POST de información. Nós usamos a librería LMIC Arduino Library.

Configuración da librería para a conexión coa TTN:

#include <lmic.h>

static const u1_t PROGMEM APPEUI[8] = { /*Your hexadecimal key goes here*/ };
void os_getArtEui (u1_t* buf) {
  memcpy_P(buf, APPEUI, 8);
}

static const u1_t PROGMEM DEVEUI[8] = { /*Your hexadecimal key goes here*/ };
void os_getDevEui (u1_t* buf) {
  memcpy_P(buf, DEVEUI, 8);
}

static const u1_t PROGMEM APPKEY[16] = { /*Your hexadecimal key goes here*/ };
void os_getDevKey (u1_t* buf) {
  memcpy_P(buf, APPKEY, 16);
}

Función para o envío de información á rede LoRa:

void do_send(osjob_t* j, int counter) {
     byte payload[2];
     
  // Check if there is not a current TX/RX job running
  if (LMIC.opmode & OP_TXRXPEND) {
    Serial.println(F("OP_TXRXPEND, not sending"));
  } else {
        
      payload[0] = highByte(counter);
      payload[1] =lowByte(counter);
     
      LMIC_setTxData2(1, payload, sizeof(payload), 0);
      Serial.println(F("Packet queued"));
       
    }
}

Calibración do sensor e edge computing

Como o sensor é un módulo cun sensor acústico simple, só permite a medición análoxica. Entón, para detectar niveis de ruido, precisamos iterar durante un tempo nun analogRead e establecer un límite.

Unha vez este límite é alcanzado, pode que se detectase un avión. Entón, engadimos un ao contador de avións. Neste punto, pode que te preguntes: por que non enviamos directamente á LoRa WAN? A razón é que a rede LoRa non é confiable, e pérdense paquetes con frecuencia. Se perdemos algúns dos paquetes, non seremos capaces de establecer unha medición precisa dos avións detectados nun tempo dado. .

Entón, establecemos un tempo de, digamos, 5 minutos, e contamos tódolos avións durante este tempo. Desta forma, se un paquete chega ao middleware, sabemos que esa medición é precisa nese tempo. Se un paquete se perde, simplemente non obtemos data durante ese período de tempo.

void loop() {
  if (joined == false){
    os_runloop_once();
  }
  else{
   
    long sum = 0;
    bool plane = 0;
    
    // Main loop. Stops when detecting a plane for 10 sec
    while(!plane){
      os_runloop_once();
      for(int i=0; i<2000; i++)
      {
          sum += analogRead(pinAdc);
      }
  
      sum >>= 5;

      if (sum>threshold){
        Serial.println("Plane detected!");
        plane = 1;
        counter++;
      }
      else{
        delay(400);
      }

      t2 = millis();
      unsigned long dif_time = t2-t1;
      
      if (dif_time > sendDelay){
        
        // SEND
        do_send(&sendjob,counter);
        os_runloop_once();
        
        // Reset counter and time
        counter = 0;
        t1 = millis();
        
      }
    }
   // Plane detected, waiting... 
   delay(15000);

  }

}

Finalmente, é moi importante que, unha vez se alcanza o límite, a medición para por un tempo. Isto é debido a que mentres o avión pasa sobre o dispositivo, o límite pode sobrepasarse máis dunha vez, causando máis dunha contabilización de avións.

Node-RED e Firebase

Node-RED

Image: Diagrama Node-RED

Tal e como pode verse, Node-RED permite usar diagramas simples para engadir lóxica no middleware. Isto permítenos montar unha Proba de Concepto rápidamente correndo na nube. Básicamente, este middleware garda datos na base de datos Google Firebase, gárdaos para a súa visualización e envíaos a un webhook para as notificacións push, en cada envío de información.

Google Firebase panel

Image: Panel Google Firebase

Notificacións push a través dun Web Hook

As a last step, we also ilustrated the possible data integration with other applications. For this, we used IFTTT (If This Then That) to easily generate push notifications in a smartphone with the IFTTT Android app.

Como último paso, tamén ilustramos a posibilidade de integración de datos con outras aplicacións. Para isto, utilizamos IFTTT (If This Then That) para xerar notificacións push nun smartphone coa aplicación IFTTT para Android.

Push notification in IFTTT

Image: Notificación push en IFTTT

Obrigado!

References