Nesta seção são realizados os testes práticos do funcionamento do sistema de monitoramento e controle de processos produtivos. Para esse fim, o dispositivo local foi conectado ao servidor MQTT e através do aplicativo foram enviados comandos e recebidos os valores publicados pelo dispositivo, em três situações diferentes. Sempre há o registro de duas imagens para cada situação, sendo a primeira imagem referente a tela do aplicativo e a segunda imagem referente ao dispositivo local com as devidas sinalizações de estado das entradas e saídas. Vale ressaltar que os LEDs localizados próximos aos relés de saída correspondem ao estado de cada saída identificada como S1 ou S2. Nos LEDs localizados próximo ao módulo ESP 32, o LED verde indica que a conexão com o servidor MQTT está ativa e o LED amarelo indica o estado da entrada digital.
Na primeira situação foi enviado o comando para acionar a saída 2 e desligar a saída 1 do dispositivo, e o dispositivo enviou o valor da temperatura de 24,8°C e estava com a entrada digital em nível 0, conforme ilustrado na Figura 44 e na Figura 45.
Figura 44 – Aplicativo com comando para acionar S2 e lendo temperatura
Fonte: Autoria própria (2020).
Figura 45 – Dispositivo com a saída 2 acionada
_____________________________________________________________________________________ Na segunda situação foi enviado o comando para acionar a saída 1 e desligar a saída 2 do dispositivo, e o dispositivo enviou o valor da temperatura de 24,8°C e estava com a entrada digital em nível 1, conforme ilustrado na Figura 46 e na Figura 47.
Figura 46 - Aplicativo com comando para acionar S1, lendo a entrada digital como 100 e lendo temperatura
Fonte: Autoria própria (2020).
Figura 47 – Dispositivo com a saída 1 acionada e com a entrada digital acionada
Na terceira situação foi enviado o comando para acionar a saída 1 e a saída 2 do dispositivo, e o dispositivo enviou o valor da temperatura de 24,8°C e estava com a entrada digital em nível 1, conforme ilustrado na Figura 48 e na Figura 49.
Figura 48 - Aplicativo com comando para acionar S1 e S2, lendo a entrada digital como 100 e lendo temperatura
Fonte: Autoria própria (2020).
Figura 49 – Dispositivo com as duas saídas acionadas e com a entrada digital acionada
_____________________________________________________________________________________ Nas três situações simuladas acima, o acionamento dos relés das saídas do dispositivo correspondeu exatamente aos comandos enviados através do aplicativo, bem como a leitura das informações do dispositivo, como temperatura e estado da entrada digital, também reproduziram fielmente as ocorrências locais, mostrando os valores corretos na tela do aplicativo.
6 CONCLUSÃO
O conceito de IoT para o monitoramento e controle é uma poderosa ferramenta de gestão para as linhas produtivas das empresas, isto desde que seja desenvolvido e aplicado de forma dedicada às necessidades de cada linha.
Ele envolve, diversas áreas do conhecimento como a eletrônica digital, a eletrônica analógica, a programação de microcontroladores, os protocolos de comunicação, os serviços de
Cloud (nuvem), e inclusive o desenvolvimento de aplicativos e softwares.
Entre os desafios destaca-se a programação do ESP 32, que utiliza linguagem semelhante ao Arduino. O segundo desafio foi compreender e assimilar as necessidades de todos os comandos do protocolo MQTT. Por fim a maior dificuldade enfrentada foi avaliar e corrigir as constantes quedas de conexão com o servidor MQTT. Uma vez que quando algo era publicado pelo dispositivo local, o sistema perdia sua conexão. Esse erro está diretamente relacionado a forma de estruturar o conteúdo do tópico de publicação. Um detalhe importante neste caso é que o servidor desconecta o dispositivo, mas não gera nenhum tipo de aviso.
Entre os objetivos iniciais, não foi possível confeccionar a placa de circuito impresso para a montagem definitiva do sistema devido a falta de acesso aos laboratórios da universidade, dificuldade de deslocamento intermunicipal, causada pela pandemia da COVID-19.
Por esse mesmo motivo não foi possível realizar os testes práticos em uma linha de montagem real, dentro da indústria.
No entanto o objetivo principal deste trabalho é apresentar o conceito de IoT aplicado a área industrial, bem como as possibilidades de comunicação e tratamento das informações na nuvem. Espera-se que este estudo sirva de base para inúmeros sistemas que poderão ser desenvolvidos, e para isso sugere-se como trabalhos futuros:
Aplicar este conceito de IoT para os sensores e atuadores de uma máquina real em algum processo produtivo.
_____________________________________________________________________________________ Elaborar um software para tratamento dos dados disponibilizados na nuvem e explorar a questão de armazenamento dos dados em bancos de dados nessa nuvem.
Desenvolver um aplicativo padronizado para tratamento dos dados na nuvem, podendo publicar tópicos e também se inscrever nos mesmos.
REFERÊNCIAS
BETO. Indústria 4.0: Revolução Tecnológica Promoverá Integração dos Sistemas de Produção em Tempo Real, 2018. Disponível em:
<https://www.hubi40.com.br/industria-4-0-revolucao-tecnologica-promovera-integracao-dos- sistemas-de-producao-em-tempo-real/> Acesso em: 14/09/2019
CNI. Participação da Indústria na Economia Brasileira sobe para 22%, 2019. Disponível em: <https://noticias.portaldaindustria.com.br/noticias/economia/participacao-da-industria-na- economia-brasileira-sobe-para-22-diz-cni/> Acesso em: 12/09/2019
VDI-BRASIL. Desafios para a Indústria 4.0, 2018. Disponível em:
<http://www.vdibrasil.com/desafios-para-a-industria-4-0/> Acesso em: 08/09/2019
VDI-BRASIL. VDI Brasil Apresenta Cases de Indústria 4.0 na Expomafe, 2019. Disponível em: <http://www.usinagem-brasil.com.br/14012-vdi-brasil-apresenta-cases-de-industria-40-na- expomafe/> Acesso em: 08/09/2019
DESOUTTER. Revolução Industrial - da Indústria 1.0 a Indústria 4.0, 2019.
Disponível em: <https://www.desouttertools.com.br/industria-4-0/noticias/507/revolucao- industrial-da-industria-1-0-a-industria-4-0> Acesso em: 16/10/2019
VARGAS, Rodrigo. GestaoIndustrial.com: Lean-Manufacturing. [S.l.], 2009-2019. Disponível em: <https://gestaoindustrial.com/lean-manufacturing/> Acesso em: 01/11/2019
MICROCHIP. PIC18F2525/2620/4525/4620 Datasheet. [S.l.], 2008.
Disponível em: <http://ww1.microchip.com/downloads/en/DeviceDoc/39626e.pdf> Acesso em: 15/10/2019
XIAMEN AMOTEC. ADM1602K Datasheet. [S.l.], 2008. Disponível em:
< https://www.sparkfun.com/datasheets/LCD/ADM1602K-NSW-FBS-3.3v.pdf> Acesso em: 15/10/2019
ESPRESSIF. ESP32 Series Datasheet, 2019. Disponível em:
<https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf> Acesso em: 18/10/2019
ZHOU, Ping; WANG, Xudong; RAO, Ramesh. Asymptotic Capacity of Infrastructure Wireless Mesh Networks. IEEE Transactions on Mobile Computing, vol 7, 2008. DOI: 10.1109/TMC.2007.70778.
YUAN, Michael. Conhecendo o MQTT, 2017. Disponível em:
<https://www.ibm.com/developerworks/br/library/iot-mqtt-why-good-for-iot/index.html> Acesso em: 02/11/2019
_____________________________________________________________________________________ BRAGA, Newton C. Como funciona o Protocolo Modbus, 2019. Disponível em:
<https://www.newtoncbraga.com.br/index.php/como-funciona/12089-como-funciona-o- protocolo-modbus-r0001> Acesso em: 02/11/2019
GOMES, Pedro C. T.. O que é um Dashboard?, 2017. Disponível em:
<https://www.opservices.com.br/o-que-e-um-dashboard/> Acesso em: 03/11/2019
CURVELLO, André. ESP32 – Um grande aliado para o Maker IoT, 2018. Disponível em: <https://www.filipeflop.com/blog/esp32-um-grande-aliado-para-o-maker-iot/> Acesso em: 05/06/2020
IOXHOP. NodeMCU-32S ESP32 WiFi+Bluetooth Development board, 2020. Disponível em: <https://www.ioxhop.com/product/532/nodemcu-32s-esp32-wifibluetooth-development-board> Acesso em: 01/06/2020
ALLDATASHEET. NPN Transistors BC337 datasheet, 2020. Disponível em:
<https://pdf1.alldatasheet.com/datasheet-pdf/view/663624/KEXIN/BC337.html> Acesso em: 02/06/2020
TEXAS, Instruments. LM35 Precision Centigrade Temperature Sensors, 2020. Disponível em: <https://www.ti.com/lit/ds/symlink/lm35.pdf?ts=1592493016273&ref_url=https%253A%252F% 252Fwww.ti.com%252Fproduct%252FLM35%253FHQS%253DTI-null-null-alldatasheets-df-pf- SEP-wwe%2526DCM%253Dyes%2526dclid%253DCLfEkuHSi-oCFWUyuQYdn8QJuA> Acesso em: 02/06/2020
ALLDATASHEET. JQC-3F (T73) relay datasheet, 2020. Disponível em:
<https://pdf1.alldatasheet.com/datasheet-pdf/view/114957/ETC1/JQC-3FT73.html> Acesso em: 02/06/2020
APÊNDICES
APÊNDICE A – CÓDIGO FONTE GRAVADO NO ESP 32 #include <WiFi.h> // Inclusão de biblioteca de WiFi #include <PubSubClient.h> // Inclusão de biblioteca de MQTT #include <ArduinoJson.h> // Inclusão de biblioteca de Json
#include <DNSServer.h> // Inclusão de biblioteca de DNS Server #include <WebServer.h> // Inclusão de biblioteca de WebServer
#include <WiFiManager.h> // Inclusão de biblioteca de configuração de WiFi #define SSID "MUCKENFUHS" // SSID da rede WiFi
#define PASSWORD "" // Senha da rede WiFi
const String ORG = "xxxxxx"; // ID da organização obtido no cadastro ao IBM Watson IoT Platform
const String TIPO_DISP = "ESP32"; // Tipo de equipamento cadastrado no IBM Watson IoT Platform
const String ID_DISP = "001"; // ID do equipamento cadastrado no IBM Watson IoT Platform
#define TOKEN_DISP "xxxxxxxxxxxxxxxxxx" // TOKEN para acesso obtido no cadastro ao IBM Watson IoT Platform
const String ID_CLIENTE = "d:"+ORG+":"+TIPO_DISP+":"+ID_DISP; // ID de cliente utilizado para conexão
const String SERVIDOR_MQTT = ORG + ".messaging.internetofthings.ibmcloud.com"; // Servidor MQTT utilizado no projeto
String DEF1 = "temperatura"; // String auxiliar para formação do payload String DEF2 = "entrada_digital"; // String auxiliar para formação do payload float Temperatura = 0; // Definição de variável auxiliar
float Entrada = 0; // Definição de variável auxiliar
#define TOPIC_PUB "iot-2/evt/retorno_info/fmt/json" // Tópico utilizado para publicações de eventos
#define TOPIC_SUB_SD1 "iot-2/cmd/commandR1/fmt/json" // Tópico utilizado para receber comandos para a saída 1
#define TOPIC_SUB_SD2 "iot-2/cmd/commandR2/fmt/json" // Tópico utilizado para receber comandos para a saída 2
_____________________________________________________________________________________ #define SD2_PINO 26 // Definição dos pinos do ESP32
#define CON_PINO 12 // Definição dos pinos do ESP32 #define CONF_PINO 33 // Definição dos pinos do ESP32 #define ENT_PINO 35 // Definição dos pinos do ESP32 #define ANALOG_ENT 36 // Definição dos pinos do ESP32
WiFiClient wifiClient; // Cliente WiFi utilizado pelo MQTT para se conectar
PubSubClient client(SERVIDOR_MQTT.c_str(), 1883, wifiClient); // Cliente MQTT, servidor, porta e cliente WiFi
void setup() // Setup do ESP 32 {
Serial.begin(115200); // Inicializa porta serial com velocidade de 115200 pinMode(SD1_PINO, OUTPUT); // Configura o pino como saída pinMode(SD2_PINO, OUTPUT); // Configura o pino como saída pinMode(CON_PINO, OUTPUT); // Configura o pino como saída pinMode(CONF_PINO, OUTPUT); // Configura o pino como saída pinMode(ENT_PINO, INPUT); // Configura o pino como entrada
pinMode(ANALOG_ENT, INPUT); // Configura o pino como entrada analógica digitalWrite(CON_PINO, LOW); // Desliga a saída
digitalWrite(CONF_PINO, LOW); // Desliga a saída
WiFiManager wifiManager; // Declaração do objeto wifiManager
wifiManager.setAPCallback(Retorno_modo_conf); // Retorno quando entra em modo de configuração, AP
wifiManager.setSaveConfigCallback(Retorno_salva_conf); // Retorno quando entra em modo de operação, estação
wifiManager.autoConnect("ESP_AP"); // Rede sem senha, IP 192.168.4.1 conectaBroker(); // Chamada da função para conexão ao servidor MQTT }
void loop() // Função loop principal {
if (!!!client.connected()) // Caso não esteja conectado ao broker, tenta reconectar {
digitalWrite(CON_PINO, LOW); // Desliga o LED de conexão Serial.print("Reconectando... "); // Escreve na serial
Serial.println(SERVIDOR_MQTT); // Escreve na serial Serial.print("..."); // Escreve na serial
delay(1000); // Tempo de 1 segundo
conectaBroker(); // Chamada da função para conexão ao servidor MQTT Serial.println("OK!!!"); // Escreve na serial
}
Temperatura = LeituraTemperatura(); // Chamada da função para leitura da temperatura LM35
Entrada = LeituraEntrada(); // Chamada da função para leitura da entrada digital Serial.print("Temperatura:"); // Escreve na serial
Serial.println(Temperatura); // Escreve na serial Serial.print("Entrada:"); // Escreve na serial Serial.println(Entrada); // Escreve na serial
if (digitalRead(ENT_PINO) == 1) // Se a entrada digital está acionada... {
digitalWrite(CONF_PINO, HIGH); // Aciona a saída }
else // Senão... {
digitalWrite(CONF_PINO, LOW); // Desliga a saída }
client.loop(); // Verifica se existe alguma mensagem em algum tópico de interesse
publicacao(Temperatura,Entrada); // Chamada de função para preparação e envio dos dados para a cloud
delay(1000); // Publicação a cada 1 segundo
}
void Retorno_modo_conf (WiFiManager *myWiFiManager) // Função WiFiManager para retorno do status do AP
{
Serial.println("Entrou no modo de configuração"); // Escreve na serial
Serial.println(WiFi.softAPIP()); // Escreve na serial o valor IP do AP
Serial.println(myWiFiManager->getConfigPortalSSID()); // Escreve na serial o SSID criado }
void Retorno_salva_conf () // Função para retorno de status em modo estação e salvamento dos dados
{
Serial.println("Configuração salva"); // Escreve na serial
Serial.println(WiFi.softAPIP()); // Escreve na serial o valor IP do AP }
_____________________________________________________________________________________ void conectaBroker() // Função para conexão ao servidor MQTT
{
Serial.println("Connecting to MQTT Server..."); // Escreve na serial
if (client.connect(ID_CLIENTE.c_str(), "use-token-auth", TOKEN_DISP)) // Conexão com o servidor...dados IBM Watson
{
Serial.println("Connected to MQTT Broker"); // Escreve na serial, caso conexão estabelecida
client.setCallback(retorno_topico); // Retorno quando algo for publicado em algum tópico inscrito
client.subscribe(TOPIC_SUB_SD1); // Inscrição nos tópicos de interesse client.subscribe(TOPIC_SUB_SD2); // Inscrição nos tópicos de interesse digitalWrite(CON_PINO, HIGH); // Liga o LED de conexão OK }
else // Senão... {
Serial.print("Erro = "); // Escreve na serial, caso ocorreu falha na conexão Serial.println(client.state()); // Escreve na serial
conectaBroker(); // Nova chamada da função para conexão ao servidor MQTT }
}
void publicacao(float valor1,float valor2) // Função para preparação e envio dos dados para a cloud
{
String payload = "{\"d\":{\"" + DEF1 + "\":"; // Formação da string "payload" payload += valor1; // Formação da string "payload" payload += ", \"" + DEF2 + "\":"; // Formação da string "payload" payload += valor2; // Formação da string "payload" payload += "}}"; // Formação da string "payload" Serial.print("Publicando payload: "); // Escreve na serial
Serial.println(payload); // Escreve na serial
if (client.publish(TOPIC_PUB, (char*) payload.c_str())) // Publicação da string payload no tópico de publicação
{
Serial.println("Publicação OK"); // Escreve na serial, caso publicação bem sucedida
}
else // Senão... {
Serial.println("Publicação falhou"); // Escreve na serial, em caso de falha na publicação
} }
void retorno_topico(char* topico, unsigned char* carga, unsigned int length) // Função de retorno de comandos recebidos
{
StaticJsonBuffer<32> jsonBuffer; // Faz o parse da carga para um objeto json....separa em partes a inf.
JsonObject& root = jsonBuffer.parseObject(carga); // Separa em partes a informação Serial.print("TÓPICO: "); // Escreve na serial
Serial.println(topico); // Escreve na serial
if(!root.success()) // Se não foi bem sucedido o parser... {
Serial.println("Erro Json Parse"); // Escreve na serial, em caso de erro return; // Sai da função
}
int comando = root["value"]; // Recuperação do atributo "value" do json salvo na variável "comando"
if (strcmp(topico, TOPIC_SUB_SD1) == 0) // Compara se a string topico é igual ao que está em TOPIC_SUB_SD1
{
digitalWrite(SD1_PINO, comando); // Se sim, joga 0 ou 1 na saída 1, conforme o valor de "comando"
}
else // Senão, altera a outra saída {
digitalWrite(SD2_PINO, comando); // Se não, joga 0 ou 1 na saída 2, conforme o valor de "comando"
} }
float LeituraTemperatura(void) // Função para leitura da temperatura LM35 {
int amostra[5]; // Variável para armazenamento de leitura...5 amostras int i; // Definição de variável
float temp = 0; // Definição de variável
for(i = 0;i<=4;i++) // Loop que faz a leitura da temperatura 5 vezes {
amostra[i] = ( 3.3 * analogRead(ANALOG_ENT) * 100.0) / 4096.0; // Leitura analógica e cálculo da temperatura
temp = temp + amostra[i]; // acúmulo do valor na variável "temp" delay(10); // tempo de 10ms
_____________________________________________________________________________________ temp = temp/5.0; // Divide a variável "temp" por 5, para obter precisão na medição
return temp; // Retorno da função }
float LeituraEntrada(void) // Função para leitura da entrada digital {
int digital; // Definição de variável float digi100; // Definição de variável digital = digitalRead(ENT_PINO); // Leitura da entrada digital
digi100 = digital*100.0; // Multiplicação do valor digital por 100
return digi100; // Retorno da função }
ANEXOS
_____________________________________________________________________________________ ANEXO B