LusoRobótica - Robótica em Português

Robótica => Projectos de robótica => Projectos Concluídos => Tópico iniciado por: ricardo-reis em 12 de Julho de 2009, 17:06

Título: LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 12 de Julho de 2009, 17:06
Bem, pessoal.. A pedido de várias famílias, e com uns toques de outras tantas, venho cá postar um exemplo simples de como pôr o texto dos vossos lcds a rodar no ecrã:

Código Actualizado
Código: [Seleccione]
#include <MsTimer2.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int i=16;
char teste[35] = "abcd";   // arrays de caracteres de tamanho máximo recomendável de 412 caracteres
char aux[35] = "";                             // de forma a que estes sejam impressos sem qualquer tipo de problema

void escreve() {
  lcd.clear();
  if(i==0){
    if (teste!=aux){
      for(int a=0; a<sizeof(teste); a++){
        aux[a] = teste[a];
      }
    }
  }
  if(i<0){
    for(int a=0; a<sizeof(aux); a++){
      aux[a] = aux[a+1];  
    }
    lcd.setCursor(0,0);
    lcd.print(aux);
    if(aux[0]=='\0'){
      i=16;
    }
  }
  else{
    lcd.setCursor(i,0);
    lcd.print(teste);
    i--;
  }
}
void setup() {
  analogWrite(6,80);  // isto serve para quem tem o pino 6 do arduino ligado ao pino que regula o contraste do lcd
  MsTimer2::set(250, escreve);  // 250 é o tempo em ms.. se quiserem ter o texto a rodar mais depressa diminuam o tempo, se quiserem mais devagar aumentem..
  MsTimer2::start();
}

void loop() {
}

com isto, e sem nenhum outro recurso a hardware podem pôr arrays de 412 caracteres a passar no vosso lcd.. (isto numa linha, conforme o exemplo, se quiserem nas duas terão que dividir o valor).
se os vossos projectos forem mais exigentes a nível de caracteres, podem sempre pensar em aplicar o tutorial do tr3s, que vos ensina a interagir entre arduino e eeproms, que podem encontrar aqui (http://lusorobotica.com/index.php/topic,461.0.html).

alguma sugestão correcção será bem vinda..
(bem como os vossos videos, já que eu n tenho como postar aqui um)

ps: ainda faço referência à possibilidade de, para quem isso interessar, poder controlar o shift do lcd, que permite fazer o scroll do texto que está no lcd. este tem a capacidade para 80 caracteres, como diz o datasheet. para fazer uso deste shift: lcd.command(24);

pss: agradeço também a disponibilidade do metRo_ e do Tr3s que me deram umas dicas sobre isto.. ;)
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: metRo_ em 12 de Julho de 2009, 18:19
agora só falta um videoxito :)
Mas parece bem.
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: tcustodio em 12 de Julho de 2009, 18:20
na libraria LCD4bit, já existem funções pré definidas para o scroll de texto :P

mas por acaso também gosto mais da Liquid Crystal, acho-a mais "madura"

na cpp da LCD4bit está este código:
Código: [Seleccione]
#define CMD_LEFT 0x18

void LCD4Bit::leftScroll(int num_chars, int delay_time){
  for (int i=0; i<num_chars; i++) {
    commandWrite(CMD_LEFT);
    delay(delay_time);
  }
}

parece-me remeter para o tal shift interno do lcd

tenho que experimentar esse teu código. Isto era giro era com um ecrã 20x4  8)
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: tcustodio em 12 de Julho de 2009, 18:24
e por falar em ecrãs 20x4  8)

http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=370228361021&ssPageName=MERCOSI_VI_ROSI_PR4_PCN_BIX_Stores&refitem=370227953936&itemcount=4&refwidgetloc=closed_view_item&refwidgettype=osi_widget&_trksid=p284.m263&_trkparms=algo%3DSIC%26its%3DI%252BC%252BP%252BS%252BIA%26itu%3DUCI%252BIA%252BUA%252BFICS%252BUFI%26otn%3D4%26ps%3D10 (http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=370228361021&ssPageName=MERCOSI_VI_ROSI_PR4_PCN_BIX_Stores&refitem=370227953936&itemcount=4&refwidgetloc=closed_view_item&refwidgettype=osi_widget&_trksid=p284.m263&_trkparms=algo%3DSIC%26its%3DI%252BC%252BP%252BS%252BIA%26itu%3DUCI%252BIA%252BUA%252BFICS%252BUFI%26otn%3D4%26ps%3D10)

blue backlight, e usa o hd44780
$10.8 (~7.75€)
com portes grátis para portugal  8)
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: amando96 em 12 de Julho de 2009, 18:43
e por falar em ecrãs 20x4  8)

