• Nenhum resultado encontrado

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

Documentos relacionados