En el artículo anterior , revisamos brevemente la organización y el procesamiento de los datos de IoT utilizando el proyecto Apache NiFi. Con este artículo, estamos abriendo una serie en la que hablaremos en detalle sobre cada etapa, desde los dispositivos mismos hasta el análisis de la plataforma DataLake, el aprendizaje automático, la predicción de anomalías, etc.

Ahora comencemos desde el primer nivel, directamente de "cosas", la letra T de la abreviatura IoT. Desde el propio dispositivo, la organización del canal de comunicación y el uso del protocolo MQTT. La tendencia IoT ha existido durante varios años, pero en su mayor parte la idea de ser una bombilla y un enchufe que se enciende desde el teléfono. Pero en la producción, la minería y en varias otras industrias durante décadas, se ha utilizado una amplia variedad de sensores, cuyos valores se recopilan en SCADA de producción. Simplemente conecte el flujo de datos a Internet y obtendremos el mismo IoT, más precisamente IIoT: el Internet industrial de las cosas.
¿Por qué es todo esto necesario si todas estas décadas SCADA gestiona con éxito el ciclo de producción?
Hay varias razones:
- Las posibilidades para el uso de sensores se están expandiendo, por ejemplo, la logística, donde se instala un sensor de ubicación en un camión o automóvil específico, así como varios adicionales, como el consumo de combustible o el tiempo de inactividad (espere en la estación mientras el automóvil está enganchado): todo esto va más allá de la red de producción local.
- El número de sensores en los dispositivos está creciendo, requieren un procesamiento más complejo, que no siempre puede ser realizado por las capacidades empresariales.
- Las capacidades de aprendizaje automático e inteligencia artificial, desarrolladas debido al crecimiento de la potencia informática, se pueden utilizar para optimizar la producción, buscar cuellos de botella e identificar anomalías.
Como resultado, los sensores en la producción ya no solo envían valores a SCADA. Necesitamos una arquitectura de software que nos permita construir una cadena desde el sensor final en cualquier máquina hasta la nube informática, en la cual, según el historial de la máquina, utilizando el modelo capacitado, el personal de servicio recibirá un mensaje "37% de probabilidad de falla del mecanismo, debe enviar un ingeniero ".

Bueno, ahora de vuelta a las cosas! Por lo general, para demostrar tales sistemas, se utilizan conjuntos abiertos de indicadores de sensores históricos de una industria. Pero desafortunadamente, en esta opción, "tocar" el sistema no funciona. No, no llegaremos a la fábrica, pero haremos nuestra simple "cosa con Internet".
Nuestra área de actividad está relacionada con las infraestructuras de servidores, pero todavía tenemos algunas habilidades de hobby electrónico, por lo que la "cosa" será hecha en casa.
Elegiremos la opción de monitoreo más simple: el sensor climático, recopilaremos datos sobre temperatura, humedad y presión.
Base de componentes
Tomamos el BMP280 como sensor.
Algo muy sofisticado, está destinado no solo a los datos meteorológicos, sino también, gracias a un barómetro sensible, a la asistencia GPS, a la navegación en el edificio (para determinar el piso), a los juegos que ayudan al acelerómetro. Lo usaremos solo para datos meteorológicos.
Tomar como un módulo:

Como el controlador y el canal de comunicación, tomaremos, probablemente ya uno de culto, esp8266 ( https://en.wikipedia.org/wiki/ESP8266 )
En nuestro caso, el módulo ESP-07:

La fuente de alimentación es una batería Krona de 9V. Como todos los dispositivos funcionan desde 3.3V, se necesita un convertidor reductor. Una mano se extiende para poner el LD1117 lineal favorito de todos :

Pero todo lo que reduce el convertidor lineal es que simplemente se disipa en calor. La corriente máxima de esp8622 es de aproximadamente 0.4A, lo que significa que con un convertidor lineal (9-3.3) * 0.4 = 2.28W a ninguna parte. También se derretirá.
Por lo tanto, se montó un convertidor de dinero pulsado en el LM2576 :

3 amperios es definitivamente suficiente para todos (de hecho, lo que era de la base del componente se soldaba).
Esquema
Como CAD, se utilizó Eagle, el esquema fue el siguiente:

Para ejecutar esp8622, debe colocar RESET y CH_PD al más (incluye el módulo), GPIO15 al menos. Cuando GPIO0 se tira al suelo, el módulo pasa al modo de programación, por lo que hay un puente.
GPIO02 y GPIO15 se utilizan como líneas SDA / SDL del bus I2C para conectar el BMP280, así como cualquier otro dispositivo en el bus (conector pin JP5), por ejemplo, una pantalla, para la depuración en el acto.
JP1 se utiliza para conectarse a través de UART (a través de un convertidor UART-USB) a una computadora para programar y depurar el módulo.
Se monta un divisor de voltaje para el ADC en las resistencias R6 y R5, para que pueda controlar la carga de la batería.
Tarifa
El cableado es el siguiente:

Lo más probable es que, en las mejores tradiciones de circuitos de hobby, viole todas las reglas posibles, pero lo más importante es que funciona :)
El dispositivo en sí resultó esto:


