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