Ir ao conteúdo
  • Cadastre-se

Guilherme Batalha

Membro Júnior
  • Posts

    1
  • Cadastrado em

  • Última visita

Reputação

0
  1. 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? #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)); }

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...