El tablero está hecho con tecnología de planchado láser (uno de los miles de ejemplos: http://cxem.net/master/45.php ).
Programación del dispositivo
Para un inicio rápido de esp8622, tomaron el firmware NodeMCU .
NodeMCU es un intérprete de Lua para esp8622 y un montón de bibliotecas para varios dispositivos, sensores, pantallas, etc.
Para actualizar el dispositivo, primero debe obtener este firmware. La documentación ofrece varias opciones, pero la más simple de ellas es el servicio nodemcu-build.com , que le permite, simplemente seleccionando los módulos necesarios, obtener el firmware listo para enviar por correo.

Para nuestro dispositivo, definitivamente debe seleccionar MQTT, I2C (porque el sensor está ubicado en este bus), bueno, el sensor BME280 en sí (tenemos BMP280, pero la biblioteca es universal), así como ADC para monitorear la batería. Después de ensamblar el firmware, el servicio lo enviará al correo especificado.
A continuación, debe cerrar GPIO0 a tierra y poner el módulo en modo de programación (puente JP2), conectar el adaptador USB-UART y distorsionar la alimentación.
La descarga del firmware se realiza utilizando NodeMCU PyFlasher . Debe seleccionar el puerto serie apropiado, el firmware en sí mismo, y para el módulo ESP-07 - Quad I / O, otros modos no funcionarán.

Un poco de paciencia, hasta que se complete el firmware, luego retire el puente JP2, distorsione la alimentación y al final nuestro dispositivo está listo para el código de usuario.
Código
Configuración de UART para la conexión: 115200 8N1, al conectarse con algún terminal para el puerto serie (por ejemplo, terminalbpp ), puede ingresar directamente comandos lua, como REPL.

Pero todavía estamos interesados en un firmware menos efímero, para que después de un reinicio permanezca :)
Al iniciar, NodeMCU comienza a ejecutar el archivo init.lua (si lo hay) desde la tarjeta flash. Aquí lo escribimos.
Para la muestra tomamos un ejemplo de la documentación:
Para la descarga, utilizamos la sencilla utilidad Asmodat ESP LUA Loader . Simplemente inserta file.open en la terminal y escribe Lua línea por línea con los comandos.
La lógica es la siguiente:
- Inicializar dispositivos
- Conéctate a wifi
- Leer las lecturas del sensor
- Nos conectamos con el agente MQTT y enviamos lecturas a los temas relevantes
- Apague el WiFi, duerma hasta la próxima medición
Presentamos el script Lua, el circuito y el cableado de la placa , en principio, todo es bastante transparente allí.
Lugares que me gustaría señalar:
La entrada ADC esp8266 requiere un voltaje en el rango de 0 a 1 V y la salida proporciona un número correspondiente de 0 a 1024. Para resistencias de 39 kOhm y 470 kOhm, el coeficiente de conversión se obtiene alrededor de 13. Es decir, Para estimar (no medir con mucha precisión) el voltaje de la batería, debe multiplicar el valor obtenido por 13 y dividirlo por 1024.
Como el sensor BMP280 es universal, tiene varias opciones de configuración para diferentes aplicaciones. Para NodeMCU, la inicialización del sensor para mediciones climáticas se ve así (un número mágico):
bme280.setup(1, 1, 1, 1, 7, 0) -- weather mode
Lea más sobre estos números en la documentación . Bueno, en la placa de datos en el BMP280 anterior.
No fue posible pasar al modo de reposo profundo, por alguna razón el módulo no se activó.
La biblioteca para trabajar con MQTT es bastante específica, es imposible determinar exactamente cuándo cerrar la conexión. La comunidad tiene muchas preguntas sobre esto sin ninguna solución. Existen varias soluciones, como este artículo .
Pero en nuestro caso, solo esperamos unos segundos por un tiempo de espera y luego apagamos el WiFi.
Además, el soporte para TLS, aunque se anunció, pero no se pudo obtener, los datos se envían sin cifrar.
Enviando datos
Una vez por minuto, el módulo se conecta a WiFi y envía las lecturas del sensor al agente MQTT.
Temas en MQTT en el siguiente formato:
/device_location/device_name/sensor
Esto le permite suscribirse a flujos de datos de sensores tanto por ubicación como por sensores específicos, por ejemplo, la temperatura fuera de la ventana:
/outdoor/
Corredor MQTT
Como corredor de MQTT, utilizamos Eclipse Mosquitto. Para instalar, por ejemplo, en Debian, necesita dos paquetes: mosquitto y mosquitto_clients.
En /etc/mosquitto/mosquitto.conf necesitas escribir
require_certificate false
Luego, inicie nuestro dispositivo, utilizando la utilidad mosquitto_sub, suscríbase a los temas del dispositivo, monitoree el clima)
root@baikal:~
Baikal se menciona aquí por una razón. Todavía estamos ubicados geográficamente cerca de Baikal, por lo que para la estación base del dispositivo no había otras opciones que usar BFK 3.1 en el núcleo Baikal T-1 :)
En artículos posteriores, pasaremos a transferir los datos recibidos de IIoT al sistema de análisis y visualización y hablaremos sobre las colas. Y sobre Baikal, por supuesto :)