Controlador de depósito de agua


Se trata de un controlador basado en arduino para el llenado de un deposito de agua.
Se puede armar con un adruino, o con la PCB que he diseñado para el chip ATMEGA328p, que se puede adquirir muy barata en jlcpcb.com
puedes encontrar el proyecto y descargar el archivo gerber para hacer el pedido aquí: https://easyeda.com/Hectorin/Control-deposito-de-agua
Si haces la versión con PCB puedes adquirir el chip atmega y quemar el bootloader o puedes sacar un chip atmega de un arduino uno ya con el sketch grabado.
También puedes descargar los archivos para imprimir la carcasa y los botones en 3D aquí:https://www.thingiverse.com/thing:3979920

Éste controlador está diseñado para llenar un depósito en alto para suministrar presión a una instalación doméstica.

Está pensado expresamente para instalaciones eléctricas precarias de energía solar.

El aparato se mantiene apagado todo el tiempo para ahorrar energía, para reducir la adhesión de sales al sensor por electrolisis y para aumentar la vida útil del instrumento.

Se pone en marcha al pulsar el botón POWER, y marca la altura de agua que tiene el depósito por medio de 5 LEDs. En caso de no tocar ningún boton durante 10 segundos se desconecta solo. Durante ese tiempo permanece a la espera de una orden. Si se pulsa en este momento el botón Llenar, el aparato conecta la bomba de llenado y no se detiene hasta que el depósito está lleno, en dicho momento se desconecta solo. Otra poción de llenado es pulsando el botón Nivel, queda a la espera de que se seleccione el nivel a llenar, el cual se selecciona pulsando varias veces el botón Nivel hasta que quede intermitente el nivel deseado, entonces se pulsa el botón Llenar y el aparato conectará la bomba hasta que se alcance dicho nivel.

El sensor se trata de un tubo de polietileno de riego del que salen unos electrodos de acero inoxidable o latón, que pueden ser tornillos a 5 alturas dentro del depósito, que van conectados por cables a la placa, y un alambre también de metal resistente a la humedad y no tóxico, que estará en contacto con el agua desde arriba a abajo del depósito, el cual estará conectado a 5V (pad P6 de la placa).
Se necesitará también un modulo de dos relés. En éste caso los relés se activan con  una salida LOW. en caso contrario habrá que cambiarlo en el sketch.





//Controlador de deposito de agua v1.0
//Noviembre 2019
//Sketch implementado por Hector Santos (El yeti)
//https://yeti-lab.blogspot.com/

const int led[5]{4,3,2,10,11};
const int botonLlenar=5;
const int botonNivel=6;
const int relePower=9;
const int releBomba=8;
const int rAgua=100;

void setup() {
for(int i=0;i<5;i++)pinMode(led[i],OUTPUT);
pinMode(botonLlenar,INPUT);
pinMode(botonNivel,INPUT);
pinMode(relePower,OUTPUT);
pinMode(releBomba,OUTPUT);

digitalWrite(relePower,LOW); // altiva el ON
digitalWrite(releBomba,HIGH); //bomba OFF
ledsOff();
//error();
}
void error(int E){
  digitalWrite(releBomba,HIGH);
  for(int i=0;i<E;i++){
    for(int i=0;i<5;i++)digitalWrite(led[i],HIGH);
    delay (500);
    for(int i=0;i<5;i++)digitalWrite(led[i],LOW);
    delay (500);
    }
    PowerOff();
  }
///////////////////////////////////////////////////////////////
void ledsOff(){
  for(int i=0;i<5;i++)digitalWrite(led[i],LOW);
  }
////////////////////////////////////////////////////////////////
void llena(int Nivel, bool ledNivel=true){
  while(1){
  if (checkNivel()>=Nivel){
    PowerOff();
  }
  else digitalWrite(releBomba,LOW);
 
  if(ledNivel)digitalWrite(led[Nivel-1],HIGH);//Led de llenado intermitente
  else digitalWrite(led[Nivel-1],LOW);
  delay(800);
  ledNivel=!ledNivel;
  if(!(digitalRead(botonNivel))and!(digitalRead(botonLlenar))) error(1);
  }}

//////////////////////////////////////////////////////////////////////

void espera(){
  int timeout=0;
  while(1){
  checkNivel();
  if(!digitalRead(botonLlenar)){delay(15);if(!digitalRead(botonLlenar))llena(5);}
  if(!digitalRead(botonNivel)){delay(15);if(!digitalRead(botonNivel))setNivel(checkNivel());}
  delay(20);
  timeout++;
  if(timeout>500)PowerOff();
  }
  }
////////////////////////////////////////////////////////////////

int checkNivel(){
  ledsOff();
  int Nivel;
  Nivel=0;
  bool fail=false;
  for(int i=0;i<5;i++){
    if(analogRead(i)>rAgua){
      Nivel++; if(fail)error(5);
      fail=false;
    }
    else fail=true;
    }
    for(int i=0;i<Nivel;i++){digitalWrite(led[i],HIGH);}
  return Nivel;
  }
///////////////////////////////////////////////////////////////

void PowerOff(){
  digitalWrite(relePower,HIGH);
  digitalWrite(releBomba,HIGH);
  delay(100000);
}
///////////////////////////////////////////////////////////////


void setNivel(int L){
  delay(400);
  if(L>5)error(5);
  int Nivel=L+1;
  int buff=0;
  int timeout=0;
  while(1){
  if(!digitalRead(botonLlenar)){delay(15);if(!digitalRead(botonLlenar))llena(Nivel);}
  if(!digitalRead(botonNivel)){delay(15);if(!digitalRead(botonNivel)){digitalWrite(led[(Nivel)-1],HIGH);delay(500); Nivel++;timeout=0; checkNivel();}}
  if(Nivel>5)Nivel=L+1;
  if(buff>10)digitalWrite(led[(Nivel)-1],HIGH); // Led nivel intermitente
    else digitalWrite(led[(Nivel)-1],LOW);
  if(buff>20)buff=0;
  buff++;
  timeout++;
  if(timeout>2000)PowerOff();
  delay(10);
    }
  }
////////////////////////////////////////////////////////////////////////



void loop() {

espera();

}

Comentarios

  1. Un buen proyecto y está bien planteado, hice la simulación y está tan bien hecho el código y el circuito que no hay líos en el funcionamiento.

    ResponderEliminar
    Respuestas
    1. Si, está muy bien, hice uno que lleva funcionando más de 5 años sin falla, pero cuando revisé el sensor me di cuenta que es ese tiempo los electrodos tenían una corteza de sales, fruto de la adhesión por la pequeña corriente que usa Arduino. Así que se me ha ocurrido como medir con corriente alterna, así se evita ese problema. Tengo que hacer una actualización en cuanto tenga tiempo para ese proyecto

      Eliminar
    2. Estoy montandolo en mi casa que funciona con energía solar y quiero implementarlo con agua de lluvia, mi duda es sobre el amperaje recomendado en la entrada VIN del arduino

      Eliminar

Publicar un comentario