Go Down

Topic: Função delay (Read 517 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.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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