Proyecto de ducha escocesa controlada con Arduino Uno

Muy buenas foreros, un saludos a todos soy nuevo con Arduino y mucho más nuevo en el foro, tengo la idea de controlar una ducha escocesa con un Arduino uno. No tengo mucha idea de programación ni de electrónica pero siempre me ha gustado aprender a programar, para que os hagaís una idea de lo que es una ducha escocesa, explicaros que son esas duchas que hay en los spa y que salen chorros de agua a diferentes alturas y con diferentes secuencias. esta en concreto son 2 electroválvulas principales que una permite la entrada de agua fría y otra la de agua caliente y después otras 4 elctroválvulas que reparten el agua por diferentes zonas del cuerpo, todas esas secuencias comienzan con tres pulsadores que los quiero dividir para que el primero haga secuencia con agua fría, el segundo haga la secuencia con agua caliente u un tercero con agua mixta. Espero la opinión de los que saben si esto puede llegar a ser factible y que me dejeís las opiniones y las mejoras sobre las fotos y el código que vaya subiendo cuando vaya realizando.

Muchas gracias y espero vuestros comentarios.

es totalmente factible, solo que agua y electricidad no se llevan muy bien, tendras que pensar muy bien como lo haces a ese respecto

Muchas gracias Go_zalo por el comentario, de electricidad si tengo algunos conocimientos, si puedo terminarlo mañana subo la maqueta o prototipo y explicó un poco más lo que quiero hacer. Un saludo.

Todo lo que uses que sea en baja tensión, 24VDC o 12VDC no uses nada en 220VAC

Gracias surbyte por el aporte, tengo pensado montar las electroválvulas de 12 v las principales de 3/4" y las secundarias de 1/2" y los pulsadores no lo he decidido todavía pero lo más seguro que sean neumáticos ( es un pulsador que le llega un tubo lleno de aire , que al pulsarlo el otro extremo del tubo activa un contacto N/O.)
Un saludo.

Buenas tardes esta imagen es el prototipo de lo que tengo pensado hacer sin saber si es del todo correcto. Un saludo y sigo trabajando.

inserta las fotos usando tags.
Si no sabes lee las normas del foro. Ahi esta bien explicado!!

Perdón surbyte es cierto, este comentario lo has hecho ya unas cuantas veces en el foro, xq antes de entrar como usuario he leído casi todo el foro entero y también las normas por supuesto, así que pido disculpas pero creía que lo estaba haciendo bien, no sé si será xq escribo desde el móvil, mañana probaré ha subirlo desde el pc.
Un saludo a todos.

Buenas tarde, después de estar mirando como subir la foto como me dijo surbyte( todavía no he conseguido hacerlo, sólo copiando el enlace de arriba) decir que este es el prototipo y que sólo me quedaría cambiarlos led por el módulo de relé.
Un saludo a todos.

Muy bien!! ahora si se ve tu prototipo.
Bien. a continuar con la idea!!

Muy buenas, me ha llegado hoy el modulo de 8 relé de keyes y estoy intentando hacer el esquema en fritzing pero no encuentro la librería para agregar ese módulo al programa, y he visto en algunos hilos del foro que lo ponen, he buscado por google y lo máximo que he encontrado es el relé de 1 canal, así que les pido ayuda por si alguien lo tiene localizado.

Un saludo a todos.

Dibuja 8 reles y lo agrupas con un rectángulo de rayas alternadas. Y le sumas una leyenda que diga módulo 8 reles y se entiende perfectamente.

Muchas gracias Surbyte, por la aclaración aunque solo era para uso personal no lo voy a subir al foro, simplemente por guardar todo en una carpeta; cambiando de tercio así es como voy, mañana quiero terminar de cablear todo y empezar con lo que me dá más miedo el código jajajaja.
Y una duda tengo pensado alimentar arduino con un transformador de 9v sería mejor puentearlo antes y alimentar el módulo directamente o desde arduino ya que en el foro he leído varios debates sobre esto y no me queda claro la mejor opción, muchas gracias por vuestro tiempo y un saludo a todos.

Muy buenas tardes foreros, tengo ya hecho el prototipo y tengo en el arduino compilado con este código, solo he puesto la secuencia de agua caliente como muestra de lo que quiero, pero el código sigue con una secuencia de agua fría y otra de agua mixta, todas las secuencias son diferente y ahora mis dudas; cuando hice el código puse LOW cuando quería que se cerrase la electroválvula correspondiente y HIGH cuando quería que se abriera, cual es mi sorpresa que al subirlo a la placa funcionaba al revés esto es normal? y la otra petición es que debido a mi trabajo voy a empezar ha realizar secuencias en motores, iluminación, electroválvulas etc... por eso quiero dejar este proyecto como base para los demás y me gustaría que me guiasen a depurar el código lo máximo posible si puedo ahorrar líneas de código con alguna función o algo así o si por el contrario este es fiable para que dure años.
Epero sus comentarios como siempre y pido perdón por si hice una burrada en él código pero soy muy novel.
Un saludo a todos.

const int buttonPin0 = 2; // número del pin para el botón0
const int buttonPin1 = 3; // número del pin para el botón1
const int buttonPin2 = 4; // número del pin para el botón2
const int ELVC =  12;  // número del pin de la electroválvula agua caliente
const int ELVF =  11;  // número del pin de la electroválvula agua fría
const int ELVT =  10;  // número del pin de la electroválvula techo
const int ELVS =  9;  // número del pin de la electroválvula superior
const int ELVM =  8;  // número del pin de la electroválvula medio
const int ELVI =  7;  // número del pin de la electroválvula inferior

int buttonState0 = 0;  // estado del botón (0 ó LOW es apagado y 1 ó HIGH es encendido)
int buttonState1 = 0;  // estado del botón1 (0 ó LOW es apagado y 1 ó HIGH es encendido)
int buttonState2 = 0;  // estado del botón (0 ó LOW es apagado y 1 ó HIGH es encendido)

void setup() {
 pinMode(ELVC, OUTPUT);         // Se identifica el pin 12 como salida
 pinMode(ELVF, OUTPUT);         // Se identifica el pin 11 como salida
 pinMode(ELVT, OUTPUT);         // Se identifica el pin 10 como salida
 pinMode(ELVS, OUTPUT);         // Se identifica el pin 9 como salida
 pinMode(ELVM, OUTPUT);         // Se identifica el pin 8 como salida
 pinMode(ELVI, OUTPUT);         // Se identifica el pin 7 como salida   
                            
 pinMode(buttonPin0, INPUT);     // Se identifica el pin 2 como entrada
 pinMode(buttonPin1, INPUT);     // Se identifica el pin 3 como entrada
 pinMode(buttonPin2, INPUT);     // Se identifica el pin 4 como entrada
}

void loop(){
  
   buttonState0 = digitalRead(buttonPin0);   // Leemos si el botón en pin2 está abierto o cerrado
   buttonState1 = digitalRead(buttonPin1);   // Leemos si el botón en pin3 está abierto o cerrado
   buttonState2 = digitalRead(buttonPin2);   // Leemos si el botón en pin4 está abierto o cerrado
   delay (20);
 
   if (buttonState0 == HIGH) // Si está siendo pulsado es HIGH se inicia secuencia AGUA CALIENTE
 {    
       
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, LOW);
   digitalWrite(ELVT, LOW);
   digitalWrite(ELVS, HIGH);
   digitalWrite(ELVM, HIGH);
   digitalWrite(ELVI, HIGH);
   delay(5000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, HIGH);
   digitalWrite(ELVT, LOW);
   digitalWrite(ELVS, LOW);
   digitalWrite(ELVM, HIGH);
   digitalWrite(ELVI, HIGH);
   delay(5000);    
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, HIGH);
   digitalWrite(ELVT, LOW);
   digitalWrite(ELVS, LOW);
   digitalWrite(ELVM, LOW);
   digitalWrite(ELVI, HIGH);
   delay(5000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, HIGH);
   digitalWrite(ELVT, LOW);
   digitalWrite(ELVS, LOW);
   digitalWrite(ELVM, LOW);
   digitalWrite(ELVI, LOW);
   delay(5000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, LOW);
   digitalWrite(ELVT, LOW);
   digitalWrite(ELVS, LOW);
   digitalWrite(ELVM, LOW);
   digitalWrite(ELVI, LOW);
   delay(15000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, LOW);
   digitalWrite(ELVT, HIGH);
   digitalWrite(ELVS, HIGH);
   digitalWrite(ELVM, HIGH);
   digitalWrite(ELVI, HIGH);
   delay(5000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, LOW);
   digitalWrite(ELVT, LOW);
   digitalWrite(ELVS, LOW);
   digitalWrite(ELVM, LOW);
   digitalWrite(ELVI, LOW);
   delay(15000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, LOW);
   digitalWrite(ELVT, HIGH);
   digitalWrite(ELVS, HIGH);
   digitalWrite(ELVM, HIGH);
   digitalWrite(ELVI, HIGH);
   delay(5000);
   // Primera parte de la secuencia AGUA CALIENTE.
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, LOW);
   digitalWrite(ELVT, HIGH);
   digitalWrite(ELVS, HIGH);
   digitalWrite(ELVM, HIGH);
   digitalWrite(ELVI, LOW);
   delay(5000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, HIGH);
   digitalWrite(ELVT, HIGH);
   digitalWrite(ELVS, HIGH);
   digitalWrite(ELVM, LOW);
   digitalWrite(ELVI, LOW);
   delay(5000);    
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, HIGH);
   digitalWrite(ELVT, HIGH);
   digitalWrite(ELVS, LOW);
   digitalWrite(ELVM, LOW);
   digitalWrite(ELVI, LOW);
   delay(5000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, HIGH);
   digitalWrite(ELVT, LOW);
   digitalWrite(ELVS, LOW);
   digitalWrite(ELVM, LOW);
   digitalWrite(ELVI, LOW);
   delay(5000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, LOW);
   digitalWrite(ELVT, LOW);
   digitalWrite(ELVS, LOW);
   digitalWrite(ELVM, LOW);
   digitalWrite(ELVI, LOW);
   delay(15000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, LOW);
   digitalWrite(ELVT, HIGH);
   digitalWrite(ELVS, HIGH);
   digitalWrite(ELVM, HIGH);
   digitalWrite(ELVI, HIGH);
   delay(5000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, LOW);
   digitalWrite(ELVT, LOW);
   digitalWrite(ELVS, LOW);
   digitalWrite(ELVM, LOW);
   digitalWrite(ELVI, LOW);
   delay(15000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, LOW);
   digitalWrite(ELVT, HIGH);
   digitalWrite(ELVS, HIGH);
   digitalWrite(ELVM, HIGH);
   digitalWrite(ELVI, HIGH);
   delay(5000);
   digitalWrite(ELVC, LOW);
   digitalWrite(ELVF, LOW);
   digitalWrite(ELVT, LOW);
   digitalWrite(ELVS, LOW);
   digitalWrite(ELVM, LOW);
   digitalWrite(ELVI, LOW);
   delay(15000);
   // final secuencia segunda parte AGUA CALIENTE.
 }

Que el relé funcione al revés solo indica que es de lógica inversa.
O cambias HIGH por LOW o pones esto

digitalWrite(ELVI, !HIGH);

que es en realidad un

digitalWrite(ELVI, LOW);

Algunos pueden pensar que es una tontería pero muchos tienen la mente preparada o acostumbrada a la logica directa no la inversa.
De este modo es como que sigues viendo tu lógica pero la ajustas a lo que realmente tienes.
Mira tu rele a ver si tiene alguna opción o jumpers.

Muchas gracias de nuevo por el comentario, lo cambié LOW por HIGH y funciona correctamente pero la mayor duda eran si todos esos delay afectarían a largo plazo el funcionamiento porque había leído que no era bueno usar delay ya que la placa se detiene y no analiza otros datos o otras entradas aunque esto a mí no me importa puesto que la placa está dedicada exclusivamente a ese proceso de iniciar secuencia cuando se presiona el botón elegido. Me apunto lo de la lógica inversa que no lo había leído en ningún sitio y si el código no se puede mejorar más doy el proyecto por concluido, muchas gracias a todos los que lo han leído, los que puedan leerlo y como no puede ser de otra manera a los que me han ayudado con sus comentarios y sugerencias.
Un saludo a todos.

Hasta ahora tu programa solo mira esto

 if (buttonState0 == HIGH)

y luego desarrolla toda la secuencia de acciones y retardos.
Si eso esta bien para ti y no tienen ningún elemento de seguridad que vigilar no hay problema.
SI luego agregas mas cosas que deben chequearse no podras usar delay sino millis() y el reemplazo no es directo.

Muchísimas gracias y edito el título.
Un saludo a todos y nos vemos por el foro.