Boa tarde garagistas, depois de muito quebrar a cabeça, elaborei um código simples (nunca é fácil fazer coisas simples), para acionar comandos utilizando minutos.

No meu caso eu precisava de um comando de consultar hora da internet, comparar dois horários e acionar em intervalos diferentes o mesmo motor (no meu caso a bomba do poço);

Nessa ideia eu criei uma função que obtem o intervalo de tempo em UnixTime, e ela compara ela compara o intervalo de acionamento que é inserido em minutos 

unsigned long getTime() { //converte o Time Epoch em segundos
  timeClient.update();
  unsigned long now = timeClient.getEpochTime();
  return now;
}

void interval(int PIN, const unsigned int &min, bool Status) { // pino, minuto, status do pino
  // Non blocking delay
  digitalWrite(PIN, Status);
  unsigned long intervalo = min * 60; // converte minutos para segundos

  unsigned long sec = getTime();  //salva o tempo inicial em EpochTime
  while ((getTime()) - sec < intervalo) { //compara o tempo inicial com o tempo final em relação ao intervalo
    Status = !Status;
    Serial.print("diff   :");
    Serial.println(getTime() - sec); // calcula e exibe os segundos da ação
    hold(1000);
  }
  Serial.print("status :");
  Serial.println(Status);
  hold(1000);
}
ao chamar a função no Loop ou aonde precisar dela, fica da seguinte forma só para fins de exemplo
 
  interval(LED_BUILTIN, 2, true);   // liga  pino X por 2 min
  interval(LED_BUILTIN, 40, false); // Desliga  pino X por 40 min
Abaixo o link do projeto.
o codigo tambem encontra-se em anexo

Exibições: 162

Anexos

Responder esta

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço