Adquira estes componentes na Loja do Lab de Garagem

Neste tutorial, vamos mostrar como utilizar o LCD Shield I²C. Faremos demonstrações de utilização, onde a leitura dos botões do shield é feita para executar uma certa função, como nos exemplos: ajustar o brilho, ajustar o contraste, criar menus e fazer acionamento de um relé.

 

Material Utilizado:

1x LCD Shield I²C

1x Arduino UNO

1x Módulo Rele

Alguns Jumpers

Lâmpada 110V

 

Biblioteca utilizada:

Utilizaremos a biblioteca LiquidCrystal_I2C.

 

1. LCD Shield I²C

Baseado no consagrado DataShield, projeto de Jiri Trnka incubado no LdG, o LCD Shield I²C é uma excelente opção para projetos que necessitem de baixo custo e uma eficiente interface para o usuário. Utilizando bibliotecas prontas e toda a versatilidade do PCF8574, o LCD Shield I²C permite que sejam utilizados poucos pinos do Arduino para oferecer um LCD com backlight e contraste controlados por software, além de 5 botões configuráveis.

O LCD Shield I²C é um shield para Arduino que você poderá utilizar para fazer diversas aplicações, o shield possui:

- 1 x Display LCD 16x2: Onde você pode escrever em sua tela diversos tipos de mensagens.

- 1 x CI PCF8574: Responsável por enviar os comando I²C para o Display LCD, quando utilizado a biblioteca "LCD LiquidCrystal_I2C.h".

- 6 x Chaves Táteis: 5 configuráveis (Pino A0) e 1 para RESET.

- Headers Para Arduino: Além de poder simplesmente acoplar em seu Arduino, permite que você utilize os pinos não utilizado do shield para outras finalidades.

O esquemático do Shield pode ser visto na imagem abaixo, você pode adquirir o PDF do esquemático, clicando aqui.

Figura 1 - Esquemático LCD Shield I²C

Como pode ser visto no esquemático acima, o shield utiliza apenas os pinos A0, A4, A5 dos pinos analógicos e os pinos D5 e D9 dos pinos digitais, com isso todos os outros pinos do Arduino ficam livres, e com eles você pode acoplar outros shields que utilizem esses pinos que ficam livres, fazer acionamentos, utilizar módulos de comunicação como XBee ou Wifly, entre outra diversas aplicações. Também na placa você vai encontrar uma chave tátil para RESET.

2. Sketch das Demonstrações

 

Nas demonstrações disponível no vídeo, explicamos como fazer a leitura dos botões, como utilizar esse botões para fazer o ajuste do brilho do backligh, ajuste do contraste e também como criar menus, e com exemplo criamos um menu "Ajuste Brilho", um menu "Ajuste Contraste" e um menu para fazer um simples acionamento de relé.

 

2.1) Leitura dos Botões

Nessa demonstração, fazemos a leitura de cada botão e escrevemos no Serial Monitor o valor analógico lido pelo Arduino através do pino (A0).

 

#define pinBRILHO 5 //Define como 5 a palavra pinBRILHO
#define pinCONTRASTE 9 //Define como 9 a palavra pinCONTRASTE

#include <Wire.h> //Inclui a biblioteca Wire.h para se utilizar a comunicação I2C
#include <LiquidCrystal_I2C.h> //Inclui a biblioteca LiquidCrystal_I2C.h

                               //para se fazer comunicação I2C com o display LCD
LiquidCrystal_I2C lcd(32,16,2); //Inicia o LCD com os parâmetros (Endereço I2C, Colunas, Linhas)

int botoes; //Variável para a leitura dos botões
int i; //Variável para contagem

float pwm_brilho = 255; //Variável para controle de pwm do brilho
float pwm_contraste = 0; //Variável para controle de pwm do contraste
float brilho_porcent; //Variável para conversão do pwm do brilho em porcentagem (255 = 100%)
float contraste_porcent; //Variável para conversão do pwm do contraste em porcentagem (255 = 100%)

void setup()
{
  Serial.begin(9600); //Inicia a Serial para se utilizar o Serial Monitor

  lcd.init(); //Comando para inicialização do Display LCD
  lcd.backlight(); //Comando para inicialização do Display LCD

  pinMode(pinBRILHO,OUTPUT); //Configura como saída o pino 5 (pinBRILHO)
  pinMode(pinCONTRASTE,OUTPUT); //Configura como saída o pino 9 (pinCONTRASTE)

  inicializacao(); //Executa a função da tela de início
}

void loop()
{
  botoes=analogRead(A0); //Faz a leitura analógica do pino A0 e guarda na variável botoes
  Serial.println(botoes); //Escreve no Serial Monitor o valor ligo pelo pino A0
  delay(100); //Delay de 100 milissegundos
  ajuste();
}

void inicializacao() //Função de inicialização da tela LCD para a aplicação
{
  analogWrite(pinBRILHO,255); //Inicializa o brilho no máximo (255 = 100%)
  analogWrite(pinCONTRASTE,0); //Inicializa o contraste no mínimo (0 = 0%)

  Serial.println(""); //Pula uma linha
  Serial.println("LCD SHIELD I2C: INICIADO" ); //Escreve no Serial Monitor

  lcd.setCursor(0,0); //Posiciona o cursor na primeira coluna da primeira linha
  lcd.print(" LCD Shield I2C"); //Escreve no LCD

  for(i=0;i<=4;i++) //Laço para a o efeito de piscagem da segunda linha
  {
    lcd.setCursor(0,1); //Posiciona cursor
    lcd.print("                "); //Limpa segunda linha
    delay(250); //Permanece por 250 milissegundos apagada
    lcd.setCursor(0,1); //Posiciona cursor
    lcd.print("labdegaragem.com"); //Escreve na tela do LCD a mensagem "labdegaragem.com"
    delay(250); //Permanece por 250 milissegundo acesa
  }
}

void ajuste()
{
  if(botoes > 100 && botoes < 200) //Se botão da esquerda for pressionado
  {
    if(pwm_brilho > 0) //Se o PWM do brilho estiver maior que 0
    {
    pwm_brilho -= 25.5; //Subtrai 25.5(10%) no PWM do brilho
    analogWrite(pinBRILHO,pwm_brilho); //Atualiza o PWM do brilho
    }

brilho_porcent = (pwm_brilho/255) * 100; //Guarda na variável brilho_porcente
                                             //o valor do PWM convertido em porcentagem
    Serial.print("BRILHO = "); //Escreve no Serial Monitor "BRILHO =", sem pular linha
    Serial.print(brilho_porcent); //Escreve no Serial Monitor o valor em porcentagem do brilho
    Serial.println("%"); //Escreve no Serial Monitor "%" e pula linha
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }

  else if(botoes > 700 && botoes < 800) //Senão se o botão da direita for pressionado
  {
    if(pwm_brilho < 255) //Se o PWM do brilho estiver menor que 255
    {
    pwm_brilho += 25.5; //Soma 25.5(10%) no PWM do brilho
    analogWrite(pinBRILHO,pwm_brilho); //Atualiza o PWM do brilho
    }

    brilho_porcent = (pwm_brilho/255) * 100; //Guarda na variável brilho_porcente
                                             //o valor do PWM convertido em porcentagem
    Serial.print("BRILHO = "); //Escreve no Serial Monitor "BRILHO =", sem pular linha
    Serial.print(brilho_porcent); //Escreve no Serial Monitor o valor em porcentagem do brilho
    Serial.println("%"); //Escreve no Serial Monitor "%" e pula linha
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }

  else if(botoes > 200 && botoes < 300) //Senão se o botão de baixo for pressionado
  {
    if(pwm_contraste > 0) //Se o PWM do contraste estiver maior que 0
    {
    pwm_contraste -= 25.5; //Subtrai 25.5(10%) no PWM do contraste
    analogWrite(pinCONTRASTE,pwm_contraste); //Atualiza o PWM do contraste
    }

    contraste_porcent = (pwm_contraste/255) * 100; //Guarda na variável contraste_porcente
                                                   //o valor do PWM convertido em porcentagem
    Serial.print("CONTRASTE = "); //Escreve no Serial Monitor "CONSTRASTE =", sem pular linha
    Serial.print(contraste_porcent); //Escreve no Serial Monitor o valor em porcentagem do contraste
    Serial.println("%"); //Escreve no Serial Monitor "%" e pula linha
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }

  else if(botoes > 400 && botoes < 500) //Senão se o botão de cima for pressionado
  {
    if(pwm_contraste < 255) //Se o PWM do contraste estiver menor que 255
    {
    pwm_contraste += 25.5; //Soma 25.5(10%) no PWM do contraste
    analogWrite(pinCONTRASTE,pwm_contraste); //Atualiza o PWM do contraste
    }

    contraste_porcent = (pwm_contraste/255) * 100; //Guarda na variável contraste_porcente
                                                   //o valor do PWM convertido em porcentagem
    Serial.print("CONTRASTE = "); //Escreve no Serial Monitor "CONSTRASTE =", sem pular linha
    Serial.print(contraste_porcent); //Escreve no Serial Monitor o valor em porcentagem do contraste
    Serial.println("%"); //Escreve no Serial Monitor "%" e pula linha
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }
}

void trata_botao()
{
  while(botoes != 1023)
  {
    botoes=analogRead(A0);
  }
}

 

2.2) Ajuste de Brilho e Contraste

Nessa demonstração, mostramos como fazer o ajuste de brilho e contraste do Display LCD via software, utilizando os botões do shield.

 

#define pinBRILHO 5 //Define como 5 a palavra pinBRILHO
#define pinCONTRASTE 9 //Define como 9 a palavra pinCONTRASTE

#include <Wire.h> //Inclui a biblioteca Wire.h para se utilizar a comunicação I2C
#include <LiquidCrystal_I2C.h> //Inclui a biblioteca LiquidCrystal_I2C.h

                               //para se fazer comunicação I2C com o display LCD
LiquidCrystal_I2C lcd(32,16,2); //Inicia o LCD com os parâmetros (Endereço I2C, Colunas, Linhas)

int botoes; //Variável para a leitura dos botões
int i; //Variável para contagem

float pwm_brilho = 255; //Variável para controle de pwm do brilho
float pwm_contraste = 0; //Variável para controle de pwm do contraste
float brilho_porcent; //Variável para conversão do pwm do brilho em porcentagem (255 = 100%)
float contraste_porcent; //Variável para conversão do pwm do contraste em porcentagem (255 = 100%)

void setup()
{
  Serial.begin(9600); //Inicia a Serial para se utilizar o Serial Monitor

  lcd.init(); //Comando para inicialização do Display LCD
  lcd.backlight(); //Comando para inicialização do Display LCD

  pinMode(pinBRILHO,OUTPUT); //Configura como saída o pino 5 (pinBRILHO)
  pinMode(pinCONTRASTE,OUTPUT); //Configura como saída o pino 9 (pinCONTRASTE)

  inicializacao(); //Executa a função da tela de início
}

void loop()
{
  botoes=analogRead(A0); //Faz a leitura analógica do pino A0 e guarda na variável botoes
  Serial.println(botoes); //Escreve no Serial Monitor o valor ligo pelo pino A0
  delay(100); //Delay de 100 milissegundos
  ajuste();
}

void inicializacao() //Função de inicialização da tela LCD para a aplicação
{
  analogWrite(pinBRILHO,255); //Inicializa o brilho no máximo (255 = 100%)
  analogWrite(pinCONTRASTE,0); //Inicializa o contraste no mínimo (0 = 0%)

  Serial.println(""); //Pula uma linha
  Serial.println("LCD SHIELD I2C: INICIADO" ); //Escreve no Serial Monitor

  lcd.setCursor(0,0); //Posiciona o cursor na primeira coluna da primeira linha
  lcd.print(" LCD Shield I2C"); //Escreve no LCD

  for(i=0;i<=4;i++) //Laço para a o efeito de piscagem da segunda linha
  {
    lcd.setCursor(0,1); //Posiciona cursor
    lcd.print("                "); //Limpa segunda linha
    delay(250); //Permanece por 250 milissegundos apagada
    lcd.setCursor(0,1); //Posiciona cursor
    lcd.print("labdegaragem.com"); //Escreve na tela do LCD a mensagem "labdegaragem.com"
    delay(250); //Permanece por 250 milissegundo acesa
  }
}

void ajuste()
{
  if(botoes > 100 && botoes < 200) //Se botão da esquerda for pressionado
  {
    if(pwm_brilho > 0) //Se o PWM do brilho estiver maior que 0
    {
    pwm_brilho -= 25.5; //Subtrai 25.5(10%) no PWM do brilho
    analogWrite(pinBRILHO,pwm_brilho); //Atualiza o PWM do brilho
    }

brilho_porcent = (pwm_brilho/255) * 100; //Guarda na variável brilho_porcente
                                             //o valor do PWM convertido em porcentagem
    Serial.print("BRILHO = "); //Escreve no Serial Monitor "BRILHO =", sem pular linha
    Serial.print(brilho_porcent); //Escreve no Serial Monitor o valor em porcentagem do brilho
    Serial.println("%"); //Escreve no Serial Monitor "%" e pula linha
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }

  else if(botoes > 700 && botoes < 800) //Senão se o botão da direita for pressionado
  {
    if(pwm_brilho < 255) //Se o PWM do brilho estiver menor que 255
    {
    pwm_brilho += 25.5; //Soma 25.5(10%) no PWM do brilho
    analogWrite(pinBRILHO,pwm_brilho); //Atualiza o PWM do brilho
    }

    brilho_porcent = (pwm_brilho/255) * 100; //Guarda na variável brilho_porcente
                                             //o valor do PWM convertido em porcentagem
    Serial.print("BRILHO = "); //Escreve no Serial Monitor "BRILHO =", sem pular linha
    Serial.print(brilho_porcent); //Escreve no Serial Monitor o valor em porcentagem do brilho
    Serial.println("%"); //Escreve no Serial Monitor "%" e pula linha
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }

  else if(botoes > 200 && botoes < 300) //Senão se o botão de baixo for pressionado
  {
    if(pwm_contraste > 0) //Se o PWM do contraste estiver maior que 0
    {
    pwm_contraste -= 25.5; //Subtrai 25.5(10%) no PWM do contraste
    analogWrite(pinCONTRASTE,pwm_contraste); //Atualiza o PWM do contraste
    }

    contraste_porcent = (pwm_contraste/255) * 100; //Guarda na variável contraste_porcente
                                                   //o valor do PWM convertido em porcentagem
    Serial.print("CONTRASTE = "); //Escreve no Serial Monitor "CONSTRASTE =", sem pular linha
    Serial.print(contraste_porcent); //Escreve no Serial Monitor o valor em porcentagem do contraste
    Serial.println("%"); //Escreve no Serial Monitor "%" e pula linha
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }

  else if(botoes > 400 && botoes < 500) //Senão se o botão de cima for pressionado
  {
    if(pwm_contraste < 255) //Se o PWM do contraste estiver menor que 255
    {
    pwm_contraste += 25.5; //Soma 25.5(10%) no PWM do contraste
    analogWrite(pinCONTRASTE,pwm_contraste); //Atualiza o PWM do contraste
    }

    contraste_porcent = (pwm_contraste/255) * 100; //Guarda na variável contraste_porcente
                                                   //o valor do PWM convertido em porcentagem
    Serial.print("CONTRASTE = "); //Escreve no Serial Monitor "CONSTRASTE =", sem pular linha
    Serial.print(contraste_porcent); //Escreve no Serial Monitor o valor em porcentagem do contraste
    Serial.println("%"); //Escreve no Serial Monitor "%" e pula linha
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }
}

void trata_botao()
{
  while(botoes != 1023)
  {
    botoes=analogRead(A0);
  }
}

 

2.3) Criação de Menu / Acionamento de Relé

Nessa demonstração, mostramos como você pode criar um Menu e para cada Menu fazer um tipo de tratamento diferente, como no exemplo, ajustar o brilho do backlight, contraste e fazer um acionamento de relé.

#define pinBRILHO 5    //Define como 5 a palavra pinBRILHO
#define pinCONTRASTE 9 //Define como 9 a palavra pinCONTRASTE
#define pinRELE 7      //Define como 7 a palavra pinRELE

#include <Wire.h> //Inclui a biblioteca Wire.h para se utilizar a comunicação I2C
#include <LiquidCrystal_I2C.h> //Inclui a biblioteca LiquidCrystal_I2C.h
                              //para se fazer comunicação I2C com o display LCD

LiquidCrystal_I2C lcd(32,16,2); //Inicia o LCD com os parâmetros (Endereço I2C, Colunas, Linhas)

int botoes; //Variável para a leitura dos botões
int i; //Variável para contagem

int menu_cont; //Variável para contagem dos menus
int sel=0; //Variável para verificar estado do botão selecionar
int estadoRELE=0; //Variável para alteração do estado do Relé (Relé DESLIGADO)

float pwm_brilho = 255; //Variável para controle de pwm do brilho
float pwm_contraste = 0; //Variável para controle de pwm do contraste
float brilho_porcent; //Variável para conversão do pwm do brilho em porcentagem (255 = 100%)
float contraste_porcent; //Variável para conversão do pwm do contraste em porcentagem (255 = 100%)

void setup()
{
  Serial.begin(9600); //Inicia a Serial para se utilizar o Serial Monitor

lcd.init(); //Comando para inicialização do Display LCD
  lcd.backlight(); //Comando para inicialização do Display LCD

pinMode(pinBRILHO,OUTPUT); //Configura como saída o pino 5 (pinBRILHO)
  pinMode(pinCONTRASTE,OUTPUT); //Configura como saída o pino 9 (pinCONTRASTE)

pinMode(pinRELE,OUTPUT); //Configura como saída o pino 7
  digitalWrite(pinRELE,estadoRELE); //Relé = DESLIGADO (estadoRELE=0);

inicializacao(); //Executa a função da tela de início
}

void loop()
{
  botoes=analogRead(A0); //Faz a leitura analógica do pino A0 e guarda na variável botoes
  Serial.println(botoes); //Escreve no Serial Monitor o valor ligo pelo pino A0
  delay(100); //Delay de 100 milissegundos
  atualiza_menu();        //Executa a função para atualizar o menu
}

//===========================INICIALIZA A TELA DA DEMONSTRAÇÃO===========================
void inicializacao() //Função de inicialização da tela LCD para a aplicação
{
  analogWrite(pinBRILHO,255); //Inicializa o brilho no máximo (255 = 100%)
  brilho_porcent = (pwm_brilho/255) * 100;
  analogWrite(pinCONTRASTE,0); //Inicializa o contraste no mínimo (0 = 0%)
  contraste_porcent = (pwm_contraste/255) * 100;

Serial.println(""); //Pula uma linha
  Serial.println("LCD SHIELD I2C: INICIADO" ); //Escreve no Serial Monitor

lcd.setCursor(0,0); //Posiciona o cursor na primeira coluna da primeira linha
  lcd.print(" LCD Shield I2C"); //Escreve no LCD

for(i=0;i<=4;i++) //Laço para a o efeito de piscagem da segunda linha
  {
    lcd.setCursor(0,1); //Posiciona cursor
    lcd.print("                "); //Limpa segunda linha
    delay(250); //Permanece por 250 milissegundos apagada
    lcd.setCursor(0,1); //Posiciona cursor
    lcd.print("labdegaragem.com"); //Escreve na tela do LCD a mensagem "labdegaragem.com"
    delay(250); //Permanece por 250 milissegundo acesa
  }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//+++++++++++++++++++++++++++++ATUALIZAÇÃO DA LISTA DOS MENUS==================
void atualiza_menu()
{
  if(botoes > 100 && botoes < 200) //Se botão da esquerda for pressionado
  {
    menu_cont--; //Volta para o MENU anterior
  }

else if(botoes > 700 && botoes < 800) //Senão se o botão da direita for pressionado
  {
    menu_cont++;  //Vai para o próximo MENU
  }
  else if(botoes < 100)
  {
    sel = 1; //Valida que o botão de seleção foi pressionado
  }
  trata_botao(); //Chama a função para tratamento do botão para executar somente quando for clicado
  menu_list(); //Vai para a lista de MENU
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//===============================================LISTA DOS MENUS=========================
void menu_list()
{

  if(menu_cont == 0) //Menu 1: Tela de Início
  {
    lcd.setCursor(0,0); //Posiciona o cursor na primeira coluna da primeira linha
    lcd.print(" LCD Shield I2C "); //Escreve no LCD
    lcd.setCursor(0,1); //Posiciona cursor
    lcd.print("labdegaragem.com"); //Escreve na tela do LCD a mensagem "labdegaragem.com"
  }

else if(menu_cont == 1) //Menu 2: Tela de Ajuste do Brilho
  {
    lcd.setCursor(0,0); //Posiciona o cursor na primeira coluna da primeira linha
    lcd.print("AJUSTE BRILHO   "); //Escreve no LCD
    lcd.setCursor(0,1); //Posiciona cursor
    lcd.print("                "); //Escreve na tela do LCD a mensagem "labdegaragem.com"
    if(sel == 1) //Se botão de seleção for pressionado
    {
      while(sel == 1) //Enquanto o botão de selecionar não for pressionado denovo
      {
        botoes=analogRead(A0); //Lê os botões
        ajuste1(); //Vai para a função de ajuste do Brilho
        lcd.clear(); //Limpa LCD
        lcd.print("BRILHO = "); //Escreve no Serial Monitor "BRILHO =", sem pular linha
        lcd.print(brilho_porcent); //Escreve no Serial Monitor o valor em porcentagem do brilho
        lcd.print("%"); //Escreve no Serial Monitor "%" e pula linha
        trata_botao2(); //Chama a função para tratamento do botão para executar somente quando for clicado
        if(botoes < 100) //Se o botão de seleção for pressionado
        {
          sel = 0; //Sai do MENU
          trata_botao(); //Chama a função para tratamento do botão para executar somente quando for clicado
        }

}
    }
  }

else if(menu_cont == 2)//Menu 3: Tela de Ajuste do Contraste
  {
    lcd.setCursor(0,0); //Posiciona o cursor na primeira coluna da primeira linha
    lcd.print("AJUSTE CONTRASTE"); //Escreve no LCD
    lcd.setCursor(0,1); //Posiciona cursor
    lcd.print("                ");
    if(sel == 1) //Se botão de seleção for pressionado
    {
      while(sel == 1) //Enquanto o botão de selecionar não for pressionado denovo
      {
        botoes=analogRead(A0); //Lê os botões
        ajuste2();  //Vai para a função de ajuste do Brilho
        lcd.clear(); //Limpa LCD
        lcd.print("CONTRASTE = "); //Escreve no Serial Monitor "BRILHO =", sem pular linha
        lcd.print(contraste_porcent); //Escreve no Serial Monitor o valor em porcentagem do brilho
        lcd.print("%"); //Escreve no Serial Monitor "%" e pula linha
        trata_botao2(); //Chama a função para tratamento do botão para executar somente quando for clicado
        if(botoes < 100) //Se o botão de seleção for pressionado
        {
          sel = 0; //Sai do MENU
          trata_botao(); //Chama a função para tratamento do botão para executar somente quando for clicado
        }
      }
    }
  }

else if(menu_cont == 3)//Menu 4: Tela de Estado do Relé
  {
    lcd.setCursor(0,0); //Posiciona o cursor na primeira coluna da primeira linha
    lcd.print("ESTADO DO RELE  "); //Escreve no LCD
    lcd.setCursor(0,1); //Posiciona cursor
    lcd.print("                ");
    if(sel == 1) //Se botão da esquerda for pressionado
    {
      while(sel == 1)
      {
        botoes=analogRead(A0); //Lê os botões
        lcd.clear(); //Limpa LCD
        lcd.print("ESTADO = "); //Escreve no Serial Monitor "BRILHO =", sem pular linha

if(estadoRELE == 0) //Se o relé estiver desacionado
        {
          lcd.setCursor(9,0); //Posiciona CURSOR
          lcd.print("OFF"); //Escreve OFF no LCD
        }

else if(estadoRELE == 1) //Se o relé estiver acionado
        {
          lcd.setCursor(9,0); //Posiciona CURSOR
          lcd.print("ON"); //Escreve ON no LCD
        }

trata_botao2(); //Chama a função para tratamento do botão para executar somente quando for clicado
        ajuste3();
        if(botoes < 100) //Se o botão de seleção for pressionado
        {
          sel = 0; //Sai do MENU
          trata_botao(); //Chama a função para tratamento do botão para executar somente quando for clicado
        }
      }
    }
  }

else if(menu_cont == 4) //Se a contagem de menu for para 4
  {
    menu_cont = 0; //Volta para o primeiro menu
  }
  else if(menu_cont == -1) //Se a contagem de menu for para -1
  {
    menu_cont = 3; //Volta para o último menu
  }
}
//---------------------------------------------------------------------------

//============================AJUSTES DOS MENUS================================
void ajuste1()
{
  if(botoes > 100 && botoes < 200) //Se botão da esquerda for pressionado
  {
    if(pwm_brilho > 0) //Se o PWM do brilho estiver maior que 0
    {
      pwm_brilho -= 25.5; //Subtrai 25.5(10%) no PWM do brilho
      analogWrite(pinBRILHO,pwm_brilho); //Atualiza o PWM do brilho
    }

brilho_porcent = (pwm_brilho/255) * 100; //Guarda na variável brilho_porcente
    //o valor do PWM convertido em porcentagem
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }

else if(botoes > 700 && botoes < 800) //Senão se o botão da direita for pressionado
  {
    if(pwm_brilho < 255) //Se o PWM do brilho estiver menor que 255
    {
      pwm_brilho += 25.5; //Soma 25.5(10%) no PWM do brilho
      analogWrite(pinBRILHO,pwm_brilho); //Atualiza o PWM do brilho
    }

brilho_porcent = (pwm_brilho/255) * 100; //Guarda na variável brilho_porcente
    //o valor do PWM convertido em porcentagem
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }
}

void ajuste2()
{
  if(botoes > 200 && botoes < 300) //Senão se o botão de baixo for pressionado
  {
    if(pwm_contraste > 0) //Se o PWM do contraste estiver maior que 0
    {
      pwm_contraste -= 25.5; //Subtrai 25.5(10%) no PWM do contraste
      analogWrite(pinCONTRASTE,pwm_contraste); //Atualiza o PWM do contraste
    }

contraste_porcent = (pwm_contraste/255) * 100; //Guarda na variável contraste_porcente
    //o valor do PWM convertido em porcentagem
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }

else if(botoes > 400 && botoes < 500) //Senão se o botão de cima for pressionado
  {
    if(pwm_contraste < 255) //Se o PWM do contraste estiver menor que 255
    {
      pwm_contraste += 25.5; //Soma 25.5(10%) no PWM do contraste
      analogWrite(pinCONTRASTE,pwm_contraste); //Atualiza o PWM do contraste
    }

contraste_porcent = (pwm_contraste/255) * 100; //Guarda na variável contraste_porcente
    //o valor do PWM convertido em porcentagem
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }
}

void ajuste3()
{
  if(botoes > 200 && botoes < 300) //Senão se o botão de baixo for pressionado
  {
    estadoRELE=0;
    digitalWrite(pinRELE,estadoRELE);
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }

else if(botoes > 400 && botoes < 500) //Senão se o botão de cima for pressionado
  {
    estadoRELE=1;
    digitalWrite(pinRELE,estadoRELE);
    trata_botao(); //Tratamento do botão para variar somente 10% quando for clicado
  }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//=================================TRATAMENTO DOS BOTÕES===========================
void trata_botao()
{
  while(botoes != 1023) //Enquanto o botão não for solto, fica preso no laço
  {
    botoes=analogRead(A0);
  }
}

void trata_botao2()
{
  while(botoes > 900) //Enquanto nenhum botão for pressionado, fica preso no laço
  {
    botoes=analogRead(A0);
  }
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

 

3. Montagem da Demonstração 2.3

 

3.1) Módulo Relé

Faça as ligações de sua lâmpada com o módulo relé, conforme a imagem abaixo.

Imagem 1 - Montagem do Módulo Relé + Lâmpada

 

3.2) Circuito

Conecte o LCD Shield I²C no Arduino e faça as ligações no Módulo Relé, conforme a figura abaixo.

 

Figura 2 - Circuito da Demonstração 3.3

 

 

Então é isso Garagistas! Espero que tenham gostado desse incrível e versátil Shield! Até a Próxima!

Exibições: 24082

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Marcos Andre Krohn em 3 abril 2014 às 13:30

Boa tarde.

Funcionou bem com os códigos de exemplo. No entanto percebo as vezes "flickering" no display quando o contraste não é de 100%. Pensei que fosse batimento com lâmpadas florescentes, mas acontece com vários tipos de iluminação. Também acontece eventualmente quando se toca no conjunto montado. Varia com o Ângulo de visão. Pode ser questão de aterramento ?

Comentário de Andre Paparotto em 19 março 2014 às 12:22

Boa tarde pessoal, estou com um lcd 20 x 4 + biblioteca i2c + arduino unor3.

Porem, só consigo fazer com que o lcd acenda as celulas todas em branco, nas linhas 0 e 3,  permanecendo apagadas as demais, linhas 1 e 4.

alguem poderia me ajudar ?

Comentário de jose matos pimentel em 5 agosto 2013 às 18:11

LAB DE GARAGEM VCS SAO DE MAIS, ESTAVA A UM TEMPAO BUSCANDO COMO CRIAR MENUS...PARABENS CONTINUEM ASSIM QUE VCS VAO LONGE...OBRIGADO POR MAIS UM TUTORIAL.

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço