Ir ao conteúdo
  • Cadastre-se

Transição de telas no Display 16x2


Posts recomendados

Bom galera, o problema é o seguinte, eu quero fazer uma transição de telas sem usar o Delay, porque eu vou usar botões, aí pra não ter q usar Interrupts pra eles queria usar o metodo millis(), mas o display fica doidao e não da certo, alguém tem alguma sugestão, ou solução?:D

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR    0x3F
#define DS1307_ADDRESS 0x68

byte zero = 0x00;
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

unsigned long previousTime = 0;

void setup()
{
  lcd.init();
  lcd.backlight();
  Wire.begin();
  Serial.begin(9600);
  //SelecionaDataeHora(); //----- utilizar se for definir a data e a hora
}

void loop()
{
  screenManager();
}

//Aqui estou tentando fazer a transição das telas sem usar o delay, porque lá na frente vai atrapalhar
//ja que eu vou utilizar botões e nao quero usar Interrupt para eles.
//MAS é aqui que o display fica lokão... faço a minima ideia do que está errado.

void screenManager() 
{
    if ((millis() - previousTime) < 3000 )
    {     
      screenHome();
    }
    
    if ((millis() - previousTime) > 3000 && (millis() - previousTime) <= 6000)
    {
      screenHome2();
    }

    // aqui é onde atualiza o previousTime, após a transição das telas. Isso serve pra renovar as condicionais acima
    if ((millis() - previousTime) > 6000)
    {
      previousTime = millis();
    }
}

//!!!! DAQUI pra frente eu ja verifiquei individualmente o código e tá certo, aparece certinho
//no display, eu não usei o lcd.clear, porque como vai ficar rodando em loop ele fica piscando o display
//ai ao invés de piscar o display inteiro eu usei espaços em brancos onde fosse necessário. %Gambiarra%
void screenHome()
{
  // Le os valores (data e hora) do modulo DS1307
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  int segundos = ConverteparaDecimal(Wire.read());
  int minutos = ConverteparaDecimal(Wire.read());
  int horas = ConverteparaDecimal(Wire.read() & 0b111111);

  // Mostra os dados no display
  lcd.setCursor(3, 0);
  lcd.print("EcoShower");
  lcd.setCursor(2, 1);
  lcd.print("   ");
  lcd.setCursor(5, 1);
  // Acrescenta o 0 (zero) se a hora for menor do que 10
  if (horas <10)
    lcd.print("0");
  lcd.print(horas);
  lcd.print(":");
  // Acrescenta o 0 (zero) se minutos for menor do que 10
  if (minutos < 10)
    lcd.print("0");
  lcd.print(minutos);
  lcd.print("     ");
  returningHome1 = HIGH;
}

void screenHome2() 
{
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  int diadasemana = ConverteparaDecimal(Wire.read());
  int diadomes = ConverteparaDecimal(Wire.read());
  int mes = ConverteparaDecimal(Wire.read());
  int ano = ConverteparaDecimal(Wire.read());

  lcd.setCursor(5, 1);
  lcd.print("     ");
  lcd.setCursor(2, 1);
  // Mostra o dia da semana
  switch (diadasemana)
  {
  case 0:lcd.print("Dom");
    break;
  case 1:lcd.print("Seg");
    break;
  case 2:lcd.print("Ter");
    break;
  case 3:lcd.print("Quar");
    break;
  case 4:lcd.print("Qui");
    break;
  case 5:lcd.print("Sex");
    break;
  case 6:lcd.print("Sab");
  }
  lcd.setCursor(6, 1);
  // Acrescenta o 0 (zero) se dia do mes for menor do que 10
  if (diadomes < 10)
    lcd.print("0");
  lcd.print(diadomes);
  lcd.print("/");
  // Acrescenta o 0 (zero) se mes for menor do que 10
  if (mes < 10)
    lcd.print("0");
  lcd.print(mes);
  lcd.print("/");
  lcd.print(ano);
  returningHome2 = HIGH;
}

void SelecionaDataeHora()   //Seta a data e a hora do DS1307
{
  byte segundos = 00; //Valores de 0 a 59
  byte minutos = 20; //Valores de 0 a 59
  byte horas = 12; //Valores de 0 a 23
  byte diadasemana = 1; //Valores de 0 a 6 - 0=Domingo, 1 = Segunda, etc.
  byte diadomes = 1; //Valores de 1 a 31
  byte mes = 5; //Valores de 1 a 12
  byte ano = 17; //Valores de 0 a 99
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados

            //As linhas abaixo escrevem no CI os valores de 
            //data e hora que foram colocados nas variaveis acima
  Wire.write(ConverteParaBCD(segundos));
  Wire.write(ConverteParaBCD(minutos));
  Wire.write(ConverteParaBCD(horas));
  Wire.write(ConverteParaBCD(diadasemana));
  Wire.write(ConverteParaBCD(diadomes));
  Wire.write(ConverteParaBCD(mes));
  Wire.write(ConverteParaBCD(ano));
  Wire.write(zero);
  Wire.endTransmission();
}

byte ConverteParaBCD(byte val)
{
  //Converte o número de decimal para BCD
  return ((val / 10 * 16) + (val % 10));
}

byte ConverteparaDecimal(byte val)
{
  //Converte de BCD para decimal
  return ((val / 16 * 10) + (val % 16));
}

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!