Bom dia amigos. Estou com um projeto aqui e não estou conseguindo identificar onde está o erro, Tenho um sistema de reaproveitamento de água em minha residência no qual existe um reservatório menor em baixo com uma bóia que indica que está cheia e pronta para ser bombeada, e um reservatório maior em cima com uma bóia de nível máximo que indica que a caixa está cheia e que o bombeamento deve ser interrompido. Quando a bomba é acionada, um tempo começa a contar até que esse reservatório menor esteja vazio, pois não existe uma bóia de nível inferior e se caso a bóia superior acionar a bomba deve parar para que não transborde. Coloquei também um acionamento manual caso precise acionar manualmente. 

O código está funcionando em partes, porém a interrupção ainda está falhando.

 Me desculpem se não consegui me expressar direito, pois ainda estou me familiarizando com programação. Segue o código que estou trabalhando:

const int boia1 = 4; // bóia de nivel maximo de baixo (verde)
const int boia2 = 5; // bóia de nível maximo cima (laranja)
const int manual = 3; // acionamento manual(roxo)
const int bomba = 7; // bomba de agua (azul)
const int sensor = 2; // boia de nivel minimo de baixo (amarelo)

int estadoBoia1 = 0; //variável para ler o status da boia de baixo
int estadoBoia2 = 0; //variável para ler o status da boia de cima
int estadoManual = 0; //variável para ler o status do botão manual


void setup() {
// initialize the LED pin as an output:

pinMode(bomba, OUTPUT);
pinMode(boia1, INPUT_PULLUP);
pinMode(boia2, INPUT_PULLUP);
pinMode(manual, INPUT_PULLUP);
attachInterrupt (digitalPinToInterrupt(boia2), bombaParada,LOW);
// interrupção caso a caixa esteja totalmente cheia

}

void loop() {

estadoBoia1 = digitalRead(boia1);
estadoBoia2 = digitalRead(boia2);
estadoManual = digitalRead(manual);


if ((estadoManual == LOW)&&(estadoBoia2 == HIGH)) // acionamento manual
{
digitalWrite(bomba, HIGH); // bomba ligada
}else{

if (estadoBoia2 == HIGH) {

if (estadoBoia1 == LOW) {

digitalWrite(bomba, HIGH); // bomba ligada
delay (5000);
} else {

digitalWrite(bomba, LOW); // bomba desligada
}
}

}

}
void bombaParada () {

digitalWrite(bomba, LOW);

}

Exibições: 944

Responder esta

Respostas a este tópico

olá Luciano.

      Sua descrição do Sistema e de que como ele deve funcionar, está muito boa.

      Baseado nela, irei criar um Diagrama de Estados que atenda este funcionamento e então implementarei uma Máquina de Estados a partir do Diagrama.

      No entanto, peço que informe os seguintes pontos:

      1) qual Arduino vc está utilizando.

      2) quais pinos do Arduino está utilizando para acionar as Bombas e ler o estado dos "sensores".

      Estas informações possibilitarão que eu implemente também no Sistema, uma simulação no Proteus, de forma que se possa ver o funcionamento sob diversas condições.

      Sobre Máquinas de Estado, peço que veja este Link:  Máquinas de Estado - LDG

      Abrçs,

      Elcids

      ah, desculpe, esqueci que seu código está "postado" junto ao seu texto (esta é uma prática que o pessoal aqui no LDG não recomenda).

      Então sobre os pinos usados acredito estar claro.

      Mas ainda assim não está descrito o Arduino usado.

      Abrçs,

      Elcids

Olá! O arduíno que estou utilizando é o "UNO R3" . Vou me atentar á sua recomendação de não postar o código junto ao texto. Obrigado pela atenção.

