Amigos,

montei um sistema de irrigação para minha roça (segue fotos), mas me deparei com o seguinte problema, de vez em quando era necessário o acionamento de setores de irrigação fora do tempo que estava programado no arduino, e com o projeto atual isso não foi possível, porque ele esta programado com os horários pré definidos, queria poder pausar (se é que esse é o termo) a programação para poder acionar os comandos que eu precisar de forma manual e depois ao religar ou despausar o arduino gostaria que ele retornasse de onde a programação foi parada, e não reiniciasse como é de costume queria se possível que a comutação Manual/automático fosse acionado por uma botoeira como a da foto, isso é possível? desde ja agradeço

Exibições: 3378

Anexos

Responder esta

Respostas a este tópico

a maior dificuldade que vejo agora é como implementar todos os 8 setores, sensores, e as três saídas de bomba e entrada de sensores de nível no projeto do Rodrigo, ele me passou todo o scketck só que eu não sei como adicionar esses componentes lá entende, alem dessa transição de AUTO/MANUAL

Eu não entendo muito de Arduino, trabalho com PIC.

No PiC tem a opção de criar uma interrupção. Quando é acionado um botão, ele para tudo o que está fazendo, vai pra uma rotina pre determinda, e terminado essa rotina, ele retorna de onde parou antes de se acionar a interrupção.

Não tem algo similar no Arduino?

Espero ter ajudado.

Jonas, bom dia.

Eu também seguiria pelo caminho das interrupções, creio que seja um meio mais prático para isto. Para tua aplicação em especifico, acho que usar a relayboar (a vendaaqui no site do LdG), assim vc poderá acionar N setores :)

Obs: Ficou top o painel hein!

Abraços e boa sorte.

obrigado, pelo que entendi seria mais ou menos assim:

while(Buttonstate = 1){

toda a logica automatica...

}

While(buttonstate== 0 )

{

toda a logica manual....

}

certo?

Eu acredito que não é bem assim.

Na verdade você deve habilitar uma interrupção, pode ser um botão mesmo.

Quando ele é acionado, ele interrompe o que está fazendo, executa uma rotina, e volta exatamente onde ele parou antes da interrupção.

Do jeito que você colocou, se ele estiver executando essa rotina:

while(Buttonstate = 1){

toda a logica automatica...

}

ele vai ter que esperar terminar toda ela pra verificar novamente o estado do botão.

Com a interrupção, ao ser acionado o botão, ele pára imediatamente o que está fazendo.

Deu pra entender ou compliquei a explicação?

Abraços

Do jeito que o Marcelo Betim respondeu, sim.

Sim... e não!

Depende como for construída as funções Manual e Automatica.

Mas pro exemplo que você utilizou (com While) tens perda de eficiência.

Observe o pseudocódigo:

ENQUANTO estado do botão IGUAL A 1  //teste 1

FAÇA { Chamada da função automática}

ENQUANTO estado do botão IGUAL A 0  //teste 2

FAÇA { Chamada da função manual}"

Temos aí 2 testes enquanto UM IF resolveria.

É como usar 2 IFs em sequencia no lugar de ELSE IF.

Ok, vamos entrar no teu problema agora...

1)O programa tem 2 modos de operação:

Você já tem os 2 modos programados no formato de função? Ex.: void automatic() {...} / void manual(){...}

Vai facilitar a sua vida.

2) Você falou em reiniciar ou desligar o Arduino, mantendo a programação: Precisar salvar os setpoints em memória não volátil. Ex: EEPROM.

Ainda mais na zona rural onde queda de energia é algo comum.

3) Funcionamento da transição:

O sistema está no Modo Automático, programado para acionar daqui a 15 minutos durante o período de 2 minutos (setpoints do operador). Porém o operador resolve ativar o modo manual e deixa acionada a irrigação por 3 minutos. Depois desliga e volta pro AUTO. O sistema deverá desconsiderar a próxima ativação, uma vez que o solo já está encharcado, ou deve "continuar de onde parou" (como você disse) e ativar novamente "daqui a 12 minutos" (já passarem 3 dos 15 que faltavam)?

O seu problema nesse sistema esta mais nesse ponto (transição) do que em qualquer outro ao meu ver.

4) Alterar entre Manual e Automático você faz com IF, não precisa de Interrupção para este projeto em específico (até porque o estanque da água não é instantâneo para justificar a necessidade de interrupção abrupta da execução.

Mas novamente, depende de como foi construida as funções dos modos de operação.

Se encheu de DELAY, vai ter que esperar terminar o ciclo em execução, como apontado pelo Marcelo Betim.

Exemplo com IF:

loop principal {

//instruções globais

SE estadoChave IGUAL a 1   { 

       automatic();

   }

  SENÃO {

        manual();

  }

}

Outra opção seria o SwitchCase, viável caso houvessem mais modos de Operação.

não manjo de interrupção, mas se ele tem 8 setores, a interrupção faria uma pausa em todos certo? por meio dos marcos em função de um RTC ele poderia pausar somente os setores que precisar...

teria que substituir os delays por if comparando a um RTC,

se (AUTO == 1){

  se (HoraLiga + incremento >RTC < HoraDesliga + incremento){

    aciona irrigação

  }se não

    desliga irrigação

} se não

   incremento = HoraRetorno - HoraPausa (aqui vc vai ter que fazer uma rotina para identificar os pontos de acinamento troca Auto-Manual)

   RotinaManual

}

vai ficar um pouco complexo, principalmente considerar as viradas de dia...mas acho que seria uma boa.

voce poderia tratar cada setor separadamente...

A interrupção para o programa principal e retorna de onde parou (o ponteiro é guardado em memória volátil) após a execução do trecho de código interno a interrupção.

É uma Interrupção da sequência do programa e não uma quebra(break;) de sequência.

Amigo, muito obrigado, você entendeu exatamente o que eu queria, no caso desejo que o painel trabalhe temporizado (no modo automatico por exemplo setor 01 lidar por 10 min e desligar por 1 hora...setor 2... de mesmo mode etc...) já no modo manual gostaria que o sistema automático parasse de trabalhar e eu pudesse acionar as saidas, no caso bombas e solenoides pelas botoeiras que irei instalar em cada setor, e quando voltasse a acionar o modo automatico ele continuasse de onde parou, por exemplo caso ele estivesse irrigando o setor 3 continuasse de la e não voltasse desde o primeiro, entende, neste caso como ficaria a programação?

acho que a base poderia ser +/- como citei... só que com VARIOS detalhes ahahahah

este modo automático faz uma sequencia nos setores, ou eles agem separadamente?

ex1: parou o setor 3 todos param, e volta no mesmo ponto 3? (sequencial)

ex2:  parou o setor 1 os outros (2 a 8) continuam sua rotina, apenas o setor 1 voltara do ponto em que foi interrompido? (agindo separadamente)

no caso 1 acho que poderia pensar na interrupção citada, ai pode deixar com delays mesmo

no caso 2 seria como citei.

é sequencial mesmo tipo 1,2,3...8 o que eu não quero é que quando sair do manual e voltar ao auto, ele comece do setor 1 de novo, por exemplo se ele já estiver irrigando o setor 4; os setores 1, o 2 e o 3 já foram irrigados; logo após o 4 ele na sequencia ao quatro irrigaria o 5 até o 8, a menos que seja interrompido pelo modo manual, em que eu poderia acionar e des-acionar os setores que eu quisesse. Porem ao voltar ao modo automático, gostaria que ele continuasse de onde foi interrompido, por exemplo do setor 4 na mesma contagem de tempo

espero não ter complicado kkkk

RSS

© 2023   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço