Arduino sem delay travante

Olá amigos, estou com um problema com um de meus projetos em relação ao uso do DELAY. Pesquisando eu descobri que DELAYs são pausas na execução do Sketch e quanto mais usarmos delays no nosso projeto mais ele ficara lento e é justamente esse o meu problema.

Meu projeto é assim:

Ele faz a leitura de uma porta digital e se ela for HIGH ele aguarda 15 segundos e manda HIGH para uma saída que por exemplo acenderá um LED. Esse LED deverá ficar aceso por 5 minutos e ao findar esse tempo ele faz a leitura de outra porta digital que se a mesma for HIGH ele envia LOW para o LED.

Essa é apenas uma parte do meu projeto que estou usando aqui como exemplo, o projeto é maior e tem muitos outros DELAYs. A parte mais importante que não esta funcionando como devia justamente por causa dos delays é uma parte referente a SEGURANÇA do projeto que se trata de de uma porta digital que se receber um pulso HIGH ela envia LOW para uns relés de imediato. O pulso esta chegando na porta, mas o sketch esta lento demais e não atua, apenas atua se o pulso for longo.

Por isso eu quero refazer esse projeto sem usar DELAYs, quero usar outro método de pausa, porém desconheço outro método. Já pesquisei sobre o millis() mas só achei pessoas ensinando a fazer blink. Se puderem me ajudar ficarei muito grato! Essa também pode ser a duvida de outras pessoas. Obrigado!

Eu uso o millis(), mas já vi pessoas relatando que usam outras formas também.

O problema do delay é que ele paralisa todo o sistema durante o tempo de pausa, inviabilizando operações em paralelo.

Tem algumas informações sobre o millis() no seguinte tópico: http://forum.fazedores.com/t/usando-a-funcao-millis-ao-inves-do-delay/1359

Na verdade nenhuma das duas funções viabiliza ou inviabiliza operações em paralelo, para fazer operações em paralelo, deveríamos ter mais que um core de processamento e suporte a threading, o que não é o caso e, independente da técnica utilizada, o programa sempre irá correr na ordem em que foi escrito.

As funções de delay, servem exatamente para isso, dar uma pausa no sistema por um determinado período de tempo, nada mais, se é isso que a pessoa precisa, não vejo o porque não usar. Se há um problema no programa, não vejo como poderia ser um delay o causador.

A função millis apenas retorna o tempo (em ms) desde que o MCU passou a funcionar, se você precisa dessa informação, então essa é a função a ser utilizada e, fazendo as devidas conversões, pode chegar ao número de dias, minutos ou horas que o sistema está em funcionamento, este é o principal objetivo dessa função. No exemplo apontado, é interessante para demonstrar o funcionamento diferenciado, mas não é nada que não possa ser alcançado de forma mais simples e adequada com um delay.

Ainda existem alguns problemas em usar millis para esses objetivos:

  1. O valor de retorno da função é do tipo ulong, ou seja, a cada ms que passa, vai se abusar da limitada RAM (Flash) do MCU copiando vários tipos similares ao do retorno, em suma, dependendo do programa, ele ficará maior e possivelmente mais lento;
  2. Ainda em relação ao tipo, se o sistema for rodar por longos prazos, vai ser uma idéia ainda pior, pois o retorno deve levar um baita overflow em uns 50 dias, ou seja, o tipo tem um limite e esse limite vai estourar, fazendo com que, dentro de algum tempo, o valor retornado volte a 0.

Não posso dar uma ajuda para seu projeto sem maiores explicações, exposição de código e etc, não entendo várias partes do que tentou explicar, mas fica a minha contribuição, se seu programa está ficando muito complexo, simplesmente divida-o em mais partes, funções, coloque comentários, é uma questão apenas de administrar a complexidade.

@DannyFullbuster você terá que utilizar algum dos TIMERS do Atmega e trabalhar com as interrupções dos mesmos.

Só assim você poderá trabalhar em paralelo a contagem de tempo.

Creio que será interessante você montar uma rotina onde você enviaria valores de tempo para o TIMER escolhido.

Só uma ressalva, uma rotina do tipo DELAY normalmente é um loop fechado onde uma variavel envolvida é decrementada ou incrementada até atingir um determinado valor que é o tempo configurado para o DELAY.

Abraços,

Olá. Não sou especialista, mas achei uma informação que talvez seja útil. Veja o site

Segundo o site é possível usar menos DELAY usando AIKO EVENTS