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!