No artigo anterior , revisamos brevemente a organização e o processamento dos dados da IoT usando o projeto Apache NiFi. Com este artigo, estamos abrindo uma série na qual falaremos detalhadamente sobre cada estágio, dos próprios dispositivos à análise da plataforma DataLake, aprendizado de máquina, previsão de anomalias etc.

Agora, vamos começar do primeiro nível, diretamente das "coisas", a letra T da abreviação IoT. Do próprio dispositivo, a organização do canal de comunicação e o uso do protocolo MQTT. A tendência da Internet das coisas existe há vários anos, mas na maioria das vezes a ideia é uma lâmpada e um soquete que se ligam a partir do telefone. Mas na produção, mineração e em várias outras indústrias há décadas, uma grande variedade de sensores tem sido usada, cujos valores são coletados no SCADA de produção. Basta conectar o fluxo de dados à Internet e obteremos a mesma IoT, mais precisamente a IIoT - a Internet industrial das coisas.
Por que tudo isso é necessário se todas essas décadas o SCADA gerencia com sucesso o ciclo de produção?
Existem várias razões:
- As possibilidades para o uso de sensores estão se expandindo, por exemplo, logística, onde um sensor de localização é instalado em um caminhão ou carro específico, além de vários outros adicionais, como consumo de combustível ou tempo de inatividade (espera na estação enquanto o carro está engatado) - tudo isso vai além da rede de produção local
- O número de sensores nos dispositivos está crescendo, eles exigem processamento mais complexo, o que nem sempre pode ser feito pelas capacidades da empresa
- Os recursos de aprendizado de máquina e inteligência artificial, desenvolvidos devido ao crescimento do poder da computação, podem ser usados para otimizar a produção, procurar gargalos e identificar anomalias
Como resultado, os sensores na produção não estão mais apenas enviando valores ao SCADA. Precisamos de uma arquitetura de software que nos permita construir uma cadeia do sensor final em qualquer máquina para a nuvem de computação, na qual, com base no histórico da máquina, usando o modelo treinado, a equipe de serviço receberá uma mensagem “37% de chance de falha do mecanismo, você precisa enviar um engenheiro "

Bem, agora de volta às coisas! Normalmente, para demonstrar esses sistemas, conjuntos abertos de indicadores históricos de sensores de uma indústria são usados. Mas, infelizmente, nesta opção, "toque" no sistema não funciona. Não, não chegaremos à fábrica, mas faremos nossa "coisa simples com a Internet".
Nossa área de atividade está relacionada às infraestruturas de servidor, mas ainda temos algumas habilidades eletrônicas de hobby, portanto a "coisa" será feita em casa.
Escolheremos a opção de monitoramento mais simples - o sensor climático, coletaremos dados de temperatura, umidade e pressão.
Base de componentes
Tomamos o BMP280 como um sensor.
Uma coisa muito sofisticada, destina-se não apenas aos dados meteorológicos, mas também, graças a um barômetro sensível, à assistência GPS, à navegação no prédio (para determinar o piso), a jogos para ajudar o acelerômetro. Nós o usaremos apenas para dados meteorológicos.
Tome como um módulo:

Como controlador e canal de comunicação, usaremos, provavelmente já um culto, o esp8266 ( https://en.wikipedia.org/wiki/ESP8266 )
No nosso caso, o módulo ESP-07:

A fonte de alimentação é uma bateria de 9V Krona. Como todos os dispositivos funcionam a partir de 3.3V, é necessário um conversor de redução. Estende uma mão para colocar o LD1117 linear favorito de todos :

Mas tudo o que reduz o conversor linear é que ele simplesmente se dissipa em calor. A corrente de pico do esp8622 é de cerca de 0,4A, o que significa que com um conversor linear (9-3,3) * 0,4 = 2,28W não chega a lugar nenhum. Também derreterá.
Portanto, um conversor de pulso pulsado foi montado no LM2576 :

3 amperes é definitivamente suficiente para todos (na verdade, o que era da base do componente foi soldado).
Esquema
Como CAD, Eagle foi usado, o esquema foi o seguinte:

Para executar esp8622, você precisa puxar RESET e CH_PD para o mais (inclui o módulo), GPIO15 para o menos. Quando o GPIO0 é puxado para o chão, o módulo entra no modo de programação, para que haja um jumper.
GPIO02 e GPIO15 são usados como linhas SDA / SDL do barramento I2C para conectar o BMP280, bem como quaisquer outros dispositivos no barramento (conector de pino JP5), por exemplo, um monitor para depuração no local.
O JP1 é usado para conectar via UART (via conversor UART-USB) a um computador para programar e depurar o módulo.
Um divisor de tensão para o ADC é montado nos resistores R6 e R5, para que você possa monitorar a carga da bateria.
Taxa
A fiação é a seguinte:

Muito provavelmente, nas melhores tradições dos circuitos de hobby, viola todas as regras possíveis, mas o mais importante é que funciona :)
O próprio dispositivo revelou o seguinte:


A placa é fabricada com a tecnologia de passar a laser (um dos milhares de exemplos: http://cxem.net/master/45.php ).
Programação de dispositivos
Para um início rápido do esp8622, eles usaram o firmware do NodeMCU .
NodeMCU é um intérprete Lua para esp8622 e um monte de bibliotecas para vários dispositivos, sensores, monitores, etc.
Para piscar o dispositivo, você primeiro precisa obter este firmware. A documentação oferece várias opções, mas a mais simples delas é o serviço nodemcu-build.com , que permite, simplesmente selecionando os módulos necessários, obter o firmware pronto para o correio.

Para o nosso dispositivo, você definitivamente precisa selecionar MQTT, I2C (porque o sensor está localizado neste barramento), bem, o próprio sensor BME280 (temos o BMP280, mas a biblioteca é universal) e o ADC para monitorar a bateria. Após a montagem do firmware, o serviço o enviará para o correio especificado.
Em seguida, é necessário fechar o GPIO0 ao terra e colocar o módulo no modo de programação (jumper JP2), conectar o adaptador USB-UART e distorcer a energia.
O download do firmware é realizado usando o NodeMCU PyFlasher . Você precisa selecionar a porta serial apropriada, o próprio firmware e, para o módulo ESP-07 - Quad I / O, outros modos não funcionarão.

Um pouco de paciência, até que o firmware seja concluído, remova o jumper JP2, distorça a energia e, no final, nosso dispositivo estará pronto para o código do usuário.
Código
Configurações UART para conexão - 115200 8N1, conectando-se a algum terminal da porta serial (por exemplo, terminalbpp ), você pode inserir diretamente comandos lua, como REPL.

Mas ainda estamos interessados em firmware menos efêmero, para que, após uma reinicialização, permaneça :)
Ao iniciar, o NodeMCU começa a executar o arquivo init.lua (se houver) do cartão flash. Aqui nós escrevemos.
Para a amostra, tomamos um exemplo da documentação:
Para download, usamos o utilitário simples Asmodat ESP LUA Loader . Ela simplesmente empurra file.open no terminal e escreve Lua linha por linha com os comandos.
A lógica é a seguinte:
- Inicializar dispositivos
- Conecte-se ao wifi
- Leia as leituras do sensor
- Nós nos conectamos ao broker MQTT e enviamos leituras para os tópicos relevantes
- Desligue o WiFi, adormeça até a próxima medição
Apresentamos o roteiro de Lua, o circuito e a fiação da placa , em princípio, tudo é bastante transparente lá.
Lugares que eu gostaria de observar:
A entrada ADC esp8266 requer uma tensão na faixa de 0 a 1 V e a saída fornece um número correspondente de 0 a 1024. Para os resistores 39 kOhm e 470 kOhm - o coeficiente de conversão é obtido em torno de 13. Isso é, para estimar (não medir com muita precisão) a voltagem da bateria - você precisa multiplicar o valor obtido por 13 e dividir por 1024.
Como o sensor BMP280 é universal, ele possui várias opções de configuração para diferentes aplicações. Para o NodeMCU, a inicialização do sensor para medições climáticas é assim (um número mágico):
bme280.setup(1, 1, 1, 1, 7, 0) -- weather mode
Leia mais sobre esses números na documentação . Bem, no quadro de dados no BMP280 acima.
Não foi possível entrar no modo de suspensão profunda, por algum motivo o módulo não foi ativado.
A biblioteca para trabalhar com o MQTT é bastante específica, é impossível determinar exatamente quando fechar a conexão. A comunidade tem muitas perguntas sobre isso sem nenhuma solução. Existem várias soluções alternativas, como este artigo .
Mas, no nosso caso, esperamos alguns segundos por um tempo limite e, em seguida, desligamos o Wi-Fi.
Além disso, o suporte ao TLS, apesar de anunciado, mas não conseguiu obtê-lo, os dados são enviados sem criptografia.
Enviando dados
A cada minuto, o módulo se conecta ao WiFi e envia as leituras do sensor ao broker MQTT.
Tópicos no MQTT no seguinte formato:
/device_location/device_name/sensor
Isso permite que você assine fluxos de dados de sensores por local e por sensores específicos, por exemplo, a temperatura fora da janela:
/outdoor/
Intermediário MQTT
Como um broker do MQTT, usamos o Eclipse Mosquitto. Para instalar, por exemplo, no Debian, você precisa de dois pacotes: mosquitto e mosquitto_clients.
Em /etc/mosquitto/mosquitto.conf, você precisa escrever
require_certificate false
Em seguida, inicie nosso dispositivo, usando o utilitário mosquitto_sub, assine os tópicos do dispositivo, monitore o clima)
root@baikal:~
Baikal é mencionado aqui por uma razão. Ainda estamos localizados geograficamente perto de Baikal, portanto, para a estação base do dispositivo, não havia outras opções além de usar o BFK 3.1 no núcleo Baikal T-1 :)
Nos artigos subsequentes, passaremos à transferência de dados recebidos da IIoT para o sistema de análise e visualização e falaremos sobre filas. E sobre Baikal, é claro :)