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
-
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
#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.. ;)
-
agora só falta um videoxito :)
Mas parece bem.
-
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:
#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)
-
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)
-
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??
-
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ó..
-
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 :)
-
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..
-
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)
-
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...
-
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)..
-
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...
-
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.
#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() {
}
-
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.
-
ahh ok :)
então este em 100 vezes melhor!!
mas não podia fazer mesmo mais nada nada nada?
-
tu kd fazes um delay no código o processador simplesmente pára à espera k esse tempo termine.. kd terminar segue prá linha seguinte..
-
fica então o vídeo.. ;)
LCD scrolling text (http://www.youtube.com/watch?v=K12EsVdRT94#lq-lq2-hq)
-
Sim senhor... quando temos uma máquina de café?! :P
-
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
-
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..
-
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...
-
é 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..
-
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.
-
ruisilva, aqui tens o que krias:
#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..
-
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.
-
de nd..