Dominando os comandos do LCD no arduino: otimização de código!
Hoje, vamos aprender, de maneira sucinta, como integrar corretamente um display LCD ao seu projeto com Arduino a partir da biblioteca LiquidCrystal.h. A princípio, é algo simples de ser feito, basta apenas utilizar os comandos da biblioteca e, assim, temos o nosso display integrado ao nosso projeto. No entanto, isto pode se tornar um problema, sobretudo, em aplicações sensíveis ao tempo de execução do programa. Ao escrever um programa, para um microcontrolador, é preciso que você nunca se esqueça de manter o seu programa o mais rápido possível. No ambiente Arduino, a função void loop( ) é aquela que, devemos concentrar nossos esforços, no sentido de executá-la o no menor tempo possível. Lembre-se de evitar usar delay() em sem código, pois, se trata de uma função que bloqueia o microcontrolador, no lugar use millis().
Neste sentido, vamos apresentar a você leitor, algumas boas práticas de programação ao utilizar um display LCD baseado no controlador HD44780.
Primeira otimização: Gestão de memória RAM, a macro F()
Normalmente, para os projetos com display LCD, em sua maioria, utilizamos algumas palavras para comunicar com o usuário, por exemplo, em um termo higrômetro, teríamos certamente as palavras temperatura e umidade.
Simples, basta chamar a função print() e passar como argumento a nossa palavra entre aspas duplas.
lcd.print(“Temperatura”);
Ao fazermos isto, o compilador do Arduino irá armazenar a função e a palavra na memória flash do microcontrolador, até aqui, tudo bem. Mas quando o microcontrolador entrar em funcionamento essa informação também será alocada na memória SRAM. Perceba que, isto é um desperdício da preciosa memória SRAM. Uma vez que, o processo de escrita nos displays de LCD é inúmeras vezes mais lento do que a leitura de memória flash do microcontrolador.
Felizmente, existe uma macro que nos ajuda a contornar esse problema. A macro F() diz ao compilador AVR-GCC, para que a palavra ou texto fique apenas na memória flash do microcontrolador. Lembre-se que os microcontroladores possuem memória SRAM limitada, a título de exemplo o Arduino UNO que utiliza o microcontrolador AtMega 328p, possuí apenas 2Kbytes de SRAM, repare que é uma quantidade pequena de memória RAM, logo, você sempre deve se atentar com o uso dela.
lcd.print(F(“Temperatura”));
E, esta, é a maneira com que devemos utilizar a F() macro.
Escrevendo no LCD somente quando for necessário.
Uma característica interessante dos displays LCD, baseados no controlador HD44780, é que após enviar um caractere, palavra ou frase ao display, essa informação permanecerá escrita na tela. Logo, se no seu projeto, algum caractere ou palavra permanece de maneira constante na tela, não há a necessidade de a cada iteração da função void loop() que essa informação seja enviada novamente ao LCD.
Por exemplo, o trecho de código abaixo, escreve desnecessariamente a string “Temperatura:” a cada iteração da função void loop().
void setup() { } void loop() { // função que lê a temperatura em um sensor e armazena na variável temp. int temp = LeTemperatura(); lcd.serCursor(0,0); lcd.print(F(“Temperatura:”)); //constante lcd.setCursor(12,0); //variável, depende da temperatura medida no sensor. lcd.print(temp); }
Repare que, a única informação que irá variar no display, é o valor da temperatura. Portanto, podemos escrever esse código, passando a escrita da string “Temperatura:” para função void setup( ), lembre-se de que a função setup só é executada apenas uma vez ao ligar o seu Arduino.
void setup() { lcd.serCursor(0,0); lcd.print(F(“Temperatura:”)); //constante } void loop() { // função que lê a temperatura em um sensor e armazena na variável temp. int temp = LeTemperatura(); lcd.setCursor(12,0); //variável, depende da temperatura medida no sensor. lcd.print(temp); //busque uma alternativa ao uso dos delays, pesquise sobre delays com a função millis(). delay(1000); }
A princípio, pode não parecer algo tão relevante. No entanto, lembre-se que cada operação de escrita no LCD consome tempo e isto poderá acarretar problemas num projeto que requer uma alta velocidade de execução do programa. Como, por exemplo, o controle de motores de passo. Apresentamos aqui, uma única maneira de fazer com que uma string, seja enviada ao display uma única vez. Caso não seja possível fazer deste modo, lembre-se de recorrer ao uso de funções, condicionais e flags. Observe o próximo exemplo, utilizando um condicional e uma flag.
void setup() { } void loop() { //uma flag é utilizada para sinalizar um evento, para tanto utilizamos uma variável do tipo boolean(verdadeiro ou falso) static boolean flag = true; if(flag){ lcd.setCursor(0,0); lcd.print(F("Temperatura")); flag = false; } //variável, depende da temperatura medida no sensor. int temp = LeTemperatura(); lcd.setCursor(12,0); lcd.print(temp); //busque uma alternativa ao uso da função delay(), pesquise sobre delays com a função millis(). delay(1000); }
Neste exemplo, asseguramos que a string “Temperatura:” seja escrita no display uma única vez, dentro da função void loop().
Um problema recorrente entre os iniciantes, como escrever corretamente uma variável numérica.
Vamos supor que em um projeto, precisamos mostrar um valor que está variando ao longo do tempo, por exemplo, um valor numérico entre 0 e 15.
Para escrever no LCD um valor entre 0 e 9, necessitamos apenas de um caractere, já para um valor de 10 a 15 precisamos de 2 caracteres. Agora, imagine, esse valor numérico variando em seu display LCD. Em uma determinada condição, ocorrerá um bug.
Isto é, quando número atual for maior ou igual a 10, e próximo número a ser impresso, for menor ou igual a 9. Simplesmente, o segundo digito do número anterior irá permanecer impresso, criando uma grande confusão. Lembre-se, qualquer caractere impresso no LCD persiste, como explicado no início deste artigo. Portanto, é necessário, implementar um pequeno trecho de código para corrigir este problema.
A ideia é, a cada vez que, você for imprimir um número no LCD. Antes, verifique o valor deste número, se for uma unidade (entre 0 e 9), então, escrevemos um caractere em branco no próximo caractere do display. Observe o código que faz isso:
lcd.setCursor(0,1); lcd.print("Numero:"); lcd.setCursor(7,1); lcd.print(numero); if(pos<=9){ lcd.setCursor(8,1); lcd.print(" "); }
Observe que ao verificar essa condição com if( ), eliminamos esse pequeno bug. Lembre-se que, neste artigo, apresentamos apenas um único caso. Por tanto, você deve seguir esse raciocínio, e então implementar uma lógica para quando mudarmos, por exemplo, o número impresso 100 para 99 Do contrário, irá aparecer erroneamente o número 990 no display. Lembre-se também de implementar essa lógica para números negativos.
Não deixem de tirar dúvidas com a gente, é só enviar na seção de comentários. Aguardem os próximos posts da @moduloeletronica aqui no nosso blog!
Rafael Valsani Leme Passos
Sobre o autor: Rafael Valsani Leme Passos é técnico em eletrônica pela ETEC Bento Quirino e graduando em Engenharia de Alimentos pela Universidade Estadual de Campinas.
VEJA TAMBÉM
Regador automático de plantas com Arduino
Aprenda neste artigo, como automatizar a rega de suas plantas, utilizando o Arduino NANO. Este projeto, além do baixo custo, pode ser montado em menos de uma hora e irá garantir que as suas plantas sempre tenham água disponível, garantido um crescimento adequado e...
Datalogger com cartão SD. Registre: temperatura, umidade, luminosidade e tensão)
Neste post, vamos aprender a como montar datalogger, para registrar em um cartão SD, temperatura, umidade relativa, tensão e nível de luminosidade. Esse tipo de dispositivo é extremamente útil para fazer análises de fenômenos que dependem do tempo. Por exemplo,...
Fita de LEDs RGB endereçáveis WS2812B e a biblioteca fastLED
No post de hoje, vamos conhecer a fita de LEDs WS2812B endereçáveis e como utilizá-la com o Arduino UNO. Essa fita de LEDs se destaca, em relação as outras do mercado, pelo fato de que seus LEDs podem ser controlados de maneira individual, permitindo que o...
NEWSLETTER
Assine nossa newsletter e receba as novidades.
0 comentários