Ajuda com programação de sensor de nível

Boa tarde, estou tentando fazer um controlador do nível de um poço que tenho na "roça" que não dá agua o suficiente pra encher a caixa de água de uma vez, ele é estreito (tubo 100mm) e não consigo usar uma boia elétrica tradicional.

Hoje utilizo um sensor de nível resistivo comercial, porém como é na roça, quando tem problemas na rede elétrica ele acaba queimando, e como o circuito é integrado, perco todo o sistema do sensor de nível. Esse sensor trabalha da seguinte forma, verifica se há água no poço artesiano (um sensor de nível mínimo e um de nível máximo), se há água no poço e a caixa não está cheia (tem um sensor de nível na caixa), ele aciona o rele que liga a bomba.

Atualmente consegui um código no youtube que utiliza apenas dois sensores, um na caixa e um no poço, porém dessa forma quando a bomba ligar vai logo baixar o nível do poço e desligar a bomba, gerando assim uma ineficiência.

Gostaria de deixar como é o sensor comercial que uso, que aciona a bomba ao atingir o nível máximo e desliga a bomba ao atingir o nível mínimo, voltando a acionar apenas quando o nível máximo é atingido. Estou nesse etapa, na verdade só fiz algumas modificações no código original pra facilitar o meu entendimento, alterar algumas portas e os sensores estão atuando junto, em redundância.

Se conseguirem me ajudar agradeço muito.

Obrigado

#define pinSensorCaixa 13
#define pinSensorPocoMax 12
#define pinSensorPocoMin 11
#define pinRele   8 
#define pinAlerta 3 

bool estadoCaixa = HIGH;
bool estadoPocoMax = HIGH;
bool estadoPocoMin = HIGH;

void setup() {
  pinMode(pinSensorCaixa, INPUT_PULLUP);
  pinMode(pinSensorPocoMax, INPUT_PULLUP); 
  pinMode(pinSensorPocoMin, INPUT_PULLUP); 
  pinMode(pinRele, OUTPUT); 
  pinMode(pinAlerta, OUTPUT); 
}

void loop() {

  estadoCaixa = !digitalRead(pinSensorCaixa);
  estadoPocoMax = !digitalRead(pinSensorPocoMax);
  estadoPocoMin = !digitalRead(pinSensorPocoMin);

  if ((estadoPocoMin) && (estadoPocoMax)) {
    
    if (estadoCaixa) {
       digitalWrite(pinRele, HIGH);
    } else {
       digitalWrite(pinRele, LOW);
    }
    digitalWrite(pinAlerta, LOW);     
    
 } else {    
  
    digitalWrite(pinRele, HIGH);
    digitalWrite(pinAlerta, HIGH);
 }
}

A falta de parágrafos dificulta a compreensão.

Ok, tem dois sensores de níveis que acionam uma bomba, e o código é simples.

Com o que exatamente precisa de ajuda?
O que o código faz atualmente?
O que deveria fazer?

Editei o primeiro post, vê se melhorou.

São 3 sensores de nível tipo boia, um ficará na caixa e dois no poço (nível máximo e nível mínimo). Pensa num poço cheio de água, quando o rele liga a bomba, o nível da água vai abaixando, e do jeito que está quando atinge o sensor de nível máximo o rele já desliga.

O certo seria ele só desligar quando atingir o sensor de nível mínimo, ai o poço encheria novamente, passaria pelo sensor de nível mínimo e só quando atingisse o sensor de nível máximo, o rele ligaria novamente. Tudo isso acontece apenas se a caixa não estiver cheia. Caso estiver cheia, nada acontece.

Do jeito que está o código, o sensor da caixa funciona, mas os do poço funcionam em redundância, qualquer um dos dois (do poço) que forem ativados desligam o rele. Na prática desse jeito o de nível mínimo nunca será atingido e qualquer enchimento do poço irá ligar o rele, que irá ligar a bomba, que irá esvaziar o poço rapidamente, desligando o rele.

Espero que de pra entender rs.

Você precisa de uma variável auxiliar pra saber se tem que esperar o poco encher.

As variáveis estadoCaixa, estadoPocoMax e estadoPocoMin são usadas apenas dentro do loop, podem ser locais e do tipo booleanas.

Quando usando digitalRead ou digitalWrite, eu acho melhor não tratar como booleano, mas colocar explicitamente as comparações.

Veja como penso que funcionaria o que descreveu:

#define pinSensorCaixa 13
#define pinSensorPocoMax 12
#define pinSensorPocoMin 11
#define pinRele   8
#define pinAlerta 3

bool esperaEncherPoco = false;

void setup() {
  pinMode(pinSensorCaixa, INPUT_PULLUP);
  pinMode(pinSensorPocoMax, INPUT_PULLUP);
  pinMode(pinSensorPocoMin, INPUT_PULLUP);
  pinMode(pinRele, OUTPUT);
  pinMode(pinAlerta, OUTPUT);
}

void loop() {

    bool estadoCaixa = (digitalRead(pinSensorCaixa) == LOW); // Acionado?
    bool estadoPocoMax = (digitalRead(pinSensorPocoMax) == LOW); // Acionado?
    bool estadoPocoMin = (digitalRead(pinSensorPocoMin) == LOW); // Acionado?

    if(!estadoPocoMin && !estadoPocoMax){ // Poço vazio
      esperaEncherPoco = true; // Precisa esperar encher o poço
      
      digitalWrite(pinRele, HIGH);  // Desaciona
      digitalWrite(pinAlerta, HIGH);  // Desliga
    }
    else if(estadoPocoMin && !estadoPocoMax){
      if(esperaEncherPoco){ // Esta enxendo o poço a partir do vazio
          digitalWrite(pinRele, HIGH); // Desaciona
      }
      else if(estadoCaixa){ // Caixa já está cheia
          digitalWrite(pinRele, HIGH); // Desaciona
      }
      else {
          digitalWrite(pinRele, LOW); // Aciona
      }
      digitalWrite(pinAlerta, LOW); // Liga
    }
    else if(estadoPocoMin && estadoPocoMax){
      esperaEncherPoco = false; // Poço já está cheio
      
      digitalWrite(pinRele, HIGH); // Desaciona
      digitalWrite(pinAlerta, LOW); // Liga
    }
}

Parece que deu certo, porém ainda falta uns ajustes. Hipoteticamente falando, nos testes que fiz aqui, quando o poço esvazia e enche de novo, o rele só aciona após ele começar a esvaziar, o que na prática não irá acontecer pois ele só esvazia com o acionamento da bomba. Deu pra entender?

Além disso se iniciar o código com o poço cheio e a caixa vazia, o rele não aciona.

O acionamento da bomba não depende do sensor max do poço.

#define pinSensorCaixa 13
#define pinSensorPocoMax 12
#define pinSensorPocoMin 11
#define pinRele   8
#define pinAlerta 3

void setup() {
  pinMode(pinSensorCaixa, INPUT_PULLUP);
  pinMode(pinSensorPocoMax, INPUT_PULLUP);
  pinMode(pinSensorPocoMin, INPUT_PULLUP);
  pinMode(pinRele, OUTPUT);
  pinMode(pinAlerta, OUTPUT);
}

void loop() {

    bool estadoCaixa = (digitalRead(pinSensorCaixa) == LOW); // Acionado?
    bool estadoPocoMax = (digitalRead(pinSensorPocoMax) == LOW); // Acionado?
    bool estadoPocoMin = (digitalRead(pinSensorPocoMin) == LOW); // Acionado?
    
    bool acionaBomba = ( estadoPocoMin && !estadoCaixa );

    if(acionaBomba){
        digitalWrite(pinRele, LOW);
    }
    else {
        digitalWrite(pinRele, HIGH);
    }

    if(estadoPocoMax){
      digitalWrite(pinAlerta, LOW); 
    }
    else {
      digitalWrite(pinAlerta, HIGH);
    }
}

Olá senhores,

Tenho um problema parecido sobre o assunto. Porém inverso as posições de sensores.
Coloquei dois sensores na caixa de agua, um cheio e um vazio. E um sensor de proteção no poço para que assim que a agua acabe, ele faça o desligamento.

No meu código eu consigo acionar a bomba, quando a caixa está em minimo, e desligar a bomba quando chega em maximo. Consigo até protegem a bomba da falta de agua quando o sensor de poço ativa. MAS não consigo reativar a bomba para que ela continue ligando e desligando, quantas vezes forem possiveis para encher a caixa.
Fora isso meu poço leva 15min para reabastecer, e eu não consigo temporizar isso.

Podem me Ajudar??? Sou novato com arduino e tudo que aprendi vem de4 meses lendo e aprendendo pela internet..

#define sensorAlto 2 //Sensor caixa d´agua nivel alto
#define sensorBaixo 3 //Sensor caixa d´agua nivel baixo
#define sensorPoco 4 //Sensor proteção poço nivel baixo
#define releBomba 7 // Rele acionamento bomba
#define ledVermAlto 8
#define ledAmarBaixo 9
#define ledVerdPoco 10

void setup() {
// put your setup code here, to run once:

pinMode(sensorAlto, INPUT_PULLUP);
pinMode(sensorBaixo, INPUT_PULLUP);
pinMode(sensorPoco, INPUT_PULLUP);
pinMode(releBomba, OUTPUT);
pinMode(ledVermAlto, OUTPUT);
pinMode(ledAmarBaixo, OUTPUT);
pinMode(ledVerdPoco, OUTPUT);

}

void loop() {
// put your main code here, to run repeatedly:
int estadoSNA; //Variavel que armazena o valor lido na Porta Digital
int estadoSNB; //Variavel que armazena o valor lido na Porta Digital
int estadoSNP; //Variavel que armazena o valor lido na Porta Digital

estadoSNA = digitalRead(sensorAlto);
estadoSNB = digitalRead(sensorBaixo);
estadoSNP = digitalRead(sensorPoco);

bool caixaCheia = (estadoSNA);//Estado caixa cheia
bool caixaVazia = (!estadoSNB); // Estado caixa vazia
bool estadoPVazio = (estadoSNP); //Poço vazio proteção da bomba

if(caixaCheia){
digitalWrite(ledVermAlto,LOW);
} else {
digitalWrite(ledVermAlto,HIGH);
}
if(!caixaVazia){
digitalWrite(ledAmarBaixo,LOW);
} else {
digitalWrite(ledAmarBaixo,HIGH);
}
if(estadoPVazio){
digitalWrite(ledVerdPoco,HIGH);
} else {
digitalWrite(ledVerdPoco,LOW);
}

if (caixaCheia) {
digitalWrite(releBomba, LOW);
} else if (caixaVazia) {
digitalWrite(releBomba, HIGH);
} else if (estadoPVazio && !caixaVazia){
digitalWrite(releBomba, LOW);
}

}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.