Ayuda marcha bomba

Hola a todos

estoy dandole muchas vueltas y no hay forma., lo he hecho por if, while, for

El proyecto es poner en marcha una bomba con un interuptor, una sonda de nivel y un presostato en el tubo para cuando la bomba este en marcha y no suba agua pare, no tengo sonda de nivel en el pozo.

El problema es que tengo que arrancar la bomba con la condicion del interuptor y la sonda, esperar un momento y si el presostato da señal continuar sino parar, es el tiempo de llegar el agua al presostato.

Una vez en marcha tiene que parar cuando el presostato de off, la sonda on o el interuptor off,
El problema es que al parar por el presostato en off es la misma condicion que arrancar.
me podriais dar alguna idea o como hacer para que el arranque inicial solo se ejecute una vez cuando el interuptor pase de off a on.

disculpar el lio

Saludos

¿Serías capaz de hacer un diagrama de tiempos con la situación de las entradas (on - off; 0 - 1; . . ) y lo que tiene que hacer la bomba?.

¿Tienes pulsador de marcha - paro?

¿Y un esquemita de la instalación (la posición de la bomba, el presostato, . . .)?. Tampoco vendría mal saber dónde está la bomba respecto de la superficie del pozo (¿o es sumergida?).

En fin . . .

Hola

Es un bomba en un pozo sumergida, un interuptor de puesta en marcha, un presostato arriba "ON" cuando hay presion y una sonda de nivel flotante deposito, ON cuando esta lleno.

Saludos

Bien, entonces interruptor (no pulsador) por lo tanto mantiene su estado no?

Interruptor SI/NO : Interruptor SI, bomba ON. No bomba OFF
arranca la bomba, sube agua, sube presion, presostato ON porque la bomba esta inyectando agua.
sonda indica nivel de agua en el depósito a llenar. Se pone ON cuando esta lleno sino esta OFF.
Cuando esta lleno orden de apagado.

Presostato solo cuida que la bomba no intente succionar aire no es asi?

Bien... posible programa:

/*
Bien, entonces interruptor (no pulsador) por lo tanto mantiene su estado no?

Interruptor SI/NO : Interruptor SI, bomba ON. No bomba OFF
arranca la bomba, sube agua, sube presion, presostato ON porque la bomba esta inyectando agua.
sonda indica nivel de agua en el depósito a llenar. Se pone ON cuando esta lleno sino esta OFF.
Cuando esta lleno orden de apagado.

El programa incluye el boton y la sonda. pero no el presostato porque no entiendo cuando participa.
No entiendo si se pone ON cuando la bomba arranca lo que requiere un retardo para que lo haga y en todo caso es contradictorio su uso. Porque no usar otra sonda en el fondo del tanque de profundidad que te diga tengo agua?
Mas facil, menos problemático y garantiza que la bomba aspirará agua y no aire si eso te preocupa.
Yo trabajo con bombas y nunca he usado un presostato para hacer lo que quieres.


*/

// todos los switches conectados asi
// https://ctheds.files.wordpress.com/2007/10/digital_input.jpg?w=780
// Cerrado = high abierto = LOW

const byte SondaPin        = 2;
const byte PresostatoPin   = 3;
const byte BombaPin        = 4;
const byte SwitchPin      = 5;          

byte valSonda          = 0;
byte valSwitch		   = 0;
byte valPresostato     = 0;
byte prevSonda      = 0;
byte prevSwitch	   = 0;
byte prevPresostato = 0;

boolean swEstado         = false;
boolean presEstado         = false;
boolean sondaEstado     = false;

void setup() {
    pinMode(SondaPin, INPUT);
    pinMode(PresostatoPin ,INPUT);
    pinMode(BombaPin , OUTPUT);
    pinMode(SwitchPin ,INPUT);
  }

void loop() {
  // put your main code here, to run repeatedly: 
  
  prevSwitch = valSwitch;
  valSwitch = digitalRead(SwitchPin);
  if (valSwitch != prevSwitch) {
	if (valSwitch == HIGH) {    // como se trata de un interruptor no hago debouce
      swEstado = true;
  }
  else 
      bEstado = false;
      
  prevPresostato = valPresostato;
  valPresostato = digitalRead(PresostatoPin);  // El presostato se pone ON cuando despues de un tiempo la bomba inyecta agua
  if (valPresostato != prevPresostato) {       // al depósito.
	  if (valPresostato == HIGH) {    
		  presEstado = true;
	  }
	  else
		  presEstado = false;
      
  prevSonda = valSonda;
  valSonda = digitalRead(PresostatoPin);		// la sonda cuando esta OFF indica que el depósito necesita agua.
  if (valSonda != prevSonda) {					// sonda ON indica que la bomba llenó el depósito.
	  if (prevSonda == HIGH) {    
		  sondaEstado = true;
	  }
	  else
		 sondaEstado = false;
	  
    
  if (swEstado && !sondaEstado) {
    digitalWrite(bomba, HIGH); // Activo bomba
  }
  
  if (!swEstado || sondaEstado) {
    digitalWrite(bomba, LOW); // Activo bomba 
  }
}

Hola

muchas gracias Surbyte por tu tiempo y esfuerzo.
lo has interpretado muy bien

pero todo tiene su explicacion

es un sondeo (pozo muy estrecho), dificil de colocar una sonda, lejos de donde esta el control, para pasar nuevos cable muy dificil, la bomba depende de epoca saca mas agua que hay en el pozo por lo que la agota.

todo esto lo suplire con un presostato en el tubo, por eso como dicen tiene que arrancar la bomba si la sonda esta en off, esperar un tiempo como tu dices que son pocos segundos, si da on el presostato continuar sino parar.

y una vez en marcha cuando el presostato de off parar y esperar otro tiempo minutos a que se recupere el agua si la sonda esta on

El problema lo tengo mas que nada en la programacion del dichoso presostato y en el tiempo de espera

tu programa lo he completado con algunas llaves que faltavan, pero no se si lo he hecho bien que solo se pone en marcha la bomba y luego no hay nada que la pare.

Saludos y muchas gracias

const byte SondaPin        = 32;
const byte PresostatoPin   = 30;
const byte BombaPin        = 37;
const byte SwitchPin      = 31;          

byte valSonda          = 0;
byte valSwitch		   = 0;
byte valPresostato     = 0;
byte prevSonda      = 0;
byte prevSwitch	   = 0;
byte prevPresostato = 0;

boolean swEstado         = false;
boolean presEstado         = false;
boolean sondaEstado     = false;
boolean bEstado= false;
void setup() {
    pinMode(SondaPin, INPUT);
    pinMode(PresostatoPin ,INPUT);
    pinMode(BombaPin , OUTPUT);
    pinMode(SwitchPin ,INPUT);
  }

void loop() {
  // put your main code here, to run repeatedly: 
  
  prevSwitch = valSwitch;
  valSwitch = digitalRead(SwitchPin);
  if (valSwitch != prevSwitch) {
	if (valSwitch == HIGH) {    // como se trata de un interruptor no hago debouce
      swEstado = true;
  }
  }
  else 
      bEstado = false;
      
  prevPresostato = valPresostato;
  valPresostato = digitalRead(PresostatoPin);  // El presostato se pone ON cuando despues de un tiempo la bomba inyecta agua
  if (valPresostato != prevPresostato) {       // al depósito.
	  if (valPresostato == HIGH) {    
		  presEstado = true;
	  }
  }
	  else
		  presEstado = false;
      
  prevSonda = valSonda;
  valSonda = digitalRead(PresostatoPin);		// la sonda cuando esta OFF indica que el depósito necesita agua.
  if (valSonda != prevSonda) {					// sonda ON indica que la bomba llenó el depósito.
	  if (prevSonda == HIGH) {    
		  sondaEstado = true;
	  }
  }
	  else
		 sondaEstado = false;
	  
    
  if (swEstado && !sondaEstado) {
    digitalWrite(BombaPin, HIGH); // Activo bomba
  }
  
  if (!swEstado || sondaEstado) {
    digitalWrite(BombaPin, LOW); // Activo bomba 
  }
}

Si claro que te entiendo. Bueno ahora esta mas claro.
Veré que agregaste y lo completamos a ver si funciona.
No se si leo mal pero creo ver mi mismo programa. No hay nada Agregado o sumado.
Probaste el mío mas alla de no estar completo. Funciona? es bueno saber que tenemos una base sólida.

MUY importante viste como consideré todos los interruptores,
Switch o botón
Sonda y presostato

todos cuando se cierran o ponen en ON dan 5V o HIGH, resto LOW o 0V.

Hola,

En el ultimo parrafo ya indico que solo he añadido algunas llaves que faltaban ya que no compilaba y que en el programa la bomba se pone en marcha y no hay nada que la pare sino me equivocado con la llaves añadidas.

Haber si me podias indicar como hacer lo del temporizado del presostato y del tiempo de recuperacion del agua del pòzo.

Saludos

ya te hare lo del presostato pero no respondes respecto a los switches si estan cableados como te indico en el enlace o no?

agregado lo del presostato para un tiempo de 20 x 1000 (milisegundos)
NO EJECUTES EL PROGRAMA HAY ERRORES.
YA LO SUBO CORREGIDO!!!

Hola,

si
siempre los conecto asi.

Saludos