Buenas tardes, espero que se encuentren bien.
Soy nuevo en la programación y tengo un problema con un proyecto y quisera saber si me pueden colaborar.
Lo que sucede es que tengo 3 solenoides de paso de agua cada uno conectado a su respectivo relé y lo que necesito es que todos funcionen por separado. Se encuentran posicionados de la siguiente mandera:

  1. un solenoide (A) está en la entrada al flujo global
  2. Los otros dos (B y C) estan unidos a una T para permitir un paso de agua por separado, estos estás se encuentran de forma inversa
    La idea es que funcionene de la siguiente mandera:
  3. A y B se encuentran abiertos para permitir el paso al tanque 1. Mientras que C se encuentra cerrado y conectado al tanque 2
  4. cuando el tanque 1 se llene, B se va a cerrar y C se va a abrir
  5. Cuando el tanque 2 se llene, A y C se van a cerrar
  6. Cuando el tanque 1 esté vacio, A y B se van a abrir

se que puede ser mucho pero cualquier ayuda será muy bien recibida. Muchisimas gracias por toda la ayuda prestada

¿Tienes un dibujo que ilustre cómo están conectados los tanques y las válvulas?

image
No tengo un esquema como tal del sistema, pero mas o menos funcioandria así

Tu proyecto es candidato para una máquina de estados finitos (finite state machine, o fsm).

Este podría ser una primera versión de su funcionamiento:

Aquí tenemos 3 estados, el diagrama nos indica las transiciones entre los estados y la tabla documenta lo que ocurre en cada estado.

Al detectarse la condición que detona una transición (usualmente el valor de un sensor o el avance del tiempo) pasamos al estado correspondiente y operamos las válvulas conforme a lo que indica la tabla.

Por ejemplo, el estado inicial de la máquina puede ser ESPERANDO, en el que las tres válvulas están cerradas. La máquina permanece en este estado hasta que se detecta que el tanque T1 está vacío (o suficientemente vacío). Entonces la máquina abre las válvulas A y B y pasa a LLENANDO T1.

Es común que una vez revisada la primera versión del diagrama y de la tabla surjan nuevos escenarios que producen modificaciones, correcciones y adiciones al diseño.

  • ¿Se requiere de una forma de detener el proceso de llenado aunque los tanques no estén llenos?
  • ¿Es posible que el Tanque 2 se vacíe aunque el Tanque 1 siga lleno? Si es así, ¿sería necesario llenar el Tanque 2? (este diagrama no provee una respuesta para ese escenario)
  • ¿Es necesario incluir alguna salvaguarda por si falla uno de los sensores de llenado?
  • Etc.

Para manejar estos y otros escenarios hay que modificar la máquina de estados, ya sea agregando nuevos estados y/o nuevas transiciones entre ellos.

Para familiarizarte con este enfoque puedes estudiar algo del material disponible sobre máquinas de estados finitos, el cual abunda en este foro y en Internet.

Una vez que tengas tu código listo puedes postearlo aquí y podremos ayudarte con tus dudas.

Muy buenas tardes, estaba analizando los diferentes escenarios que se puedan presentar y que sean requeridos, sin embargo no es necesario tenerlos en cuenta ya que es un funcionamiento basico. Por lo tanto me estuve guiando y llegué al siguinte codigo:

// Definir los pines para controlar los solenoides
const int SolenoideA = 2;
const int SolenoideB = 3;
const int SolenoideC = 4;

// Definir los pines para monitorear el estado de los tanques
const int Tanque1 = 5;
const int Tanque2 = 6;

void setup() {
  // Configurar los pines de los solenoides como salidas
  pinMode(SolenoideA, OUTPUT);
  pinMode(SolenoideB, OUTPUT);
  pinMode(SolenoideC, OUTPUT);

  // Configurar los pines de los tanques como entradas
  pinMode(Tanque1, INPUT);
  pinMode(Tanque2, INPUT);
}

void loop() {
  // Verificar el estado de los tanques
  bool tanque1Lleno = digitalRead(Tanque1);
  bool tanque2Lleno = digitalRead(Tanque2);

  // Controlar los solenoides según el estado de los tanques
  if (tanque1Lleno) {
    // Tanque 1 lleno
    digitalWrite(SolenoideB, LOW);  // Cerrar solenoide B
    digitalWrite(SolenoideC, HIGH); // Abrir solenoide C
  }
  if (tanque2Lleno) {
    // Tanque 2 lleno
    digitalWrite(SolenoideA, LOW);  // Cerrar solenoide A
    digitalWrite(SolenoideC, LOW);   // Cerrar solenoide C
  }
  if (!tanque1Lleno) {
    // Tanque 1 vacío
    digitalWrite(SolenoideA, HIGH);  // Abrir solenoide A
    digitalWrite(SolenoideB, HIGH);  // Abrir solenoide B
  }

  // Agregar un pequeño retardo para estabilizar el sistema
  delay(10000);
}

Cada vez que inicia el pequeño retardo al final de loop(), los solenoides quedan como sigue:

“???” indica que el estado del solenoide no se ha modificado en esta iteración y por lo tanto mantiene el valor que tenía al iniciar el loop()

Esta tabla refleja lo que hace el código. Verifica si esto refleja lo que debe hacer.

Hola amigo, ya pude solucionar el problema y quedó perfecto el codigo, muchisias gracias por toda la colaboración

Por favor, deja el hilo con la solución, porque como siempre digo, si puedes venir a pedir ayuda, también te corresponde dejar como lo resolviste, así no queda el hilo con un signo de pregunta como éste ?