Utlilizando o Display LCD com Arduino

WP_20140418_10_32_53_Pro

Um módulo muito comum nesses kits do Arduino é o display LCD, mas seu uso não é tão simples. Nesse tutorial você vai aprender a utilizá-lo e, ao final do post,  a montar um joguinho onde um participante insere uma palavra ou frase no terminal pelo PC e o outro participante deve adivinhar a palavra inserida a partir da palavra bagunçada aleatoriamente que aparece no LCD .

Lista de Componentes:

Arduino(Uno, Mega, Nano… não importa o modelo).

Display LCD 16×2.

Resistor de 1KΩ.

Potenciômetro de 10KΩ.

Jumpers.

1 – Montagem.

A montagem é simples, você pode ver na figura baixo.

O potenciômetro de 10KΩ é muito importante, e não pode ser dispensado, você pode montar todo o projeto e não ver os caracteres se ele não estiver presente ou mal conectado, pois sua função é regular o contraste do LCD.

O resistor de 1KΩ é usado para diminuir a corrente no LED de iluminação background do LCD, alguns LCDs não possuem esse background e os pinos A e K.

Entendendo como a biblioteca funciona.

A biblioteca usa o LCD em modo de 4 bits, o que quer dizer que são necessários apenas quatro fios para enviar os caracteres(8 bits) ao LCD de D4 a D7.  Se você estudou barramentos em microprocessadores, sabe que para se pegar um dado de 8 bits por um barramento de 4 bits são necessários dois acessos(Tá bom, é meio lógico), porém essa diferença de velocidade entre quando se usa 8 bits e 4 bits é imperceptível para nossos olhos.

Os Pinos RS e ENABLE, selecionam se o LCD vai receber um comando(setar o cursor, limpar) ou caractere(a, b , #…) e se vai estar ativo ou inativo respectivamente.

A biblioteca se encarrega de toda essa parte de baixo nível, deixando mais fácil a utilização do LCD, além de nos deixar quatro pinos livres do Arduino para outras aplicações.

2 – Código

O primeiro código está nos exemplos da biblioteca LiquidCrystal que já vem no software Arduino, então você não precisa baixá-la, use-o para testar se sua montagem está correta, depois, caso queira, edite-o ao seu gosto.

 /*This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
}

 

O segundo código, também é dos exemplos da biblioteca LiquidCrystal,  e escreve no LCD o que o usuário digitar no terminar serial do Arduino.

Para abrir o terminal serial clique no ícone da lupa na IDE do Arduino.Clique no ícone da lupa para abrir o terminal serial do Arduino.

Screen Shot 04-17-14 at 08.20 PM
Clique no ícone da lupa na IDE do Arduino para abrir o terminal serial .

 

/*This example code is in the public domain.

 http://arduino.cc/en/Tutorial/LiquidCrystalSerial
 */
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(){
    // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // initialize the serial communications:
  Serial.begin(9600);
}

void loop()
{
  // when characters arrive over the serial port...
  if (Serial.available()) {
    // wait a bit for the entire message to arrive
    delay(100);
    // clear the screen
    lcd.clear();
    // read all the available characters
    while (Serial.available() > 0) {
      // display each character to the LCD
      lcd.write(Serial.read());
    }
  }
}
WP_20140418_11_03_15_Pro
Abra o terminal serial e digite algo para ver no LCD

 

3 – Bônus.

Usando o mesmo circuito e mudando adicionando apenas um botão e um resistor de 10KΩ, você pode criar um dispositivo capaz de bagunçar uma cadeia de caracteres inseridos pelo computador. Afinal! Quem não precisa hoje de um dispositivo que bagunce strings? Uma possibilidade seria usá-lo para uma espécie de jogo onde alguém insere a frase ou palavra pelo PC e dá uma dica talvez, e outro alguém tenta adivinhar qual palavra foi bagunçada.

A montagem é quase a mesma, como disse, basta apenas adicionar um resistor e um push button.

Screen Shot 04-17-14 at 05.36 PM
A mesma ligação, apenas adicione o botão e o resistor.

 

A variável  dificultlevel pode ser aumentada ou decrescida de acordo com a dificuldade que você queira, quando maior o valor mais trocas haverão; quando seu valor é zero não há trocas de lugares, fazendo o mesmo que o código anterior.

Já ouviu aquela história sobre uma universidade inglesa que pesquisou que não importa em que ordem as letras de uma palavra estão desde que a primeira e a última estejam  no lugar certo?… blá blá blá… e que isso se dá ao fato de nosso cérebro ler a palavra como um todo?

 

 As nsobaelus são nuvnes de peoria, hdgnoeriio e pslama. São canstnementote  rgeõies de fraãomço ealetsr, cmoo a noeslbua da Áigua . Etsa nbouelsa froma uma das mias bleas e foasmas ftoos da NSAA, “Os Prliaes da Caçrião” .

E ai? deu pra ler? Não sei  se é um bom exemplo por que eu que fiz, esse trecho foi tirado da página da Wikipédia sobre nebulosas. Ah sim! A variável activeryeasymode serve pra isso, quando seu valor é ‘1’(um), faz com que as primeira e última letras não sejam trocadas, se quiser tentar no hard mesmo mude-a para ‘0’(zero).

/***********************
|LCD string game
|Written by Robson Couto April, 17,2014
|***********************/
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char string[16];// string to be changed
char stringNormal[16];//string to be keeped
int p[]={16,16,16};//position of the spaces is the string
int i=0,n=0,m=0,c=0,dificultlevel=6,c1=0;//i,n and m are counters and c is the number of characters in the serial buffer
char aux;//variable used to keep values while changing places in the array string[]
const int buttonPin = 9; //pin of the button
int buttonState = 0,brk=0; // state of the button and variable to prevent that the string be written in the LCD many times.
int activeryeasymode=1;// 1-the fist and the last letters aren't changed,0-the first and the last letters can be changed
void setup(){
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // initialize the serial communications:
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
}
void loop(){
  randomSeed(analogRead(0));
  // when characters arrive over the serial port...
  if (Serial.available()) {
    // wait a bit for the entire message to arrive
    delay(100);
    // clear the screen
    lcd.clear();
    // read all the available characters
    while (Serial.available() > 0) {
      string[i]=(Serial.read()); //store the characterers in the string
      stringNormal[i]=string[i];//copy them in the string that will be keeped
      if(string[i]==' '){
        p[c1]=i;//If there are spaces in the string, store their position
        c1++;
      }
      i++;c++;
    }
    i=0;
    while(i<dificultlevel){//The dificult level is the number of changes in the string
      n= random(0,c);// take a random index of the string to change the letter
      m=findm(n); //on the final of the code
      if((activeryeasymode==1)&&(c>3)){
        if((n!=0)&&(n!=(c-1))&&(m!=0)&&(m!=(c-1))){ // In the veryeasy mode the first and the last letter are kepped in their original position 
            if((string[n]!=' ')&&(string[m]!=' ')&&(string[n]!='\0')&&(string[m]!='\0')){  //don't changed the characters if they are spaces or the null character
            aux=string[n];//change the position of letters
            string[n]=string[m];
            string[m]=aux;  
            i++;  
            }
         }
      }else{
          if((string[n]!=' ')&&(string[m]!=' ')&&(string[n]!='\0')&&(string[m]!='\0')){  
          aux=string[n];
          string[n]=string[m];
          string[m]=aux;  
          i++;  
         }
      }             
  }
  lcd.clear();// clear the lcd
  delay(50);// a delay to sure that the lcd will not lose information
  lcd.print(string);//prinnt the changed string in the LCD
  brk=0;// let the button ready to be pressed
  }

  buttonState = digitalRead(buttonPin);
    if ((buttonState == HIGH)&&(brk==0)) { //if the button is pressed, when brk is 0 the arduino is allowed write more than one time in the lcd
      lcd.clear();//clear the lcd
      delay(50);
      lcd.print(stringNormal);//print the original string on the lcd.
      brk=1;//  prevent the arduino from write in lcd the string more tha one time
      for(int k=0;k<16;k++){
          string[k]=' ';// clear the strings to prepare them to receive a new value 
          stringNormal[k]=' ';
      }
    } 
  i=0;n=0;m=0;c=0;c1=0;//clear all the counters
}

int findm(int num){// return a random number based in the first random number, is used to make the arduino change letters in the same word
  int rand=0;
  if(num<p[0]){
    rand=random(0,p[0]);
    return rand;
  }
  if((num>p[0])&&(num<p[1])){
    rand=random(p[0],p[1]);
    return rand;
  }

  if((num>p[1])&&(num<p[2])){
    rand=random(p[1],p[2]);
    return rand;
  }
}

Pequeno exemplo:

 

Funciona com frases também:

 

Qualquer dúvida, não seja tímido, deixe um comentário. Ainda espero o dia em que descobrirei que não estou falando só.

Por enquanto é isso galera, ainda tenho planos para mais posts com LCD, não temos atualizado muito o site porque nosso semestre na facul  tá muito corrido. Mas não se preocupem quando tiver um tempinho vou postar mais tutoriais,então fiquem ligados no Dragão!

Robson Couto

Recentemente graduado Engenheiro Eletricista. Gosto de dedicar meu tempo a aprender sobre computadores, eletrônica, programação e engenharia reversa. Documento meus projetos no Dragão quando possível.

7 thoughts to “Utlilizando o Display LCD com Arduino”

  1. Todas as ligações estão OK, mas não consigo escrever no display, ele simplesmente liga e fica la sem sinal nenhum…Estou usando sensor de luz e sensor de temperatura, todos funcionando 100%, e substitui a conexão 11, pela 10(a 11 ja esta sendo usada), qual será o problema?

    1. Olá ELLEN CAPELO, se você escrever no setup() { } e não tiver alteração dentro do loop(), essa mensagem vai ficar fixa no display.. Caso queira com alguma condição, tem que colocar dentro do loop() { } depois da condição que deseja.

      Será que ajudei ou atrapalhei ????? Abraços

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *