Criar um intervalo de 3 dias no arduino sem interromper o programa

Boa tarde! Estou desenvolvendo um projeto pára o meu TCC da faculdade, mas me deparei com um probleminha. 
O projeto - Preciso que um processo de filtração atue quando chover, e que este processo só volte a acontecer após 3 dias.
Porém esta é só uma fase do sistema, e o processo não pode parar esperando estes 3 dias passarem (preciso de um contador que fique contando, enquanto o arduino continua executando os loops e funções normalmente)
Alguém poderia me ajudar? Grato!!!

Exibições: 806

Responder esta

Respostas a este tópico

Use um RTC.

Abs.

muito obrigado! meu gmail é rafax8@gmail.com

Anotado!

Abs.

coloque um delay de 1 minuto dentro do loop (delay(1000)).

use um contador para contar cada passagem pelo loop.

use um if para ver se o contador chegou a 3 dias (3 * 24 * 60 minutos) .

Se não chegou, execute as funções normalmente.

Boa sorte,

  'Eiju

Eiju, o problema da sua sugestão é quando o arduino resetar, como por exemplo quando houver falta de luz.

Se o arduino resetar, a contagem reinicia, causando a quebra da "regra"  que é atuar a cada 3 dias.

Talvez a solução mais confiável seja mesmo um RTC aliado a gravação de dados na EPROM ou SD Card, dados este que consistem em manter o arduino informado sobre quando ocorreu a última filtragem de água.

Dessa forma, asbendo-se quando ocorreu a última filtragem de água, faz-se o cálculo de quanto tempo se passou e então toma-se decisão se deverá haver ou não nova filtragem

Por favor, inclua todos os requisitos do seu projeto.

Estou colocando a resposta conforme analiso o problema.

Caso não tenha um no-break, havendo a falta de luz, pode até ocorrer no momento que vence os 3 dias.

Se não precisar de precisão no período pode-se até filtrar quando retornar a luz para garantir.

Ou talvez seja mais adequado medir a qualidade da água.

Tudo depende do que o projeto precisa.

Boa sorte,

  'Eiju

é um sistema de gerenciamento hídrico para fazendas. Iremos aproveitar a água do telhado dos galpões para abastecer a fazenda. A norma fala que podemos utilizar águas pluviais desde que seja realizado o first-flush(primeiro descarte) a cada 3 dias sem chuva, num intervalo menor que este, não é necessário pois não acumula sujidade considerável. este first flush é o que chamei de filtragem, e no nosso caso, o período é importante sim, deve atender esta exigência. Haver dados guardados num RTC ou na eeprom realmente ajudaria muito, pois numa falha, é importante que estes dados estejam armazenados.

Galera,

   A resposta do Eiju não esta totalmente incorreta,  esta apenas incompleta.

   A coisa vai depender do nível de precisão,  tipo,  se realmente só precisa contar em dias ou horas,  basta pegar a implementação do Eiju e a cada lapso de tempo,  tipo,  a cada uma hora,  fazer um conter tipo ++  em uma variável salva na eeprom interna.

   Dai o conter não precisaria ser por dias,  mas por minutos tipo,  a cada 60 minutos some mais um a variável existente.

    Dai é facil  1 dia = 24 horas   3x24 = 72   logo,  quando a variavel na eeprom chegar ao valor 72 ou qualquer valor desejado,  ativa o sistema e manda a variável voltar pra 0 (zero) e começa tudo novamente.

     Se rolar do arduino resetar ou qualquer coisa  tipo um watchdog não rola trauma,  ele só vai voltar a contar os minutos pra fechar uma hora.

     Logo,  se precisar de precisão absoluta, porem, utilizando algo externo,  não tenha duvida, vá de RTC,  porem,  se precisar  de implementação minima,  com o minimo de componentes,  Então siga a ideia do Eiju com o adendo acima.

show de bola weider! consegui entender, eu usaria contador para realizar a contagem de tempo certo? porém este delay de 1 minuto no início do loop não travaria meu programa durante 1 minuto?

Muito obrigado por explicar Weider.

Está correto, este delay de 1 minuto travaria seu programa por 1 minuto.

Não sei se vai fazer diferença ter 1 minuto de inatividade. Calculei assim pensando na imprecisão de 3 dias. Como ainda informou o que pretende fazer no intervalo de 3 dias, não sei qual o impacto de 1 minuto de inatividade. Com a informação que proveu até agora, não tem impacto nenhum.

O RTC é uma ótima opção também.

Porém, se o sistema for alimentado a bateria, mesmo usando o RTC, considere usar o delay fazendo o sistema todo "dormir" economizando a carga da bateria.

Entendo, está fase do sistema é a captação de água de chuva. Posteriormente, tenho um tanque monitorado em tempo real que recebe água de chuva e na falta desta, comuta recebendo água de um rio (para manter o sistema abastecido). Tenho também adiante um sistema de irrigação com sensores de umidade do solo, intertravados com válvulas solenóide para liberar a irrigação das áreas secas. Este é o problema, não pode haver pausas para não comprometer a cadeia

Olá Rafael,

    Cara mais uma vez o Eiju tá correto,  mas precisa de um adendo pra complementar.

    Respondendo sua pergunta: SIM,  se você utilizar Delay() você vai ter uma interrupção no seu sistema.

    Porem, se você abrir a IDE do arduino, for em ARQUIVO / EXEMPLOS / DIGITAL você encontrará o sketch BlinkWinthOutDelay,   trata-se do mesmo sistema de contagem porem, sem interrupção,  utilizando a função mills().

    O que é importante salientar aqui:   Quando muitos usuários vão avançando no mundo arduino passam a achar que o uso de mills() é avançado e delay() é coisa pra iniciante, ISSO É UM ERRO!   ambas as funções são importantes, e a verdadeira evolução vem da capacidade de saber quando usar uma ou a outra.

   De regra geral seria algo mais ou menos assim:

Quando usar mills():   Quando no intervalo de tempo em que se deseje a pausa de uma função, deverá estar ocorrendo outras atividades,  exemplo,  digamos que você deseja piscar um led a cada 2 segundos, porem,  nesse intervalo você deseja que um sensor qualquer como um de temperatura detecte se ouve variações e acione um buzzer,  pra isso se usa o mills()  ele fará piscar o led mas não interromperá as demais funções do sketch.

Quando usar delay():  Quando não há outras funções a serem realizadas naquele intervalo de interrupção,  ou quando se deseja economizar código,  visto que o delay é feito com uma linha simples, já o mills() precisa de implementação.

Logo, você escolhe,  e vai depender do seu projeto.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço