Embedded

Comandos para controle do display Nextion

Já vamos para o quarto artigo sobre esse display e ainda assim outros virão devido à quantidade enorme de possibilidades que esse display oferece. É muito simples fazer a interface, assim como enviar comandos TTL para o display, mas ele oferece muito, muito mais do que isso. Conhecer os comandos para controle do display permitirá um projeto muito mais profissional e facilitará a distribuição do processamento.

Se não viu ainda, sugiro que dê uma olhada nos artigos anteriores relacionados:

Display Nextion com Arduino

Gif animado no display Nextion

Comunicação serial com Nextion sem biblioteca

Conceito da programação para o display

A primeira coisa que devemos ter em mente é que a programação para o display deve ser focada no controle da interface. Isto é, o que sai do display para o dispositivo que fará a interação (seja um linux embedded ou uma MCU) deve ser apenas o informativo. Não cabe ao display a decisão do que a MCU deve fazer, então, quando for programar o display, o foco deve ser a interface com o usuário. Claro que podemos fazer o cruzamento de informações para mandar à MCU apenas um resultado, cuja tomada de decisão do que fazer com esse resultado caberá à MCU. Podemos concatenar os valores de seleção de um LED RGB e enviá-los em uma única string, como 255,0,0,1 para o LED RGB 1 conectado à MCU. Após a seleção, o usuário clica em Enviar e o display coleta a informação e envia tudo. Mas podemos também ter condicionais a validar e então decidir “o quê” deve ir na mensagem para a MCU. Vamos começar então.

Comandos para controle de componentes e sistema

Refresh

Para fazer atualização de página, simplesmente chamamos o comando page seguido pelo ID da página a atualizar:

A página 0 é atualizada automaticamente quando o display é energizado.

Refresh de um widget

Quando queremos atualizar um widget específico apenas, chamamos o comando ref seguido pelo nome do componente:

Esse comando deve ser utilizado quando estiver carregando uma configuração manualmente. Se estiver acionando a interface pelo touch, o refresh será feito automaticamente. Os atributos que aparecem em verde no Nextion Editor são atualizados automaticamente. Os demais necessitam da interação através do comando ref.

Quando um componente é criado através do Nextion Editor, a atualização é feita automaticamente, mas se o carregamento for feito de modo manual, requererá o uso desse comando também. Se o componente estiver protegido, a mesma coisa.

Evento de “click” de um widget

Podemos também enviar o comando atuador de um botão, por exemplo. Para isso, utilizamos o comando click.

Congelar a atualização de tela

Não consigo imaginar quando isso pode ser realmente útil (talvez digitando uma senha), mas podemos interromper a atualização de tela até que um ciclo de eventos seja concluído. Para tal, utillizamos o comando ref_stop.

O toque no display continua responsivo, apenas não haverá exibição dos eventos. Do mesmo modo, o comando ref continua sendo funcional, pois a funcionalidade exclusiva de ref_stop é para a atualização de tela.

Retomar a atualização de tela

Então, tendo concluído o que desejou fazer de forma oculta, utiliza-se o comando ref_star para retomar a atualização de tela.

Esse comando só deve ser utilizado se previamente foi chamado o comando ref_stop.

Pegar o valor de um widget

Se quiser obter o valor contido em um widget da interface, utilize o comando get. Por exemplo:

O retorno para string é 0x70+ASCII+0xFF 0xFF 0xFF. Quando o valor for numérico, o retorno é 0x71+4 Bytes de dado binário + 0xFF 0xFF 0xFF. Como citei em um ou dois artigos anteriores, a finalização de mensagem é sempre 0xFF 0xFF 0xFF.

Pegar o ID da página corrente pela UART

Se precisar saber em qual página o display está, utilizamos o comando sendme.

Para enviar automaticamente o valor de página em seu carregamento, esse comando pode ser incluído no evento da página pelo Nextion Editor, assim, toda a vez que a página for trocada, o primeiro comando enviado é a página e a controladora terá sempre ciência do conteúdo do display.

Converter um valor numérico para texto a ser inserido em um label

Esse comando é bem legal. É normal que atualizemos um label enquanto deslizamos um slider. O slider usa variável int para guardar o valor, por isso é necessário converter esse valor para seu correspondente char. Podemos fazer uma subtração ou simplesmente utilizar o comando cov para converter e atribuir automaticamente:

Do mesmo modo, é possível atribuir o valor de um label ao slider, apenas invertendo a ordem. Se origem e destino forem do mesmo tipo, a conversão falhará.

Calibração do display

Caso seja necessário, basta chamar o comando touch_j. Duvido que seja necessário porque o display já vem calibrado.

Substring

É o mesmo comando que utilizamos em C, mas no formato próprio para o display:

Exibir ou esconder um widget na página

Quando desenho interfaces, gosto de ocultar componentes que não fazem parte de um contexto, até que seja necessário dispô-lo. Isso deixa a interface mais intuitiva e reduz a chance de tomada de decisão errada por parte do usuário. Para fazer esse controle no display, utilizamos o comando vis:

Se utilizarmos como primeiro parâmetro o valor 255, todos os widgets da página atual serão afetados pelo comando.

Desabilitar ou habilitar o touchscreen

Podemos querer aguardar que a MCU retorne um status para a tela e às vezes isso pode levar um tempo, seja lá qual for a razão. O usuário, como sempre, é a parte mais problemática de um projeto. Para evitar que ele pratique piano no display e fique enviando comandos para todos os lados, podemos desabilitar o touch até que a MCU retorne a resposta de uma solicitação. Para isso, utilizamos o comando tsw:

Do mesmo modo, para desabilitar a interação com todos os widgets da página atual, podemos utilizar o valor 255 como primeiro parâmetro.

Desabilitar a execução de instruções advindas da UART

Não sei se consigo enumerar as razões para essa necessidade, mas é outro recurso que acho incrível nesse display. Para interromper a interação remota, utilizamos o comando com_stop.

O dispositivo continuará recebendo e armazenando no buffer, até que receba o comando com_star. Então o display executará os comandos enfileirados no buffer.

Gerar um valor randômico

Para gerar um valor randômico, utilizamos o comando randset seguido pela faixa de valor desejada. Por exemplo:

Essa range permanece até que o dispositivo seja reiniciado.

Limpar os comandos armazenados no buffer

Mais acima vimos um comando que interrompe a execução de comandos advindos da UART. Se desejarmos limpar o buffer invés de retomar a execução após a retomada do fluxo normal, utilizamos o comando code_c.

Pegar um valor de um widget em seu tipo natural

Se for uma string, retornará o valor em ASCII, se for numérico, retornará o valor ASCII em hexa. O comando é o print. A diferença do printget é que o comando get retorna um identificador como supracitado e o comando print não.

Enviar dados em hexa

Para tal, utilizamos o comando printh:

Não será mostrado no emulador do Nextion Editor, é executado apenas no display. Os caracteres devem ser separados apenas por 1 espaço, não utilize vírgula.

Adicionar dados ao widget Waveform

O formato é simples e o componente não requer explicação:

O widget Waveform tem apenas 8 bits, portanto sua faixa vai de 0 à 255.

Cada página suporta até 4 widgets Waveform e cada um deles suporta até 4 canais. Ele também suporta pass through de dados. O widget fará o auto-fluxo e exibirá os valores no display. Também é permitido modificar atributos de background e cores de frente e fundo para cada canal durante o fluxo.

Passar um volume de dados ao widget Waveform

O formato é addt objid, ch, qty. O primeiro parâmetro objid é o ID do componente. O parâmetro ch é o número do canal e qty é a quantidade de pontos de dados.

O máximo de dados que pode ser passado é 1024 bits. O dispositivo se tornará irresponsivo até que seja concluída a transferência dos valores. Após 5ms é enviado o dado 0xFE 0xFF 0xFF 0xFF ao usuário e iniciará o envio dos pontos, em hexa. Não haverá atualização de tela até o fim da transferência de dados.

Limpar os dados do widget Waveform

Dispensa explicações.

Reset do Nextion

Forçar atualização imediata da tela

Esse loop pode ser útil para fazer atualização de tela durante um evento de longa duração, colocando, por exemplo, um contador na tela ou um progressbar.

Comprimento de uma string

Como em C, strlen.

A origem deve ser do tipo string e o destino deve ser do tipo numérico.

if

A condicional tem o seguinte formato:

Também podemos usar  else if.

Os operadores válidos para valores numéricos são <,>,==,!=,<=,>=.

Caracteres e strings suportam ==,!=.

Comparação de operações não são permitidos. Por exemplo:

Parênteses não devem conter espaços.

while

Qualquer operação que requeira tempo tornará o display irresponsivo, incluindo os eventos de tela. Usando doevents forçará a atualização de tela.

Durante um evento desses, o dispositivo se torna irresponsível ao toque, os comandos seriais serão armazenados no buffer e executados apenas após a finalização do loop. Deve-se tomar todo o cuidado do mundo para não haver a possibilidade de um loop infinito, senão…

for

As condições são as mesmas.

Vou deixar a parte de desenho da GUI para o próximo artigo. Espero que essa repassada da documentação lhe seja útil como está sendo para mim.

Comandos para controle do Display Nextion - Bolsonaro 17

Onde adquirir

Essa belezinha está disponível no parceiro MASUGUX, aproveite que estamos no começo dos tutoriais e vamos tocando juntos os projetos! Vi que as pessoas tem se interessado muito na versão de 4.3″, mas a 3.2″ (a que estou utilizando para escrever esses artigos) é extremamente satisfatória e se for para uso pessoal, está bem mais em conta, dê uma checada nos dois modelos.

Versão 3.2″

Versão 4.3″

Não perca o próximo tutorial, já teremos video e brincadeiras!

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR

https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR

https://www.facebook.com/groups/raspberrybr/
Orange Pi BR

https://www.facebook.com/groups/OrangePiBR/
Odroid BR

https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR

https://www.facebook.com/groups/SistemasEmbarcadosBR/

Sistemas Eletrônicos

https://www.facebook.com/groups/544679592355388/

Projetos Arduino | Eletrônica

https://www.facebook.com/groups/projetosarduinoeletronica/

ESP8266 e ESP32

https://www.facebook.com/groups/ESP8266BR/

ARM Brasil

https://www.facebook.com/groups/508153815944410/

MIPS BR

https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte

https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!