Temporizador - ajustar horas e minutos

Olá pll,
Com a vossa ajuda consegui introduzir temporizadores no meu código, e está tudo a funcionar, mas há um detalhe que queria melhorar. Para horas e minutos <10 o lcd.print fica qualquer coisa do género:
1 :5 (1 hora e 5 minutos)

O que eu queria era algo do género: 01:05.
Presumo que isto se fará com string´s concatenando o "0" com a hora e/ou minutos para valores < 10, mas string´s é coisa que percebo "zero" :0 . Já li umas coisas sobre string´s mas é um capitulo em que estou com dificuldades em fazer/interpretar.

Fica aqui a parte do código onde pretendo corrigir esta situação:

if ((Key >= 'A' && Key <= 'D') && menuTemporizadorHqi==true && menuTemporizadorT8==false && menuTemporizadorMoonlight==false)        
                                {switch (Key)
                                              {case 'A' :
                                                        horaInicioHqi = horaInicioHqi+1;
                                                        if(horaInicioHqi>23)
                                                        {horaInicioHqi=0;}
                                                         //digitalWrite(buzzer, LOW);
                                                         //delay(100);
                                                         //digitalWrite(buzzer, HIGH);
                                                         lcd.clear();
                                                         lcd.setCursor(0,0);
                                                         lcd.print("Iniciar HQI as");
                                                         lcd.setCursor(0,1);
                                                         lcd.print(horaInicioHqi);
                                                         lcd.setCursor(2,1);
                                                         lcd.print(":");
                                                         lcd.setCursor(3,1);
                                                         lcd.print(minutoInicioHqi);
                                                         lcd.setCursor(6,1);
                                                         lcd.print("Horas");
                                                         tempo = millis();
                                                    break;
                                               case 'B' :
                                                        minutoInicioHqi = minutoInicioHqi+1;
                                                        if(minutoInicioHqi>59)
                                                        {minutoInicioHqi=0;}
                                                         //digitalWrite(buzzer, LOW);
                                                         //delay(100);
                                                         //digitalWrite(buzzer, HIGH);
                                                         lcd.clear();
                                                         lcd.setCursor(0,0);
                                                         lcd.print("Iniciar HQI as");
                                                         lcd.setCursor(0,1);
                                                         lcd.print(horaInicioHqi);
                                                         lcd.setCursor(2,1);
                                                         lcd.print(":");
                                                         lcd.setCursor(3,1);
                                                         lcd.print(minutoInicioHqi);
                                                         lcd.setCursor(6,1);
                                                         lcd.print("Horas");
                                                         tempo = millis();
                                                    break;
                                             }
                                }

Se puderem ajudar :~ :~
Obg
NJPinheiro

Isso pode ser feito de várias maneiras. Eu costumo fazer uma coisa bastante simples, que não fica muito bonita, mas que funciona:

if ((Key >= 'A' && Key <= 'D') && menuTemporizadorHqi==true && menuTemporizadorT8==false && menuTemporizadorMoonlight==false)        
                                {switch (Key)
                                              {case 'A' :
                                                        horaInicioHqi = horaInicioHqi+1;
                                                        if(horaInicioHqi>23)
                                                        {horaInicioHqi=0;}
                                                         //digitalWrite(buzzer, LOW);
                                                         //delay(100);
                                                         //digitalWrite(buzzer, HIGH);
                                                         lcd.clear();
                                                         lcd.setCursor(0,0);
                                                         lcd.print("Iniciar HQI as");
                                                         lcd.setCursor(0,1);
                                                         if (horaInicioHqi<10) {
                                                            lcd.print("0");
                                                         }
                                                         lcd.print(horaInicioHqi);
                                                         lcd.setCursor(2,1);
                                                         lcd.print(":");
                                                         lcd.setCursor(3,1);
                                                         if (minutoInicioHqi<10) {
                                                            lcd.print("0");
                                                         }
                                                         lcd.print(minutoInicioHqi);
                                                         lcd.setCursor(6,1);
                                                         lcd.print("Horas");
                                                         tempo = millis();
                                                    break;
                                               case 'B' :
                                                        minutoInicioHqi = minutoInicioHqi+1;
                                                        if(minutoInicioHqi>59)
                                                        {minutoInicioHqi=0;}
                                                         //digitalWrite(buzzer, LOW);
                                                         //delay(100);
                                                         //digitalWrite(buzzer, HIGH);
                                                         lcd.clear();
                                                         lcd.setCursor(0,0);
                                                         lcd.print("Iniciar HQI as");
                                                         lcd.setCursor(0,1);
                                                         if (horaInicioHqi<10) {
                                                            lcd.print("0");
                                                         }
                                                         lcd.print(horaInicioHqi);
                                                         lcd.setCursor(2,1);
                                                         lcd.print(":");
                                                         lcd.setCursor(3,1);
                                                         if (minutoInicioHqi<10) {
                                                            lcd.print("0");
                                                         }
                                                         lcd.print(minutoInicioHqi);
                                                         lcd.setCursor(6,1);
                                                         lcd.print("Horas");
                                                         tempo = millis();
                                                    break;
                                             }
                                }

Depois de ver o código, e uma vez que esta funcionalidade do programa está repetida em dois lugares, o meu conselho é que seja feita uma função para fazer isto (pelo menos para escrever a hora+minuto no LCD).

É verdade Luís, para uma dificuldade há sempre mais de uma maneira de resolver, o problema é qual a melhor maneira :slight_smile: :slight_smile: e a sua sugestão pela simplicidade de resolução parece-me efectivamente uma boa solução, (como de costume).
Sugestão implantada, problema resolvido.

luisilva:
Depois de ver o código, e uma vez que esta funcionalidade do programa está repetida em dois lugares, o meu conselho é que seja feita uma função para fazer isto (pelo menos para escrever a hora+minuto no LCD).

Luis, como sabe eu ainda estou a dar os primeiros passos nos Arduínos, e ás vezes pode acontecer que o que escrevo no programa não seja o que pretendo fazer...daí as duvidas.

Dito isto, julgo que o "temporizador" não está em dois lugares, o que existe é um estado para cada temporizador, (são 3), em que eu defino horas para ligar e horas para desligar. Depois noutro estado tenho as teclas 7; 8; e 9 que me mostram no LCD as horas "on e off" para cada um dos repetivos temporizadores.

Em resumo:
1 estado para cada temporizador, (3 estados) em que:
"A" e "B" incrementam horas e minutos respectivamente para ligar;
"C" e "D" incrementam horas e minutos respectivamente para desligar;

1 estado em que:
Teclas 4; 5; e 6 dão-me acesso a mudar horas/minutos dos respectivos temporizadores
Teclas 7; 8; e 9 Imprimem no LCD as horas/minutos dos respectivos temporizadores

Deixo link para o meu código completo:
https://googledrive.com/host/0B-Pv876wR5B1OVFDdF9rYjZ6UFk
Sugestões / criticas ao meu código fonte são bem vindas.

Obg
NJPinheior

O que eu estava a dizer, era fazer uma coisa destas:

if ((Key >= 'A' && Key <= 'D') && menuTemporizadorHqi==true && menuTemporizadorT8==false && menuTemporizadorMoonlight==false)        
                                {switch (Key)
                                              {case 'A' :
                                                        horaInicioHqi = horaInicioHqi+1;
                                                        if(horaInicioHqi>23)
                                                        {horaInicioHqi=0;}
                                                         //digitalWrite(buzzer, LOW);
                                                         //delay(100);
                                                         //digitalWrite(buzzer, HIGH);
                                                        mostra_horas(horaInicioHqi, minutoInicioHqi);
                                                         tempo = millis();
                                                    break;
                                               case 'B' :
                                                        minutoInicioHqi = minutoInicioHqi+1;
                                                        if(minutoInicioHqi>59)
                                                        {minutoInicioHqi=0;}
                                                         //digitalWrite(buzzer, LOW);
                                                         //delay(100);
                                                         //digitalWrite(buzzer, HIGH);
                                                        mostra_horas(horaInicioHqi, minutoInicioHqi);
                                                         tempo = millis();
                                                    break;
                                             }
                                }

criando uma função para mostrar as horas no LCD:

void mostra_horas(int horas, int minutos) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Iniciar HQI as");
  lcd.setCursor(0, 1);
  if (horas < 10) {
    lcd.print("0");
  }
  lcd.print(horas);
  lcd.setCursor(2, 1);
  lcd.print(":");
  lcd.setCursor(3, 1);
  if (minutos < 10) {
    lcd.print("0");
  }
  lcd.print(minutos);
  lcd.setCursor(6, 1);
  lcd.print("Horas");
}

Desta forma não é necessário repetir todo o código que faz a escrita do relógio no LCD.

Olá Luís, a menos que eu não esteja a ver bem, ( e pode ser mesmo esse o caso), na sugestão que me dá teria de fazer 6 funções "void mostra_horas", duas para cada um dos reles: Hqi+T8+Moonlights. (ligar/desligar), porque o problema é que a função "void mostra_horas" tem uma/duas linhas que são texto:

lcd.print("Iniciar HQI as"); + lcd.print("Iniciar T8 as"); + lcd.print("Iniciar Moonlights as");
lcd.print("Apagar HQI as"); + lcd.print("Apagar T8 as"); + lcd.print("Apagar Moonlights as");

Ou adoptando a sua sugestão, estas linhas teriam de ficar fora da função "void mostra_horas

Adicionalmente na sua sugestão temos horas/minutos de inicio mas não temos horas/minutos de fim, ou seja vamos ter ao mesmo sitio.

Eu tenho:
1 estado para cada temporizador, (3 estados) em que:
"A" e "B" incrementam horas e minutos respectivamente para ligar;
"C" e "D" incrementam horas e minutos respectivamente para desligar;

1 estado em que:
Teclas 4; 5; e 6 dão-me acesso a mudar horas/minutos dos respectivos temporizadores
Teclas 7; 8; e 9 Imprimem no LCD as horas/minutos dos respectivos temporizadores

Em resumo, se eu percebi bem diferença da sua sugestão para o meu código e que no meu código esta tudo escrito "linha a linha", a sua sugestão era substituir no código principal as diversas linhas de "print horas/minutos" por 6 funções void criadas fora do código principal.

Ao estar a escrever este texto apercebi-me que se eu tiver entendido bem a questão a grande vantagem da sua sugestão é que o código principal fica mais pequeno, e consequentemente mais limpo, e isso já me faz reconsiderar o meu código.

Obg
NJPinheiro

Luís,
uma pergunta se me puder ajudar, o meu RTC faz Domingo = o até Sábado = 6, a questão é que ele não "assume" o Domingo, será por no inicio eu ter isto?

int value = 0

Se eu carregar o RTC como domingo, (na função de configurar o RTC), ele "assume" o Domingo, mas na semana seguinte "salto" do Sábado para 2ªFeira :slight_smile: (dito de outro modo o Sábado fica com 48horas)

Também já carreguei o modulo como sendo Sábado ás 23:59, mas ele fica-se pelo Sábado :~ :~

PS:Ele comer de 2ª a 6ª não era grave :slight_smile: :slight_smile: agora o DOMINGO??????? =( =( =(

Realmente, a questão do primeiro post é pertinente, e foi erro meu. Se é assim como descreve, o que se pode fazer é o seguinte:

if ((Key >= 'A' && Key <= 'D') && menuTemporizadorHqi==true && menuTemporizadorT8==false && menuTemporizadorMoonlight==false)        
                                {switch (Key)
                                              {case 'A' :
                                                        horaInicioHqi = horaInicioHqi+1;
                                                        if(horaInicioHqi>23)
                                                        {horaInicioHqi=0;}
                                                         //digitalWrite(buzzer, LOW);
                                                         //delay(100);
                                                         //digitalWrite(buzzer, HIGH);
                                                         lcd.clear();
                                                         lcd.setCursor(0, 0);
                                                         lcd.print("Iniciar HQI as");
                                                        mostra_horas(horaInicioHqi, minutoInicioHqi);
                                                         tempo = millis();
                                                    break;
                                               case 'B' :
                                                        minutoInicioHqi = minutoInicioHqi+1;
                                                        if(minutoInicioHqi>59)
                                                        {minutoInicioHqi=0;}
                                                         //digitalWrite(buzzer, LOW);
                                                         //delay(100);
                                                         //digitalWrite(buzzer, HIGH);
                                                         lcd.clear();
                                                         lcd.setCursor(0, 0);
                                                         lcd.print("Iniciar HQI as");
                                                        mostra_horas(horaInicioHqi, minutoInicioHqi);
                                                         tempo = millis();
                                                    break;
                                             }
                                }

Alterando a função para:

void mostra_horas(int horas, int minutos) {
  lcd.setCursor(0, 1);
  if (horas < 10) {
    lcd.print("0");
  }
  lcd.print(horas);
  lcd.setCursor(2, 1);
  lcd.print(":");
  lcd.setCursor(3, 1);
  if (minutos < 10) {
    lcd.print("0");
  }
  lcd.print(minutos);
  lcd.setCursor(6, 1);
  lcd.print("Horas");
}

Aqui, é escrito o título no bloco principal e as horas+minutos (que é aquilo que se repete sempre) na função.

Outra opção é deixar o bloco principal como estava e alterar a função, de forma a que possa escrever o titulo que se quiser:

void mostra_horas(char* titulo, int horas, int minutos) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(titulo);
  lcd.setCursor(0, 1);
  if (horas < 10) {
    lcd.print("0");
  }
  lcd.print(horas);
  lcd.setCursor(2, 1);
  lcd.print(":");
  lcd.setCursor(3, 1);
  if (minutos < 10) {
    lcd.print("0");
  }
  lcd.print(minutos);
  lcd.setCursor(6, 1);
  lcd.print("Horas");
}

A única alteração que seria necessária no bloco principal seria a chamada da função, da seguinte forma:

                                              {case 'A' :
                                                        horaInicioHqi = horaInicioHqi+1;
                                                        if(horaInicioHqi>23)
                                                        {horaInicioHqi=0;}
                                                         //digitalWrite(buzzer, LOW);
                                                         //delay(100);
                                                         //digitalWrite(buzzer, HIGH);
                                                        mostra_horas("Iniciar HQI as", horaInicioHqi, minutoInicioHqi);
                                                         tempo = millis();
                                                    break;

Em relação à outra questão, não o consigo ajudar, porque o link que deixou para o código não funciona, sendo assim, não consigo ver o código para perceber o que se passa.

luisilva:
Outra opção é deixar o bloco principal como estava e alterar a função, de forma a que possa escrever o titulo que se quiser:

void mostra_horas(char* titulo, int horas, int minutos) {

lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print(titulo);
 lcd.setCursor(0, 1);
 if (horas < 10) {
   lcd.print("0");
 }
 lcd.print(horas);
 lcd.setCursor(2, 1);
 lcd.print(":");
 lcd.setCursor(3, 1);
 if (minutos < 10) {
   lcd.print("0");
 }
 lcd.print(minutos);
 lcd.setCursor(6, 1);
 lcd.print("Horas");
}




A única alteração que seria necessária no bloco principal seria a chamada da função, da seguinte forma:


{case 'A' :
                                                       horaInicioHqi = horaInicioHqi+1;
                                                       if(horaInicioHqi>23)
                                                       {horaInicioHqi=0;}
                                                        //digitalWrite(buzzer, LOW);
                                                        //delay(100);
                                                        //digitalWrite(buzzer, HIGH);
                                                       mostra_horas("Iniciar HQI as", horaInicioHqi, minutoInicioHqi);
                                                        tempo = millis();
                                                   break;

É por aí :slight_smile: parece-me boa essa solução, vou implementar.

luisilva:
Em relação à outra questão, não o consigo ajudar, porque o link que deixou para o código não funciona, sendo assim, não consigo ver o código para perceber o que se passa.

Já corrigi o link.

Obg
NJPinheiro

Em relação à questão do calendário, eu no seu lugar, fazia domingo = 1. Isto porque daquilo que eu percebo do datasheet do módulo RTC, o registo que armazena o dia da semana varia entre 1 e 7, e sendo assim, o zero não está incluído (ver imagem em anexo).

Sendo assim, penso que apenas seria necessário alterar a seguinte zona do programa:

      switch (diaDaSemana)
          {case 1:
                Serial.print("Domingo");          //se a variável diaDaSemana for UM imprima na tela "Domingo"
                lcd.setCursor(9, 0);
                lcd.print("Domingo");
             break;
           case 2:
                Serial.print("Segunda-feira");    //idem ao anterior
                lcd.setCursor(9, 0);
                lcd.print("2Feira");
             break;
           case 3:
                Serial.print("Terca-feira");
                lcd.setCursor(9, 0);
                lcd.print("3Feira");
             break;
           case 4:
                Serial.print("Quarta-feira");
                lcd.setCursor(9, 0);
                lcd.print("4Feira");
             break;
           case 5:
                Serial.print("Quinta-feira");
                lcd.setCursor(9, 0);
                lcd.print("5Feira");
             break;
           case 6:
                Serial.print("Sexta-feira");
                lcd.setCursor(9, 0);
                lcd.print("6Feira");
             break;
           case 7:
                Serial.print("Sabado");
                lcd.setCursor(9, 0);
                lcd.print("Sabado");
             break;
          }

luisilva:
Em relação à questão do calendário, eu no seu lugar, fazia domingo = 1. Isto porque daquilo que eu percebo do datasheet do módulo RTC, o registo que armazena o dia da semana varia entre 1 e 7, e sendo assim, o zero não está incluído (ver imagem em anexo).

Grande Luís, sempre em cima do acontecimento, problema resolvido, obrigado.

NJPinheiro

Saudações, lendo o post achei muito interessante a forma de controlar o tempo no arduino, tentei acessar o link do seu código para leitura e compreensão, mas infelizmente não está disponível no momento.
Você poderia postá-lo novamente? Em um pequeno projeto estou precisando controlar o tempo para ativar um aspersor e controlar a vazão de água durante o tempo em que o aspersor estiver ligado.
O seu exemplo irá auxiliar muito no meu projeto.

Obrigado.