Como fazer 5 temporizadores com a função millis() no arduino (Resolvido)

Boa Tarde...

Tenho um código que aciona 4 válvulas solenóides, porém preciso criar um temporizador diferente para cada válvula (tempo que vai ficar irrigando). Além dos temporizadores das válvulas preciso fazer um outro temporizador que faça a leitura dessa função. Por exemplo.:

A cada "X" minutos faz a comparação dos valores dos sensores para ver se é necessário irrigar;

Com base nessa comparação aciona as válvulas.:

Válvula 1 - "X" minutos

Válvula 2 - "X" minutos

Válvula 3 - "X" minutos

Válvula 4 - "X" minutos

Estou tentando aqui mas não estou conseguindo... 

Muito Obrigado a todos....

Segue anexo o código no pastebin para darem uma olhada.:

https://pastebin.com/dpP67yXp

Exibições: 1779

Responder esta

Respostas a este tópico

Eu já fiz isso usando Millis e uma variável long para cada timer. Não é a forma mais adequada mas funciona, e também não vai ter muita precisão nos tempos, pois o tempo de processamento vai influenciar.

Na época eu utilizei como base o exemplo Blink sem Delay, e fiz 4 deles.

Usar um RTC seria mais adequado, pois ele vai gerar a base de tempo sem precisar do microcontrolador, e você só compara os valores.

Tenho um módulo RTC já conectado e funcionando pois preciso armazenar os horários de irrigação...

É esse módulo? Se for, como faço para pegar o tempo através dele?

Obrigado!!!

Capture o tempo atual do RTC quando iniciar o processo de irrigação.  Depois vá comparando o tempo atual com o tempo que deseja que fique irrigando.

https://www.robocore.net/tutorials/modulo-rtc-arduino.html

https://portal.vidadesilicio.com.br/real-time-clock-rtc-ds3231/

https://www.filipeflop.com/blog/relogio-rtc-ds1307-arduino/

Eu faria o seguinte:

Opção 1: por tempo mesmo.

Supondo que a resolução de 1 segundo seja suficiente (para irrigação parace otimo, também poderia ser minuto).

Criaria uma interrupção de tempo com uma parte sendo executada a cada segundo.

Se tiver RTC vc pode usar um if com (segundo anterior<>segundo atual). Se não tiver conte o tempo mesmo.

Aqui vc tem um exemplo apra meio segundo:

https://playground.arduino.cc/code/timer1

Crie contadores long para os segundos fechado e aberto e um flag para falar se está fechada ou aberta cada valvula.

Aih

se esta fechado, se chegou no final da contagem fechado abre e zera esse contador senao incrementa ele.

se esta aberto, se chegou no final da contagem aberto abre e zera esse contador senao incrementa ele.

Repete isse trecho para cada contador de valvula. pode ser uma matriz.

Feito!

Opção 2: por agendamento.

Cria um relogio de tempo real completo, com hora, minuto e segundo. Se com RTC melhor.

Cria uma matriz de hora, minuto e segundo para agendar o ligamento e desligamento de cada valvula.

Seja qual for o metodo, sugiro:

- Ligar apenas 1 valvula de cada vez. Isso faz a pressão da agua ir apenas em um ponto, fazendo ele trabalhar melhor. Se vc abre 2 e um está mais perto que o outro ou tem uma regulagem diferente nitidamente um solta um jato medio e o outro um ruim. Já com uma de cada vez o jato é sempre máximo.

- Fazer no programa principal uma rotina de calculo desses tempos em função dos sensores, nunca na interrupção. Interrupções precisa ser breves. Nunca use delay() ou fique fazendo loopinhos desnecessários, leitura de ads, etc.

- Vc pode fazer uma mistura dos 2. Colocando um alarme que manda disparar a irrigação em determinada hora, colocando um contador de tempo em segundos para desligar de volta. ficaria mto legal.

Eduardo,

Muito Obrigado!!! 

Tenho um RTC DS3231 e estou tentando fazer como vc disse mas ainda não consegui, sou um pouco leigo na programação... O tempo que vou ter que deixar cada válvula aberta é:

válvula 1 = 1 minuto

válvula 2 = 2 minutos

válvula 3 = 3 minutos

válvula 4 = 4 minutos

Pois ainda faremos mais alguns testes para saber exatamente sobre esse tempo.

Com relação a quantidade de válvulas que serão abertas, estamos usando gotejadores autocompensantes tentando corrigir essa questão da pressão da água...

Infelizmente ainda não consegui... Como faço para armazenar o horário do DS3231? E como faço para comparar com os intervalos? 

Muito Obrigado!!!

Bom dia H,

escrevi um sketch "genérico" uma vez que desconheço mais detalhes do seu projeto.

Adapte suas necessidades e definições à ele e acho que funcionará como você quer.

Anexo sketch.

Usei millis (), pois para esta faiva de tempos ela atende muito bem ecsimplifica a montagem, por dispensar modulos externos.

RV

Anexos

faixa*  e simplifica*

Muito Obrigado!!!

Deu certo aqui.... Nem sei como te agradecer... Salvou o dia...

Abraços...

use a lógica desse exemplo que da certo

https://www.baldengineer.com/millis-ind-on-off-times.html

O millis tem uma parte chata, que a execução ocorre a partir do estouro da contagem, Se esta ligado, Aguarde X minutos, mude o status,  então aguarde X min. 

mas geralmente ele inicia em OFF rsrs 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço