¿Cómo programar dos válvulas solenoides?

Mi proyecto es un regulador de pH, lo que debe realizar es la medición del pH y si, por ejemplo, tengo agua en pH neutro de 7 y le añado ácido solo para probar que la pHmetro está haciendo su trabajo, el arduino le manda un pulso a un relé de 5V que activa una válvula solenoide de 3 vías para añadir base a la solución. Antes de llegar a la muestra, se activa otro relé de 5V para abrir otra válvula solenoide de 2 vías y finalmente dejarla pasar a la muestra. La razón por la cuál me asignaron este proyecto así es porque una de las válvulas siempre estará abierta y se necesita que no caiga producto ácido y básico a la muestra en cuestión.

Ahora, el problema. ¿Cómo sería el código de este proceso? La conexiones se entienden pero no puedo programar este pequeño pero importante paso.

¡Mil gracias!

Y qué parte del código tienes hecho, o cual es el problema que se te está presentando? Si es que no sabes programar te recomiendo que revises los tutoriales Indice de temas Tutoriales o también hay varios ejemplos de cómo usar un solenoide como por ejemplo. Arduino (IoT): Simple Tutorial Válvula Solenoide con un BJT Arduino Solenoid Tutorial - Buttons Demo

Te paso el código que tengo hecho. Las válvulas, al tenerlas conectadas el relay trato de programar eso. En teoría, lo que quiero transmitir con mi código es si dejo pasar unas cuantas gotas de solución a mi substancia que está siendo medida por el phmetro y quiero cerrar la válvula pongo el comando inverso para cerrar el relay (digitalWrite(pin, HIGH)), cierto? El problema es el siguiente, cómo programo mi código de forma que pueda esperar a que el usuario mande o toce algún botón (dígase barra de espaciado) dónde si la presiono se pause el programa y si la presiono de nuevo empiece el loop nuevamente. Porque pensé al leer el código para mandártelo es esto: el tiempo que tome en sacar el phmetro, limpiarlo con agua destilada, mezclar la muestra a medir y volver a colocar el phmetro para una nueva medición no sé cuál es, puede variar, algo puede salir mal.

Si no se puede, pues, será probar y probar e ir subiendo el delay.

Mi pregunta original no era esa, lo sé pero se me ocurrió después de subir el post. Espero me puedas ayudar, gracias.

const byte pHpin = A0;// Conecto el sensor de pH
const int RELAY_ENABLEIN1 = 1; //válvula de 3 vías - 
const int RELAY_ENABLEIN2 = 2; //válvula de 2 vías - 

float Po;

void setup()
{
pinMode(RELAY_ENABLEIN1, OUTPUT);
pinMode(RELAY_ENABLEIN2, OUTPUT);
Serial.begin(9600);
}

void loop()
{
Po = (1023 - analogRead(pHpin)) / 73.07; // Lee y escala de 0-14 el input value.
Serial.println(Po, 2)
delay(1000);// Una lectura por segundo.

if(Po > 7) {
Serial.println("Relay ON");// Si la sustancia es base, hacerla acida
digitalWrite(1, LOW); //para abrir el relay
digitalWrite(2, LOW);
delay(500);
digitalWrite(1, HIGH); //para cerrar el relay
digitalWrite(2, HIGH);
delay (20000);
}


if(Po < 7){
Serial.println("Relay OFF");// Si la sustancia es acida, hacerla base
digitalWrite(2, LOW);
delay(500);
digitalWrite(2, HIGH);
delay (20000);
}
}

Si claro que se puede y se que lo que has hecho te ha costado pero debes aprender a no usar delay() porque cuando tienes situaciones como la que planteas de pausar algo en tu código dice :

delay (20000);

o sea no solo esperar 20 segundos sino toda la secuencia que son ? 25 segundos
Diras pero es una tontería!! Si lo es pero si fuera mas?

Bien, asi que la solución es hacer lo mismo pero con millis().

Te dejo guia para que leas como funciona y ahora yo te modificaré el programa para que agreges un botón que controle y pause todo

Y claro no se detenta con esos delays.

Algo mas: Nunca uses en etapa de prueba el pin 0 o 1 para tu evaluación del proyecto porque ahora no estas leyendo o si lo haces usar pin 1 crea conflcto con el TX del Arduino.

Esto

const int RELAY_ENABLEIN1 = 1; //válvula de 3 vías -

esta mal, solo desde el punto de vista que te he expresado.

ajustarSolucion es la variable que controlará si el sistema se debe compensar sea Básico o Acido.
Si esta en false no hará nada y estará pausado
Si esta en true trabaja como tu programa original.

En botonPin x ahora pin = 4 tienes un pulsador conectado entre pin 4 y GND nada mas.
con digitalRead(botonPin) leemos su estado y lo comparamos con el estadoAnterior. Si cambia cambiamos ajustarSolucion y si no cambia no hacemos nada.

Lo demas ahora usa milli() y una máquina de estado. Para mas información ve a Documentación => indice de temas Tutoriales => millis() y maquina de estados. Será muy instructivo para entender.

Ahora el sistema fluye pero sigue cumpliendo tus tiempos.
Cada paso dentro del switch es un paso similar al que hacias pero con la diferencia que permanecemos ahi solo un instante y no cambia si no se cumple la condición.

Miralo y me dices si no entiendes algo.

El código claro!!!

const byte pHpin           = A0;     // Conecto el sensor de pH
const byte RELAY_ENABLEIN1 = 2;      // válvula de 3 vías - 
const byte RELAY_ENABLEIN2 = 3;      // válvula de 2 vías - 
const byte botonPin        = 4;
float Po;
bool estadoBoton, estadoBotonAnt = false;
bool ajustarSolucion = true;
byte estadoAcido = 0, estadoBasico = 0;
unsigned long start, timeLectura;

void setup() {
  pinMode(RELAY_ENABLEIN1, OUTPUT);
  pinMode(RELAY_ENABLEIN2, OUTPUT);
  pinMode(botonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {

  // chequeo pulsador conectodo a BotonPin
  estadoBoton = digitalRead(botonPin);
  if (estadoBoton != estadoBotonAnt) {
      ajustarSolucion = !ajustarSolucion;
  }
  estadoBotonAnt = estadoBoton;


  if (millis() - timeLectura > 1000UL) {
      Po = (1023 - analogRead(pHpin)) / 73.07; // Lee y escala de 0-14 el input value.
      Serial.println(Po, 2)
      timeLectura = millis();
  }
  
  if (ajustarSolucion) {
      if (Po > 7) {
          volverAcido();
      }

      if (Po < 7){
          volverBasico();
      }
  }
}

void volverBasico() {
  switch(estadoBasico) {
      case 0: Serial.println("Relay OFF");// Si la sustancia es acida, hacerla base
              digitalWrite(2, LOW);
              estadoBasico = 1;
              start = millis();
              break;
      case 1: if (millis() - start > 500UL) {
                  digitalWrite(2, HIGH);
                  estadoBasico = 2;
                  start = millis();
              }
              break;
      case 2: if (millis() - start > 20000UL) {
                  estadoBasico = 3;
              }
              break;
      case 3: estadoBasico = 0; // reinicio ciclo
              break;
  }
}

void volverAcido() {
  switch(estadoAcido) {
      case 0: Serial.println("Relay OFF");// Si la sustancia es acida, hacerla base
              digitalWrite(1, LOW); //para abrir el relay
              digitalWrite(2, LOW);
              estadoAcido = 1;
              start = millis();
              break;
      case 1: if (millis() - start > 500UL) {
                  digitalWrite(1, HIGH); //para cerrar el relay
                  digitalWrite(2, HIGH);
                  estadoAcido = 2;
                  start = millis();
              }
              break;
      case 2: if (millis() - start > 20000UL) {
                  estadoAcido = 3;
              }
              break;
      case 3: estadoAcido = 0; // reinicio ciclo
              break;
  }
}

NOTA: por favor no hace falta repetir las respuestas que te damos. En la calle cuando alguien te pregunta tu no repites lo que te dicen no? Bueno acá tampoco y de ese modo evitamos llenar el hilo de basura electronica porque si, es basura repetir lo que ya te han escrito.
Si tienes dos respuestas pues solo pon @fulano, @mengano y le respondes a cada uno pero si respondes a párrafos entonces usa quote o cita. Que es quote o cita, pues esta indicado en las normas.