http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=370228361021&ssPageName=MERCOSI_VI_ROSI_PR4_PCN_BIX_Stores&refitem=370227953936&itemcount=4&refwidgetloc=closed_view_item&refwidgettype=osi_widget&_trksid=p284.m263&_trkparms=algo%3DSIC%26its%3DI%252BC%252BP%252BS%252BIA%26itu%3DUCI%252BIA%252BUA%252BFICS%252BUFI%26otn%3D4%26ps%3D10 (http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=370228361021&ssPageName=MERCOSI_VI_ROSI_PR4_PCN_BIX_Stores&refitem=370227953936&itemcount=4&refwidgetloc=closed_view_item&refwidgettype=osi_widget&_trksid=p284.m263&_trkparms=algo%3DSIC%26its%3DI%252BC%252BP%252BS%252BIA%26itu%3DUCI%252BIA%252BUA%252BFICS%252BUFI%26otn%3D4%26ps%3D10)

blue backlight, e usa o hd44780
$10.8 (~7.75€)
com portes grátis para portugal  8)

próxima compra conjunta? ;D
e já agora, como se faz para o texto ir da esquerda para a direita??
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 12 de Julho de 2009, 19:08
e já agora, como se faz para o texto ir da esquerda para a direita??

em vez de começar na posição 16 deve passar a começar da posição 0 ou -1, em vez de decrementares o i, incrementas, em vez de apagar a primeira posição do array aux passas a apagar a ultima.. assim de repente é só..
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: amando96 em 12 de Julho de 2009, 19:23
e já agora, como se faz para o texto ir da esquerda para a direita??

em vez de começar na posição 16 deve passar a começar da posição 0 ou -1, em vez de decrementares o i, incrementas, em vez de apagar a primeira posição do array aux passas a apagar a ultima.. assim de repente é só..

ahh ok ok, eu procurei algo no código, mas não pensei que fosse isso, até puz 1250, em vez de 250 :P


se a lguem comprar uns daqueles LCD's de 4X20 char, peça mais um pra mim se faz favor :)
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 12 de Julho de 2009, 19:27
como eu digo no comentário ao 250, alterar aquele valor só altera o tempo de rotação do texto.. um valor mais baixo e o texto anda mais depressa, um valor mais alto e o texto anda mais devagar..
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: tcustodio em 12 de Julho de 2009, 19:52
se a lguem comprar uns daqueles LCD's de 4X20 char, peça mais um pra mim se faz favor :)

se eu comprar, aviso-te  8)
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: amando96 em 12 de Julho de 2009, 21:23
ok obrigado :)


tenho uma questão, não me lembro onde, mas vi esse código já noutro local...

mas só tinha 6 fios ligados ao arduino... como? porque? era o mesmo LCD...
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 12 de Julho de 2009, 21:46
este código n deves ter visto (pk é meu e só o postei aqui), mas se viste, podes dizer onde e quando..


quanto aos 6 fios, é mt simples.. eu tenho 8, dos quais posso tirar um, que é o do contraste e ligá-lo a vcc com uma resistencia ou potenciometro, e o 11 (se n tou em erro) que podes ligar a gnd (confirma no outro topico)..
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: amando96 em 12 de Julho de 2009, 21:49
está aí
http://arduino.cc/en/Tutorial/LiquidCrystalScroll (http://arduino.cc/en/Tutorial/LiquidCrystalScroll)

mas agora que olhei com olhos de ver, reparei que é diferente...
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 12 de Julho de 2009, 21:51
pessoal, quem está a usar o código aqui postado, passem a usar esta versão que apresento neste post.

só acrescentei uma linha, mas que permite ao lcd limpar a ram. reparei que ele passado algum tempo se começava a baralhar e a imprimir coisas fora do sítio.

Código: [Seleccione]
#include <MsTimer2.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int i=16;
char teste[35] = "abcd";   // arrays de caracteres de tamanho máximo recomendável de 412 caracteres
char aux[35] = "";                             // de forma a que estes sejam impressos sem qualquer tipo de problema

void escreve() {
  lcd.clear();
  if(i==0){
    if (teste!=aux){
      for(int a=0; a<sizeof(teste); a++){
        aux[a] = teste[a];
      }
    }
  }
  if(i<0){
    for(int a=0; a<sizeof(aux); a++){
      aux[a] = aux[a+1];  
    }
    lcd.setCursor(0,0);
    lcd.print(aux);
    if(aux[0]=='\0'){
      lcd.print("                ");
      i=16;
    }
  }
  else{
    lcd.setCursor(i,0);
    lcd.print(teste);
    i--;
  }
}
void setup() {
  analogWrite(6,80);  // isto serve para quem tem o pino 6 do arduino ligado ao pino que regula o contraste do lcd
  MsTimer2::set(250, escreve);  // 250 é o tempo em ms.. se quiserem ter o texto a rodar mais depressa diminuam o tempo, se quiserem mais devagar aumentem..
  MsTimer2::start();
}

void loop() {
}
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 12 de Julho de 2009, 21:54
está aí
http://arduino.cc/en/Tutorial/LiquidCrystalScroll (http://arduino.cc/en/Tutorial/LiquidCrystalScroll)

mas agora que olhei com olhos de ver, reparei que é diferente...

ok.. fui lá ver o código e explico-te por alto as diferenças essenciais:

no que eu apresentei, é usada a mstimer2, que vos permite que o programa continue a executar sem parar..
no que está nesse link, são usados os delays, que páram a execução de código, pelo tempo do delay, não permitindo que seja executado mais nada.
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: amando96 em 12 de Julho de 2009, 22:02
ahh ok :)

então este em 100 vezes melhor!!

mas não podia fazer mesmo mais nada nada nada?
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 12 de Julho de 2009, 22:12
tu kd fazes um delay no código o processador simplesmente pára à espera k esse tempo termine.. kd terminar segue prá linha seguinte..
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 12 de Julho de 2009, 23:29
fica então o vídeo.. ;)

LCD scrolling text (http://www.youtube.com/watch?v=K12EsVdRT94#lq-lq2-hq)
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: TigPT em 12 de Julho de 2009, 23:34
Sim senhor... quando temos uma máquina de café?! :P
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 12 de Julho de 2009, 23:37
lol.. primeiro ainda há um graande pormenor a corrigir.. frases longas passam a ocupar a linha seguinte, o que n é o ideal para o que se pretendia..

por acaso este lcd lembra-me o da máquina de snacks lá do departamento.. :D
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 13 de Julho de 2009, 04:47
bem, em relação ao meu post anterior, onde dizia que havia um problema com as strings grandes, é de fácil solução.. dá pra mandar imprimir o que quer que seja na linha anterior, ou no caso de estarem a imprimir na primeira linha o array, dá pra imprimir na linha seguinte, sejam espaços em branco, seja o que fôr.. que sobrepõe..

se por acaso encontrarem mais algum problema digam..
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ruisilva em 14 de Julho de 2009, 15:41
Já agora, e devo-vos dizer que me tem divertido imenso esta coisa do leftscrool ou coisa parecida, será que alguem sabe como se poderá fazer a "escrita" tipo matrix, e refiro-me ao filme, aparecer num  lcd?!?!?!?

Eu já o fiz mas não nesta plataforma e nem se quer utilizava hardware, mas sim um simples portatil 385 a 12Mhz e tudo feito no MS-DOS....

Acho que devia ser bonito transpor o que se fazia na velha guarda para as tecnologias de agora, mas não sei nada de programação, a não ser o que tenho experimentado e aprendido com todos os utilizadores deste  MAGNIFICO forum que é  a LUSOROBOTICA. Por favor, não me julguem da minha ignorancia, este foi e será o local virtual onde mais aprendi até aos dias de hoje dentro da area da robotica, electrónica e afins que englobam este mundo.

Acho que seria uma "coisa" engraçada de se fazer, caso seja possivel... é que ideias não me faltam, mas, concretizalas, isso e que é o meu maior dezafio...
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 14 de Julho de 2009, 15:51
é possível sim.. mas referes-te a texto aleatório a aparecer?

é possível e bastante simples..

basta criar aleatóriamente uma string (até tens os caracteres chineses no lcd e tudo) e imprimi-los na posição 0,0 do lcd.

dps o k precisas pra pôr o texto a rodar de cima pra baixo: copiar essa string pra uma auxiliar, imprimi-la na posição 0,1 e dps continuar no passo anterior.. gerar string, imprimir na 0,0.. e assim sucessivamente..

eu kd acabar o k ando a fazer dps faço-te um exemplo disso..
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ruisilva em 14 de Julho de 2009, 21:52
ricardo-reis, fico muito agradecido pela disponibilidade, e, cá aguardo então a sua sugestão, a ver se aprendo mais alguma coisa, e é claro que com todos os utilizadores do LUSOROBOTICA à sempre motivos para se aprender.
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 15 de Julho de 2009, 02:34
ruisilva, aqui tens o que krias:

Código: [Seleccione]
#include <MsTimer2.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int vector[16];
int aux[16];

void escreve() {
  lcd.clear();
  lcd.setCursor(0,0);
  for(int i=0;i<16;i++){
    vector[i]=random(30);
  }
  for(int i=0;i<16;i++){
    lcd.write(vector[i]);
  }
  lcd.setCursor(0,1);
  for(int i=0;i<16;i++){
    lcd.write(aux[i]);
  }
  for(int i=0;i<16;i++){
    aux[i]=vector[i];
  }
}
void setup() {
  analogWrite(6,80);  // isto serve para quem tem o pino 6 do arduino ligado ao pino que regula o contraste do lcd
  MsTimer2::set(500, escreve);  // 500 é o tempo em ms.. se quiserem ter o texto a rodar mais depressa diminuam o tempo, se quiserem mais devagar aumentem..
  MsTimer2::start();
}

void loop() {
}

se precisares d'algum comentário ao código, apita..

ps: n sei qual é a expectativa que tens acerca disto quando o idealizaste, mas num lcd de duas linhas n se pode esperar grande resultado..
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ruisilva em 16 de Julho de 2009, 02:47
Muito obrigado pela ajuda.... assim que me for possivel, vou experimentar a ver se dá para me rir mais um pouco e aprender mais um pouco de programação.

Título: Re:LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL
Enviado por: ricardo-reis em 16 de Julho de 2009, 03:01
de nd..