Arduino – Como realizar um scroll no LCD 16×2, deixando uma linha fixa

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!

5/5 - (2 votos)

Related posts

Cooler com Arduino e pastilha termoelétrica TEC1-12706

by Arduino e Cia
10 anos ago

Display LCD 16×2 e Sensor de temperatura LM35

by Arduino e Cia
12 anos ago

Painel de senhas com Arduino

by Arduino e Cia
6 anos ago
Sair da versão mobile