ok Luciano.

      Estarei analisando o seu código e principalmente as condições de funcionamento do Sistema com os dois Reservatórios e os elementos de controle (Bomba, Sensores do nível d'água, e um botão para controle "manual").

      Então implementarei o Diagrama de Estados e em seguida a Máquina de Estados, juntamente com a simulação no Proteus (para verificar o funcionamento).

      Tentarei ser rápido no processo, uma vez que é um caso de necessidade mais "real".

      Ah sim:  não se preocupe pois o código resultante será simples e de fácil entendimento (mas confiável, sem bugs, e facilmente ajustável caso você deseje alterar as condições de funcionamento).

      Caso eu tenha alguma dúvida em algum momento sobre como o Sistema deve se comportar,  estarei perguntando aqui.

      Abrçs,

      Elcids

olá novamente Luciano.

      Analisei seu código. Neste momento, três dúvidas ficaram sobre o funcionamento:

      1) sobre o tempo de acionamento que vc conta após acionar a Bomba D'água (e que são 5 segundos no seu código), qual será exatamente o tempo real (imagino que seja mais de 5 segundos).

      2) este tempo de acionamento da Bomba D'água  é utilizado como uma medida de segurança?  Ou seja:  este tempo é um recurso para evitar que caso a "boia 2" venha a falhar na indicação de que o Reservatório 2 está cheio, isto evite o transbordo?  Pergunto porque isto afeta a forma de funcionamento, e preciso saber as condições que determinam cada acionamento no Sistema (e assim poder implementar um Diagrama de Estados que atenda as necessidades do Sistema).  Vc deixou no código um tempo de apenas 5 segundos, e este valor de tempo não permite tirar conclusões sobre o funcionamento.

      3) há no seu código, a definição de um "sensor" que indicaria nível mínimo (o tal "amarelo"). Você confirma que isto realmente não será utilizado e que está "sobrando" no código ?

      Aproveito também para dizer, que a utilização de Interrupção (no caso vc usou para a "boia 2"), não é necessária no seu Sistema. Então a implementação será feita sem o uso de Interrupção.

      Abrçs,

      Elcids

Olá, vou esclarecer de acordo com os tópicos:

 1) Esse tempo é apenas para testes, o tempo real é de aproximadamente de 70 segundos. 

 2) Esse tempo é de segurança sim, mas é o tempo necessário para que o reservatório de baixo se esvazie, mas não completamente, para que a bomba não fique ligada sem água e caso o sensor falhe. Esse sensor sim é que tem relação com esse tempo.

 3) O sensor não está no programa porque ainda não fiz a instalação dele. (ele ficará no fundo do reservatório de baixo), vou jampear, mas depois farei a instalação dele no sistema.

 4) Se funcionar sem a interrupção não tem problema, mas eu preciso que, quando a boia 2 acione, tudo pare até que ela mude de estado,  inclusive a contagem do tempo (reset), porque senão a caixa irá transbordar

  DESDE JÁ AGRADEÇO

Ok Luciando, ficou claro.

      No entanto, que tal vc acrescentar a descrição de como irá usar o tal sensor (o "amarelo"), pois assim já implemento a Máquina de Estados considerando o mesmo, e incluo uma flag que permite vc "jumpeá-lo" no código caso deseje (até que vc o instale no Sistema "real").

      Ah sim: caso em uma análise mais cuidadosa eu encontre alguma forma de aumentar a segurança na lógica para evitar transbordo, irei te avisar antes e caso vc concorde, aplicarei isto à Máquina de Estados.  Lembre-se:  Máquinas de Estados tem versatilidade extrema, ou seja, você pode facilmente mudar o comportamento do controle do Sistema fazendo poucas alterações (desde que se saiba a forma correta de fazer isso), então isso ajuda muito a acrescentar ou eliminar elementos de controle no Sistema.

      Abrçs,

      Elcids

Este sensor "amarelo" ficará no fundo do reservatório onde fica a bomba d'agua, ele tem a função de impedir que a bomba fique ligada caso este reservatório esteja  completamente vazio. já aconteceu da bóia 1 travar e a bomba ficou ligada até eu perceber e desligar manualmente.

ok Luciano.

      Vou então assumir essa funcionalidade (semelhante ao tempo de acionamento que vc especificou)  para este sensor "amarelo". Ou seja, será um elemento "adicional" para evitar que a Bomba fique acionada caso o "Reservatório 1"  seja esvaziado.

      Caso apareça alguma outra dúvida (acredito que não será o caso), então perguntarei aqui. E caso vc deseje acrescentar alguma outra funcionalidade, basta postar aqui.

      Abrçs,

      Elcids

olá novamente Luciano.

      Estou publicando a implementação do seu Sistema, conforme as descrições de funcionamento, e conforme os pontos que elucidamos.

      Na implementação, incluí o tal "sensor amarelo", que seria uma bóia (ou semelhante) que indica quando a "caixa baixa" está vazia.  Como todos os sensores descritos no seu código original indicavam estado "LOW" quando acionados, então assumi esta mesma característica para o "amarelo".  Com isto, nenhuma ação é necessária caso vc não monte o respectivo Sensor, uma vez que os "pullups" do Arduino UNO  irão prover o estado "HIGH" (indicando assim que não há acionamento se o sensor não estiver montado no circuito).

      Para a Máquina de Estados, somente dois estados foram necessários.  Você pode ver o Diagrama de Estados na figura a seguir:

(clique na figura para "zoom")

      Como vc pode ver na figura anterior, o funcionamento é bastante simples, e praticamente dispensa explicação. Mas caso tenha alguma dúvida, não deixe de perguntar.

      Para a simulação no Proteus, incluí um Relé para acionar a Bomba d'água (a qual estou representando através de um Motor),  pois imagino que seja desta forma que vc está acionando a mesma.

      Se vc estiver usando Relé, atente para transientes durante o chaveamento da Bomba, especialmente quando a mesma é desligada, pois podem interferir no UNO (podem até travar o mesmo).  Caso tenha problemas com transientes,  procure usar snubers e ligar os 'GNDs" adequadamente (evitando loops de terra).  Claro, a ocorrência desse tipo de problema vai depender da potência da Bomba que vc está usando, mas como está usando para bombear água (geralmente com inércia baixa), então acredito que no seu caso não ocorreriam transientes a ponto de provocar problemas.

      A simulação funcionou perfeitamente conforme previsto. O Sistema usado nesta simulação é mostrado na figura a seguir:

(clique na figura para "zoom")

      Observe que quando acionar as chaves que "emulam" os sensores na simulação,  isto deve ser feito seguindo a lógica de funcionamento real, uma vez que é desta forma que foi pensado na implementação. Mas claro, vc pode eventualmente acionar algo simulando uma falha qualquer.

      Deixei na simulação o "Terminal do Arduino", embora no código ele não esteja sendo usado.

      O código e os arquivos para simulação, juntamente com o Diagrama de Estados (em PDF e Visio) estão aqui neste link:

       bomba_dagua_01.zip

      No código, eu deixei o "Tempo de Acionamento" em 20 segundos (apenas para a simulação ser mais dinâmica). Este tempo está definido logo no início do código, ou seja, de fácil alteração (inclusive especificado em segundos).

      Um detalhe importante:  implementei também um "debouncing" quando os sensores são acionados. Então isto resultou em rotinas um pouco maiores para tratamento dos sensores e do Botão. Aconselho que vc mantenha esta característica. Fique tranquilo, pois a forma como foi feita a implementação do "debouncing",  não afeta os tempos de resposta dos acionamentos.

      Também note que o Botão existente no Sistema, tem dupla função:  acionar ou desacionar a Bomba.  O funcionamento é no modo "toggle", ou seja:  se a Bomba estiver desacionada, será acionada, e vice-versa.

      Espero que atenda suas expectativas,  e por se tratar de uma questão relativamente comum, também atenda a outros que venham a precisar de algo semelhante.

      Mais uma vez, se tiver alguma dúvida não deixe de perguntar.

      Abrçs,

      Elcids

   Boa noite Elcids. Me desculpa aí a demora pelo feedback, é que tive de fazer uma viagem à trabalho e fiquei essa última semana sem mexer nesse projeto. O código ficou muito profissional, fiz uma simulação aqui no protoboard e funcionou direitinho. Vou estudar aqui o que você fez, porém está um pouco além do meu conhecimento, mas as partes básicas onde vou precisar alterar ficaram bem fáceis de mexer. Gostaria de agradecer de imediato sua dedicação pois ficou muito completo, e as figuras ajudam muito no entendimento. Quando eu colocar para funcionar em campo te dou o retorno aqui. Só fiquei um pouco na dúvida sobre os snubers que você disse, mas vou pesquisar sobre o assunto. E também tenho que ver se vou ter esses transientes, pois a bomba que estou usando é de 1/2 cv. 

   Desde já agradeço.

olá Luciano.

      Legal que vc gostou da implementação. 

      Sobre o snuber, eu acredito que vc não precisará, mas fique atento. Geralmente quando se aciona solenóides, é o pior caso (e normalmente o problema de transientes é sempre pior no momento que o solenóide é desligado).  Mas acionando/desacionando o motor da bomba acredito que não haverá problemas, já que vc disse que sua bomba tem apenas 1/2 CV.

     Aproveito para atualizar um ponto. Recentemente em outro post, usei a mesma lógica do Botão que eu tinha usado no seu código, e embora tenha funcionado, percebi um efeito colateral muito pequeno (quase imperceptível, e está relacionado com o anti-bouncing que implementei).  Então alterei o código relacionado à rotina do Botão, para que não ocorresse o efeito colateral, funcionando melhor em todas as situações.

      O código alterado é apenas da rotina "verifica_Botao". Na figura a seguir vc pode ver a rotina já alterada:

(clique na figura para "zoom")

      Como eu disse, alterei penas a rotina "verifica_Botao", e mais nada.  Mesmo assim aconselho vc a usar o código com a rotina alterada, pois assim terá um código melhor para todas as situações.

      Aqui está a implementação com a "correção":    bomba_dagua_01a.zip

      Caso tenha alguma dúvida, não deixe de perguntar.

      Abrçs,

      Elcids

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço