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: 24071

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 Mateus Bispo em 29 agosto 2016 às 16:43

Deu certo aqui Andre Michelon, obrigado.

obrigado a todos!!

Comentário de Andre Michelon em 28 agosto 2016 às 23:04

Olá Pessoal,

No arquivo LiquidCrystal_I2C.ccp, localize a declaracao "inline size_t LiquidCrystal_I2C_LDG::write(uint8_t value)".

Veja que originalmente o retorno da funcao é zero, altere para 1 e está feito!

inline size_t LiquidCrystal_I2C_LDG::write(uint8_t value) {
    send(value, Rs);
    return 1;
}

Abraço!

Comentário de Mateus Bispo em 28 agosto 2016 às 17:55

Henrrique será que não teria solução com atualização da biblioteca igual propos o Fabio Paoli?

sabe como fazer esse ajuste?

Comentário de Henrique de Souza Salvador em 28 agosto 2016 às 17:48

Mateus baixa uma versão anterior do IDE do Arduino, resolvi enfim assim. A biblioteca mais nova não funciona.

Comentário de Mateus Bispo em 28 agosto 2016 às 17:41

ola pessoal tenho o mesmo shield do Henrique de Souza Salvador e a tempos não o usava, agora ele acende normal mas so exibe os caracteres da primeira coluna. 

eu não consegui entender e aplicar a solução proposta pelo Fabio Paoli, se puderem me ajudar na solução ou disponibilizando a biblioteca ja corrigida eu agradeço!

baianosim@gmail.com

Comentário de Andre Michelon em 12 junho 2016 às 10:52

Olá Fábio, sim, correto! Apenas esse pequeno ajuste e está funcionando.

Obrigado, abraço!

Comentário de FP em 8 junho 2016 às 23:38

Andre Michelon e Henrique, acredito que esta biblioteca esteja incompatível mesmo com as versões mais recentes.  Olhando  uma biblioteca similar fiz a seguinte seguinte mudança no LiquidCrystal_I2C.cpp que está disponível nolink de downloadacima e passou a funcionar pra mim:

221c221
<     return 0;
---
>     return 1;   

Experimentem ver se isso resolve.  Abraços!

Comentário de Andre Michelon em 13 março 2016 às 15:35

Olá Pessoal,

Estou com o mesmo problema do Henrique, creio que a biblioteca pode ter ficado incompativel com as novas versoes da IDE Arduino.

Henrique, vc resolveu o problema? Em tempo, o mesmo problema também ocorre com o DataShield.

Abraço!

Comentário de Henrique de Souza Salvador em 17 fevereiro 2016 às 9:49

Eu tenho um Shield que não usava a um tempo (anos), estou com problema de usar esses exemplos, o meu Shield é o LCD_RTC_SHIELD v1.1, é um LCD com 6 botões, porém acende e tal e fica a faixa superior acessa e mais nada. nenhum texto em informação.

Comentário de Marcos Andre de Assis Mendes em 12 abril 2014 às 17:23

Para quem nao tem a biblioteca LiquidCrystal_I2C, Encontrei este site:

 http://hmario.home.xs4all.nl/arduino/LiquidCrystal_I2C/

Espero que seja util.

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço