Home Soluções Controle de Smart Display via RS485 Modbus com Arduino

Controle de Smart Display via RS485 Modbus com Arduino

Nov 27, 2023

Introdução

No artigo técnico anterior, "Introdução à RS485 para Smart Display", apresentamos os conceitos básicos da comunicação RS485 e do protocolo Modbus. Neste artigo, avançaremos para um exemplo prático com várias páginas, abordando algumas técnicas comuns no desenvolvimento com Smart Display, incluindo:

  • Como alternar entre páginas usando o Button widget.
  • Como atualizar os valores dos widgets após a troca de página.
  • Como gerar sinais sonoros de diferentes durações com o buzzer.
  • Como utilizar o Graph widget.
 

Materiais necessários

  • Um Smart Display com interface RS485. Neste exemplo, utilizaremos um Smart Display de 3,5".
  • Arduino (Uno ou Mega2560).
  • Placa de expansão RS485 para Arduino (Link para a DFRobot).
  • Potenciômetro (VR).
 

Conexões

  • Potenciômetro: conecte Vcc a 5 V, GND ao GND e a saída à entrada A0 do Arduino.
  • Conecte o terminal A da placa de expansão RS485 ao RS485+ do Smart Display.
  • Conecte o terminal B da placa de expansão RS485 ao RS485- do Smart Display.
 

Conteúdo do exemplo

Este projeto é composto por três páginas, que podem ser alternadas por meio do Button widget. O conteúdo e as funções de cada página são apresentados a seguir:

Página 1:
No lado direito, há um botão para avançar para a próxima página. Na parte inferior, um Horizontal Slider permite ajustar o brilho da tela. A pré-visualização é apresentada abaixo:

Conteúdo do exemplo - Página 1

Página 2:
No lado esquerdo, há um botão para retornar à página anterior e, no lado direito, outro botão para avançar para a próxima página. Na parte inferior, três botões permitem acionar o buzzer com sinais sonoros de duração curta, média e longa.

Conteúdo do exemplo - Página 2

Página 3:
No lado esquerdo, há um botão para retornar à página anterior. Um potenciômetro é utilizado para simular uma entrada analógica, e os valores obtidos são exibidos no Graph widget.

Conteúdo do exemplo - Página 3

Como este exemplo utiliza uma placa de expansão RS485, antes de iniciar a programação, faça o download da biblioteca necessária por meio do Library Manager:

Download da biblioteca da placa de expansão RS485 pelo Library Manager

Criação do conteúdo das páginas

Primeiro, utilize o GUI Builder para criar o conteúdo das páginas. O texto pode ser inserido diretamente no Text widget de cada página, sem a necessidade de defini-lo no programa.

Criação do conteúdo das páginas - 1

Os detalhes dos widgets utilizados são apresentados na tabela a seguir:

Criação do conteúdo das páginas - 2

Você pode escolher o modelo de Smart Display de acordo com os recursos disponíveis e utilizar diferentes widgets para criar a interface desejada. O ponto principal é garantir que o widget ID e o type de cada página correspondam às definições utilizadas no programa. Para simplificar o desenvolvimento, recomendamos criar o conteúdo das páginas com base no widget ID e no type indicados nesta tabela.

A seguir, vamos para a parte de programação.

Explicação do programa

(1) Arquivos de inclusão

Após baixar a biblioteca ModbusMaster, certifique-se de incluí-la utilizando a diretiva #include:

Explicação do programa - (1) Arquivos de inclusão

Além disso, algumas constantes relacionadas ao Smart Display foram organizadas no arquivo SmartDisplayModbus.h para facilitar o gerenciamento. Esse arquivo também deve ser incluído.

(2) Conversão do Widget ID para endereço de registrador

No artigo anterior, apresentamos o método de conversão do widget ID para o endereço de registrador, conforme mostrado abaixo:

Explicação do programa - (2) Conversão do Widget ID para endereço de registrador - 1

No entanto, essa tabela foi criada quando cada página suportava no máximo 10 widgets. Atualmente, cada página pode conter até 64 widgets. A tabela continua válida para os primeiros 10 widgets, mas, a partir do 11º widget, é necessário utilizar um novo bloco de registradores. Para isso, definimos as seguintes macros:

Explicação do programa - (2) Conversão do Widget ID para endereço de registrador - 2

Para facilitar o uso, definimos uma função que realiza as operações de leitura e escrita com base no widget ID e faz internamente a conversão para o endereço de registrador correspondente:

Explicação do programa - (2) Conversão do Widget ID para endereço de registrador - 3

(3) Widget ID e design da GUI

Ao criar o conteúdo das páginas no GUI Builder, mencionamos que os widget IDs devem permanecer consistentes com as definições utilizadas no programa. Por isso, as constantes correspondentes aos widget IDs são definidas da seguinte forma:

Explicação do programa - (3) Widget ID e design da GUI

Essas constantes facilitam a identificação dos tipos de widget e a comparação com o design real das páginas. Caso o projeto da GUI seja alterado posteriormente, verifique também esses valores para evitar inconsistências.

(4) Buzzer

O firmware controla o buzzer utilizando contadores para gerar o sinal 0/1 e outros contadores para determinar os períodos de ativação e desativação do som. Para gerar o sinal sonoro, é necessário escrever em quatro registradores:

Explicação do programa - (4) Buzzer - 1

Para ajustar a duração do som, criamos uma função que recebe o parâmetro SMARTDISPLAY_BUZZER_HIGH:

Explicação do programa - (4) Buzzer - 2

O buzzer só é acionado quando o valor gravado em SMARTDISPLAY_BUZZER_ACTIVE é diferente do valor utilizado na gravação anterior. Por isso, esse valor é mantido como static dentro da função e invertido antes de cada chamada.

Por fim, na função de tratamento da página, é possível gerar sinais sonoros com diferentes durações de acordo com o estado dos botões:

Explicação do programa - (4) Buzzer - 3

(5) Troca de páginas

Antes de trocar de página, é necessário entrar em CONFIG_MODE. Após definir a nova página, o sistema deve retornar para DISPLAY_MODE. Durante a troca, o Smart Display recarrega todos os widgets da nova página. Para evitar operações de leitura ou escrita antes que esse processo seja concluído, normalmente é adicionado um pequeno atraso. O tempo necessário depende da complexidade da página. Caso seja observado algum comportamento anormal após a troca de página, tente aumentar esse intervalo.

Explicação do programa - (5) Troca de páginas - 1

Após a troca de página, os widgets da nova página são carregados com seus valores padrão. Por isso, estabelecemos um processo para realizar a troca de página, armazenar os valores dos widgets e restaurá-los quando necessário.

Primeiro, definimos um ponteiro de função para o tratamento das páginas. Dessa forma, podemos criar uma tabela de páginas e associar uma função de tratamento a cada uma delas:

Explicação do programa - (5) Troca de páginas - 2

Em seguida, criamos a tabela de páginas:

Explicação do programa - (5) Troca de páginas - 3

A constante MAX_WIDGETS_PER_PAGE define a quantidade de widgets cujos valores serão armazenados em cada página. Caso novos widgets sejam adicionados posteriormente, lembre-se de atualizar esse valor.

Por fim, a troca de páginas e o processamento dos widgets são tratados na função loop():

Explicação do programa - (5) Troca de páginas - 4

Quando a página atual _curPage é diferente da próxima página _nextPage, o flag de troca de página newPage é definido como true. Dessa forma, a função de tratamento da página identifica que é necessário realizar a inicialização. Vamos utilizar Page0 como exemplo:

Explicação do programa - (5) Troca de páginas - 5

Quando o parâmetro init é true, isso indica que acabamos de entrar na página. Nesse caso, definimos o valor de WIDGET_P0_BUTTON_NEXT como 0. Ao carregar uma nova página, o valor padrão do botão é 0. Queremos executar uma determinada ação — neste exemplo, mudar para PAGE_1 — somente quando o botão for pressionado, ou seja, quando seu valor passar de 0 para 1. Portanto, é necessário redefinir o valor para 0, pois ele pode ter sido alterado anteriormente para 1.

O Slider widget também é carregado inicialmente com o valor 0. No entanto, como o brilho pode ter sido ajustado anteriormente, é necessário restaurar o valor atual de brilho armazenado em _brightness.

Nos demais casos (quando init é false), os widgets são processados de acordo com as alterações em seus valores. Ao final, os valores de todos os widgets são armazenados para serem utilizados como referência no próximo ciclo de processamento.

Para definir a próxima página _nextPage, utilizamos a seguinte função:

Explicação do programa - (5) Troca de páginas - 6

Exceto na primeira execução, a função de tratamento da página verifica os valores dos widgets a cada ciclo. Quando detecta que o valor de um botão mudou de 0 para 1, a função abaixo é chamada para solicitar a troca de página:

Explicação do programa - (5) Troca de páginas - 7

(6) Graph Widget

O Graph widget permite representar graficamente os valores enviados a ele. Neste exemplo, utilizamos um potenciômetro conectado à entrada A0 para simular uma entrada analógica, e as variações dos valores são exibidas no Graph widget. Como a faixa de entrada analógica do Arduino é de 0 a 1023, enquanto o Graph widget aceita valores de 0 a 100, utilizamos a função map() para ajustar a faixa de valores.

O Graph widget foi projetado para atualizar a exibição somente quando o valor é alterado. Para obter um efeito de atualização periódica, podemos utilizar uma técnica simples: verificar o valor em intervalos regulares e, caso o novo valor seja igual ao valor lido anteriormente, fazer uma pequena alteração, somando ou subtraindo 1. Dessa forma, o Graph widget detecta uma mudança no valor e atualiza a exibição, criando um efeito de atualização dinâmica periódica.

Explicação do programa - (6) Graph Widget - 1

Conclusão

Com isso, concluímos a explicação deste programa de exemplo. Esperamos que o conteúdo ajude a compreender melhor as técnicas apresentadas. Este exemplo também pode ser utilizado como base para futuros projetos, contribuindo para reduzir o tempo de desenvolvimento. O programa completo está disponível para download no link a seguir: Modbus-MultiPageOperation no GitHub.

Para quem ainda não está familiarizado com a comunicação RS485 e o protocolo Modbus, recomendamos consultar também o artigo anterior: Introdução à RS485 para Smart Display.

Tem perguntas sobre as soluções de displays para a sua empresa? Entre em contato conosco!

Assinar

Receba e-mails sobre novas atualizações da Winstar

Entre em contato conosco

Preço/Ficha de dados/Consulta geral

Suporte técnico

Entre em contato conosco para qualquer informação técnica

go top
Contato
close

Valorizamos sua privacidade

Ao clicar em "Permitir todos os cookies", você concorda com o armazenamento de cookies no seu dispositivo para melhorar a navegação no site, analisar o uso do site e auxiliar nossos esforços de marketing e desempenho. Você pode encontrar mais informações sobre esse assunto em nossa política. Política de privacidade

Valorizamos sua privacidade

A Winstar e certos terceiros utilizam cookies no site www.winstar.com.tw. Os detalhes sobre os tipos de cookies, sua finalidade e as partes terceiras envolvidas estão descritos abaixo e em nossa Política de Cookies. Clique em “Permitir todos” para consentir o uso de cookies e obter a melhor experiência possível em nossos sites. Você também pode definir suas preferências ou rejeitar cookies (exceto os estritamente necessários).

Gerenciar preferências de consentimento

Sempre ativo
Cookies essenciais

Esses cookies são essenciais para permitir que você navegue pelo site e utilize seus recursos, como definir suas preferências de privacidade, fazer login ou preencher formulários.

Cookies de análise

Também conhecidos como "cookies estatísticos", esses cookies coletam informações sobre como você utiliza um site, como quais páginas você visitou e em quais links você clicou. Veja os detalhes.