Este dispositivo se ha diseñado para monitorizar el ruido ambiental de forma indefinida utilizando energía solar.
Por otra parte se van a utilizar comunicaciones de largo alcance tipo LPWAN (Low Power Wide Area Networks). En este caso será una modulación LoRa (Long Range) que además es muy eficientes en el consumo de energía. La tecnología LoRa y la capa de red abierta LoRaWAN son los protagonistas del despliegue del IoT.
- Hemos utilizado la placa Heltec HTCC-AB01 para la banda ISM europea de 868MHz que tiene las siguientes características:
- Compatible con Arduino, por tanto compatible en Windows, Mac OS y Linux
- Configurable a través de comandos AT
- Chip CP2102 de puerto serie a USB integrado
- Basada en ASR605x (ASR6501, ASR6502) , esos chips ya están integrados el PSoC ® 4000 serie MCU (ARM® cortex® M0 + Core) y SX1262;
- Soporte de la especificación LoRaWAN 1.0.2
- Diseño de energía ultra bajo, solo 3.5uA en Deep Sleep. Para este tipo de proyecto, el consumo son muy importantes y aquí tenemos es tabla que ayudará a dimensionar la batería y el panel solar:
- Sistema de gestión de energía solar incluido, se puede conectar directamente con un panel solar de 5-7 V
- Conector SH1.25-2 para baterías incluido, sistema de administración de batería integrado (administración de carga y descarga, protección de sobrecarga, detección de energía de la batería, conmutación automática de energía de batería / USB)
- Interfaz micro USB con protección ESD (Electrostatic Discharge), protección contra cortocircuitos, blindaje RF y otras medidas de protección
- Buena correspondencia de impedancia y larga distancia de comunicación
- Certificación CE y FCC
Podremos encontrar toda la documentación de esta placa en: Documentos y ficheros, FAQs
Por otra parte también se necesitarán otros componentes no electrónicos como cables, mini-protoboard... lo que conforma este kit:
Del microcontrolador CubeCell solo vamos a utilizar el pin 2 que corresponde al único conversor analógico/digital de la placa. Internamente es el mismo que utiliza para ver el estado de carga de la batería. Por lo que perderemos esta función.
Otro detalle a tener en cuenta respecto a la alimentación del sensor de sonido, es que aunque sería recomendable utilizar una tensión de 5V que suministraría la placa por el pin VIN. Este solo tiene tensión cuando se alimenta por USB. Por lo que tendremos que utilizar el pin VDD que suministra 3.3 en la configuración de batería y son suficientes para que el sensor funciones correctamente.
Las pruebas realizadas con la v0 revelaron falta de sensibilidad. El sensor permite esta ajuste por hardware soldando una resistencia en este punto:
Los valores posibles están en esta tabla:
Y finalmente en nuestro caso elegimos la de 1M para obtener una ganancia de 60 dB:
Debido a que el sensor estará fuera de la caja estanca. Aunque protegido por material plástico. Requiere de una protección especial a fin de retardar todo lo posible la oxidación de sus componentes. Hay muchas soluciones, pero hemos elegido la más artesanal usando resina colofonia disuelta al 40% en alcohol isopropílico. La solución se puede aplicar con pincel y el tiempo de secado es de unas 24 horas.
Lo para poder programar adecuadamente el dispositivo tendremos que configurar el entorno de programación de Arduino con las configuraciones de hardware y librerías de esta placa.
- Añadir la URL https://github.com/HelTecAutomation/CubeCell-Arduino/releases/download/V1.5.0/package_CubeCell_index.json a Preferences->Settings->Additional boards:
- Añadir la librería de CayenneLPP. Importante: versión 1.1.0:
- Si aparece un aviso de instalar otras librerias con dependencias. Seleccionar opción de instalar todas:
- Seleccionar la tarjeta CubeCell HTCC-AB01 y configurar todos sus parámetros así:
Con el cable conectado seleccionamos el puerto USB que nuestro ordenador haya asignado. Una vez compilado y cargado en el dispositivo. Abrimos el monitor serie para comprobar que log de actividad del programa es correcto.
Vamos a utilizar los servicios de The Things Network que es un servicio en la nube al que están conectados los gateway libres de la las Comunidades TTN. La ruta de la información es la siguiente:
- El sensor (nodo) transmite por radio con modulación LoRa el trama de datos que recibe el gateway
- Este gateway está conectado a internet para retransmitir la trama, hora como paquete de datos.
- Los servidores de TTN decodifican el mensaje y ofrecen diferentes integraciones y endpoints para que nuestras aplicaciones utilicen la información leída por los sensores.
Hay muchas variantes para implementar este enrutamiento. Para este se ha elegido estas configuraciones:
- Dispositivo es del tipo ABP (Activation-by-personalisation) lo que significa que se identificará en la red con un DevAddr y una Session key preconfigurada. Para ello tenemos que completar el registro de una aplicación y un dispositivo.
- Publicación del paquete de-codificado en una cola MQTT a la que nuestra aplicación está subscrita.
Estos son los pasos a seguir empezando por acceder a la aplicación back-end de TTN en esta URL: https://console.cloud.thethings.network/ en la que seleccionaremos nuestra región y luego nos loguearemos con nuestro usuario registrado.
En TTN los dispositivos (devices) iguales, se agrupan en una aplicación desde la cual serán registrados. por lo tanto, primero hay que añadir una aplicación:
En el formulario de alta de aplicación rellenaremos estos campos:
- Para el Application ID, elige un identificador único, en minúsculas, puedes usar caracteres alfanuméricos peor no guiones ´-´ consecutivos.
- Para Description, elige la descripción que prefieras.
- No hace falta poner nada en Application EUI
- Presiona Create application para finalizar
Aparecerá ahora la página con la nueva aplicación añadida donde encontrarás un botón de + Add end device necesario para crear los dispositivos asociados.
En TTN un dispositivo (devide) representa la configuración de lo que también llama nodo (node) que a fin de cuentas es nuestro sensor.
Al acceder al formulario de registro nos quedamos en la pestaña de From The LoRaWAN Device Repository ya que estamos usando un microcontrolador conocido.
Ahora tenemos que seleccionar el tipo, modelo y marca de nuestro sensor tal y como aparece en la captura inferior.
El la casilla inferior vemos que pide una clave de JoinEUI que normalmente nos la daría el fabricante. Pero en nuestro caso utilizaremos una sencilla aplicación web para generarla: https://descartes.co.uk/CreateEUIKey.html
Lo siguiente será generar las DevEUI y AppKey pulsando los correspondientes iconos de la derecha para que se genere automáticamente. Finalmente queda rellenar el Device ID que será el nombre único de este nodo.
Finalmente pulsaremos Register en device para que, seguidamente aparezca la pantalla con la configuración de nuestro nuevo nodo.Aquí podremos ver los datos de configuración y parámetros que necesitamos por ser un dispositivo de tipo ABP. Y que tendremos que pasar al fichero de configuración settings.h que se cargará en el sketch del IDE de Arduino.
Para poder copiar las keys en el formato "array" que se requiere en el fichero de configuración: "settings.h" Nota: hay que pulsar el icono <> de "toggle array formating" para tener el formato adecuado para este fichero.
// LoRaWAN Configuration
/* OTAA para*/
static uint8_t devEui[] = { };
static uint8_t appEui[] = { };
static uint8_t appKey[] = { };
uint16_t userChannelsMask[6]={ 0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000 };
static DeviceClass_t lorawanClass = LORAWAN_CLASS;
// Devise location
const float latitude = 39.573;
const float longitude = 2.732;
const int alt = 20;
// Other params
float SensorId= 10.01;// Sensor identifcator number
const int DutyCycle = 600000; // Transmision and reading period
const int Sleep4NoNoise = 300000; // Sleep period when low noise
const int LowNoiseLevel = 180; // Limit for low noise mode
Desde el menú vertical izquierdo accederemos al Payload Formatters y la opción Uplink para definir cómo decodificar la trama de datos de nuestro mensaje LoRa que hemos establecido en el firmware. En nuestro caso hemos usado la librería CayenneLPP y esto es lo que aquí tenemos de seleccionar como tipo:
De esta manera el mensaje MQTT que vamos a utilizar para leer los valores del sensor; será generado por backend de TTN en una estructura JSON perfectamente formateada:
{
"uplink_message":{
"f_port":2,
"f_cnt":539,
"frm_payload":"AQID6QFlAE8CZQDDAogGCGAAaiwAC7g=",
"decoded_payload":{
"analog_in_1":10.02,
"gps_2":{
"altitude":30,
"latitude":39.936,
"longitude":3.718
},
"luminosity_1":79,
"luminosity_2":195
}
}
Por último necesitaremos las credenciales de acceso al broker MQTT que TTN nos ofrece como una opción de integración para poder suscribirnos a topic desde nuestra aplicación:
IMPORTANTE: copia el password ahora porque una vez cerrada esta ventana. No tendrás opción a consultarlo.
Cuando hablamos de sonido o de ruido, la magnitud que se utiliza con mayor frecuencia son los dBA y la medida estandarizada para calidad ambiental es la LAeq (Equivalent Continuous Sound Pressure Level). En nuestro caso será para el tiempo dado de 10 minutos. Calcular este indice requiere de varias transformaciones, calibrados y cálculos que se detallan a continuación:
- (A) Partimos que el sensor de sonido SparkFun Sound Detector nos da una medida analógica con un rango de 0 a 4500. Puede dar valores superiores pero aplicamos un filtro software de banda alta para eliminar los outlier. Si embargo esta medida analógica no es el valor instantáneo del sonido o presión sonora. Si no la envolvente de 1 segundo de muestreo calculada por el circuito del sensor. Línea verde del gráfico:
Este gráfico muestra los voltajes de salida a lo largo del tiempo.
- El trazo verde oscuro es la salida de audio del detector de sonido. El voltaje de audio directamente desde el micrófono se encuentra en esta salida.
- El trazo verde claro es la envolvente. Este voltaje analógico rastrea la amplitud del sonido. Se puede observar que el tercer pulso se vuelve notablemente más fuerte a medida que avanza.
- Finalmente, la línea roja es la salida de la puerta. Esta salida es baja cuando las condiciones son tranquilas y aumenta cuando se detecta sonido.
- (B) Y tenemos que determinar el valor base que corresponda con la medida en silencio.
- Calculamos el ruido medio del periodo de ciclo de transmisión que es de 10 minutos.
Donde:
Leq = nivel de presión sonora continuo equivalente en dB
p0 = nivel de presión de referencia (típicamente 20 µPa)
pA = presión sonora adquirida
t1 = tiempo de inicio de la medición
t2 = tiempo de finalización de la medición
- Finalmente para obtener el LAeq basándonos en la media y no al Leq anterior que sería lo correcto. Aplicamos la fórmula que nos dará una magnitud en decibelios:
LAeq = Calibración * 20 * log10 ( Ruido Medio / Ruido Base )
Partimos de una instancia Node-RED con nodo para mostrar un interface de usuario que se llama dashboard. Lo que se puede hacer desde la opción Manage Palette de la aplicación de administración.
Se ha construido un sencillo flujo para representar unas gráficas y poder establecer un umbral de alerta para enviar un mensaje a IFTTT
El cual genera el siguiente dashboard:
En el flujo de Node-RED se tratan y muestran gráficamente los mensajes MQTT leidos. El payload contiene el json con los valores de:
- Ruido medio en "luminosity_1"
- Ruido pico en "luminosity_2"
- Id de sensor en "analog_in_1"
- Coordenadas geográficas en "gps_2"
Para importar el flujo deberemos acceder a la aplicación Node-RED que tenemos arrancada dónde encontraremos la opción de importar pulsando el botón de menú tipo hamburguesa. Lo más fácil es copiar al portapapeles de equipo el contenido del fichero jaleometro_nodered_ui_mqtt y pegarlo en la pantalla:
Tras pulsar el botón de ¨import¨ tendrás la vista de los nodos y los flujos. Pero hay tres de ellos que no están correctamente configurados.
Encontrarás todo configurado excepto las credenciales de acceso. Para utilizar las que has obtenido en los pasos anteriores. Solo tienes que ir a las propiedades del nodo MQTT, editar el Server y acceder a la pestaña Security:
La integración con IFTTT (If This Then That) está montada con una sencilla llamada a su endpoint REST utilizando en nodo tipo http request con el siguiente formato.
https://maker.ifttt.com/trigger/domohome_garage_intruder/with/key/???????????
Donde sustituiremos las interrogantes por la Key que encontramos en esta configuración del componente Maker _Webhooks_ en IFTTT. Que configuraremos para recibir el evento disparar los avisos nativos en nuestra móvil a fin de tener notificación de la alarma.
- A Christoph Hafner y Javier Maura cuyo proyecto Moix me ha servido de inspiración https://github.com/Makespace-Mallorca/moix
- A mi ex-compañero Alexandre Coll por sus buenos consejos de cómo medir el ruido https://www.linkedin.com/in/alexandre-coll-molina/
- A Sparkfun por su buena documentación: https://learn.sparkfun.com/tutorials/sik-experiment-guide-for-the-arduino-101genuino-101-board-spanish/experimento-15-usar-la-placa-de-detector-de-sonido