Go Down

Topic: Função delay (Read 654 times) previous topic - next topic

NJPinheiro

Jul 29, 2014, 11:36 pm Last Edit: Jul 31, 2014, 12:40 am by NJPinheiro Reason: 1
Pll,
tenho de "hardware":
- Arduino Mega;
- Teclado matricial 4x4
- 8 reles
- LCD (ainda não montado porque aguardo pelo potênciometro)
- Relogio RTC DS1307

Numa primeira fase "construí", (com base em códigos pesquisados na net e com ajuda do user luisilva) o codigo que me permitia controlar os relés mediante a introdução de uma password.

Depois "peguei" num código para o relogio, (também ele com base na net, porque os conhecimentos ainda não me permitem fazer de raiz), e tenho estado a tentar "encaixar" no código anterior.

O objectivo é:
Por defeito ele "apresenta" as horas no serial monitor, com a introdução da password interrompia e ao pressionar uma tecla altera o estado do respectivo rele e  escreve que relé está a ligar/desligar, (tipo relé 1 On).

Estou praticamente a atingir o objectivo, já está a cumprir os passos:
1 - Apresenta as horas;
2 - Para ao introduzir a password
3 - Ao introduzir um numero, altera o estado do respectivo relé e escreve no serial monitor o estado
4 - Ao bloquear o teclado volta ao ponto 1

E agora....estou a "morrer na praia" ....porque queria por um delay nas horas, (neste momento esta com println e aparece tudo seguido o que não se torna legível).

Alguém pode-me ajudar indicando onde devo colocar o "delay"?
Aqui fica esta parte do código:
Code: [Select]
void loop()
{
  char Key = keypad.getKey();
  if (estado == false)
     
      imprimeDadosModulo();
       
  if (estado == false && Key != NO_KEY)                                                                                                               //verifica o estado do teclado
    {switch (Key)
      {case '*':
        if (password.evaluate())                                                                                           // verifica se password introduzida é correcta
           {MostraInfo(TARGET, 0, 0, "Desbloqueado");                                                 // se sim imprime Teclado desbloqueado no serial monitor
            estado = true; }                                                                                                             // e activa o teclado
        break;
        case '#': password.reset(); break;                                                                                         // se precionado # reseta password
        default: password.append(Key);
                                                                              //chamando a função para imprimir na tela os dados gravados no módulo.
       }
     }
  else if (estado == true && Key != NO_KEY)                                                                                                       // se o teclado está activado, e foi precionada uma tecla
          //Serial.println(Key);
        {if (Key >= '0' && Key <= '9')
            {value = value * 10 + Key - '0';}
            if (Key == '*')
                //Serial.println(value);                                                                                                              //mostra valor total (actual) == se isto tivesse estado aqui o problema tinha sido descoberto antes
                {switch (value)
                    {case 1 :
                         if (digitalRead(releHQI) == LOW)                                           // verifica se as Lâmpadas HQI estão desligadas
                            {digitalWrite(releHQI, HIGH);                                                  // se verdadeiro liga as Lâmpadas HQI
                             MostraInfo(TARGET, 0, 0, "HQI Off");}
                         else
                            {digitalWrite(releHQI, LOW);                                                   // se falso desliga Lâmpadas HQI
                             MostraInfo(TARGET, 0, 0, "HQI On");}
                         break;
                     case 2 :
                          if (digitalRead(releT8) == LOW)                                               // verifica se as Lâmpadas T8 estão desligadas
                             {digitalWrite(releT8, HIGH);                                                     // se verdadeiro liga as Lâmpadas T8
                              MostraInfo(TARGET, 0, 0, "T8 Off");}
                          else
                             {digitalWrite(releT8, LOW);                                                       // se falso desliga Lâmpadas T8
                              MostraInfo(TARGET, 0, 0, "T8 On");}
                          break;
                     
                     default:
                     estado = false;
                     password.reset();                                                                                        // vai ler novamente a password, por isso elimina os valores anteriores
                     MostraInfo(TARGET, 0, 0,indisponibilidade);
                     delay(500);
                     MostraInfo(TARGET, 0, 0,"Bloqueado");
                    }
                  value = 0;                                                                                                                         // elimina as teclas anteriores (nova leitura)
                }
                                                             
  if (Key >= 'A' && Key <= 'D')
    {switch (Key)
      {case 'A' :
            if ((digitalRead(releHQI) == HIGH) ||                                                   // verifica se as Lâmpadas estão ligadas
                (digitalRead(releT8) == HIGH) ||                                                           // verifica se as Lâmpadas estão ligadas
                (digitalRead(releMoonlight) == HIGH))                                               // verifica se as Lâmpadas estão ligadas
                {digitalWrite(releHQI, LOW);                                                                  // se verdadeiro desliga as Lâmpadas HQI
                digitalWrite(releT8, LOW) ;                                                                       // se verdadeiro desliga as Lâmpadas T8
                digitalWrite(releMoonlight, LOW);                                                       // se verdadeiro desliga as Lâmpadas Moonlight
                MostraInfo(TARGET, 0, 0, "Calha Ligada");}
            else
                {digitalWrite(releHQI, HIGH);                                                                  // se falso liga as Lâmpadas HQI
                 digitalWrite(releT8, HIGH);                                                                       // se falso liga as Lâmpadas T8
                 digitalWrite(releMoonlight, HIGH);                                                       // se falso liga as Lâmpadas Moonlight
                 MostraInfo(TARGET, 0, 0, "Calha Desligada");}
            break;
       default:
       estado = false;
       password.reset();                                                                                                        // vai ler novamente a password, por isso elimina os valores anteriores
       MostraInfo(TARGET, 0, 0,indisponibilidade);
       delay(500);
       MostraInfo(TARGET, 0, 0,"Bloqueado");
      }
     value = 0;
    }
        }

}


Acredito que a solução esteja mesmo em colocar a função "delay" no sitio correcto, mas sinceramente não estou a ver onde,  :~ :~ :~

HELP


bubulindo

A solucao e nunca usar o delay. Se meteres o delay em qualquer uma das linhas, vais estragar o que ja tens feito.

Podes fazer algo deste genero:

Code: [Select]

//ISTO FICA FORA DE TODAS AS FUNCOES NO INICIO DO FICHEIRO
unsigned long tempo = 0;

// DENTRO DO LOOP
if (millis() - tempo > 1000) { //1000 e um segnudo.
   Serial.print("O QUE QUISERES");
//coloca aqui o resto dos println...
   tempo = millis();
}




e assim, de segundo a segundo o que esta dentro das chavetas sera executado.
This... is a hobby.

NJPinheiro


A solução e nunca usar o delay.

Podes fazer algo deste género....

...e assim, de segundo a segundo o que esta dentro das chavetas sera executado.


Obrigado pela dica, assunto resolvido XD

Pois é, dito assim até parece fácil  :)

E eu que andava de volta do "delay" :~

Go Up