Um leitor do site enviou uma pergunta hoje, sobre como realizar um scroll no LCD 16×2 ligado ao Arduino, mas apenas em uma linha. A outra ficaria estática.
A pergunta é aparentemente simples mas, ao pesquisar o assunto, vi que realizar o scroll em apenas uma linha envolve questões como mexer diretamente na memória do LCD e alterar (ou criar) bibliotecas.
Ao invés de usar uma biblioteca nova, por que não fazer isso utilizando a LiquidCrystal?
Essa é uma das bibliotecas mais básicas e utilizadas com Arduino, e já vem pré-instalada na sua IDE.
Como fazer o scroll no LCD 16×2 em apenas uma linha do display
Encontrei um colega lá da India (http://nishantarora.in/) que criou um programinha exatamente para isso.
Infelizmente resolvia apenas parte do problema: a linha inferior permanecia estática, mas a linha superior realizava o scroll uma única vez.
O que eu fiz foi alterar o código para que o scroll não só fosse realizado de forma ininterrupta, como também aceitasse qualquer tamanho de string que fosse colocada no programa. O resultado você pode ver no vídeo abaixo:
O circuito utilizado é o mesmo mostrado no post Display LCD Winstar WH1602A. O modelo do LCD é o WH1602A mas o programa funciona sem problemas em outros modelos de display 16×2, como o HD44780, que eu abordei neste artigo.
Além do LCD, usei como componente adicional um potenciômetro de 10 K para ajuste do contraste:
Abaixo, o programa utilizado para testes e mostrado no vídeo acima:
// Programa : Scroll LCD 16x2 apenas em uma linha
// Alteracoes e adaptacoes : Arduino e Cia
//
// Baseado no programa original de Nishant Arora
#include <LiquidCrystal.h>
//Inicializacao do display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//Configuracoes LCD 16x2
int screenWidth = 16;
int screenHeight = 2;
//String para as 2 linhas
//line1 = Scroll linha superior
String line1 = "Arduino e Cia, dicas, projetos e tutoriais: www.arduinoecia.com.br";
//line2 = Linha inferior - estatica
String line2 = " Arduino e Cia";
// just some reference flags
int stringStart, stringStop = 0;
int scrollCursor = screenWidth;
int tamanho =0;
void setup()
{
//Inicializacao do display
lcd.begin(screenWidth,screenHeight);
}
void loop()
{
lcd.setCursor(scrollCursor, 0);
lcd.print(line1.substring(stringStart,stringStop));
lcd.setCursor(0, 1);
lcd.print(line2);
//Quanto menor o valor do delay, mais rapido o scroll
delay(250);
scroll_sup(); //Chama a rotina que executa o scroll
//Verifica o tamanho da string
tamanho = line1.length();
if (stringStart == tamanho)
{
stringStart = 0;
stringStop = 0;
}
}
void scroll_sup()
{
lcd.clear();
if(stringStart == 0 && scrollCursor > 0)
{
scrollCursor--;
stringStop++;
} else if (stringStart == stringStop){
stringStart = stringStop = 0;
scrollCursor = screenWidth;
} else if (stringStop == line1.length() && scrollCursor == 0) {
stringStart++;
} else {
stringStart++;
stringStop++;
}
}
Basicamente o que o programa faz é calcular a posição do cursor, imprimir a string line1 na linha superior e a string line2 na linha inferior. Depois ele apaga a tela, calcula a nova posição do cursor e imprime novamente as duas strings.
E o procedimento vai se repetindo até que toda a string line1 seja mostrada na linha superior. Quando isso acontece, todo o processo é reiniciado.
Este é um código que pode ser melhorado, especialmente para retirar o efeito “piscar” da tela, causado pelo uso do comando lcd.clear(), mas que serve de base para o seu projeto. 🙂
Gostou? Confira outros posts com display LCD 16×2 aqui mesmo no Arduino e Cia!