Encendido de leds con interruptores y condicionales

Hola buenas,
Estaría muy agradecido si me pudiérais ayudar a programar un proyecto, ya que ando bastante perdido con Arduino y por más horas que le echo no me entero, ya que tengo vierta edad y la programación nunca se me ha dado bien y me cuesta mucho avanzar.
El proyecto es el siguiente:
-Tengo como entradas 3 interruptores (llamémosle I1, I2 y I3).
-Cada uno de ellos, ha de encender un led respectivo en la salida, de tal manera que el I1 encenderá el led 1 (L1) y así igualmente I2 con L2 e I3 con L3.
-El problema es que el interruptor 3, no puede cerrarse (A MENOS QUE los otros 2 interruptores (I1 e I2) estén cerrados, lo cual implicaría que el led 3, no puede encenderse, hasta que el led1 y led 2 estén encendidos.

Ahora bien. Una vez estén los 3 leds encendidos necesito apagarlos, PERO:
-los interruptores I1 e I2, no pueden abrirse, hasta que primero se haya abierto I3, es decir, primero se ha de apagar I3 y despues lo pueden hacer indistintamente I1 e I2 ó I2 e I1, pero primero, ha de estar abierto I3.

Agradecería si me pudierais echar una mano, ya que le he echado un montón de horas estudiando las funciones: IF, ELSE, FOR, WHILE, DO, etc pero es que no me entero.

Gracias anticipadas y un saludo

A ver si te sirve:

// El truco está en guardar al inicio del loop el estado de las entradas y las
// salidas, para ello usamos unas variables. 
// Después, dentro del loop, comprobamos el estado del led y del interruptor
// viendo las condiciones, actuando sobre el led si se tiene que encender o
// apagar. Como no actuamos sobre las variables, si no sobre el pin, estas
// permanecen sin cambiar hasta que volvemos a leerlas al inicio del loop.

int i1, i2, i3, l1, l2, l3;

void setup() {
  // Los interruptores estarán en los pines 2, 3 y 4 siendo las entradas i1, i2 e i3.
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);

  // Los led estarán en los pines 5, 6 y 7, siendo las salida l1, l2 y l3.
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop() {
  // Primero el estado de las entrada y de las salidas, las guardamos en las variables
  // correspondientes para luego trabajar sobre ellas.
  i1 = digitalRead(2);
  i2 = digitalRead(3);
  i3 = digitalRead(4);
  l1 = digitalRead(5);
  l2 = digitalRead(6);
  l3 = digitalRead(7);

  // El led 5 (l1) solo puede encenderse si esta apagado y cerramos i1.
  if ( l1==LOW && i1==HIGH ) digitalWrite(5, HIGH);

  // El led 6 (l2) solo puede encenderse si esta apagado y cerramos i2.
  if ( l2==LOW && i2==HIGH ) digitalWrite(6, HIGH);

  // El led 7 (l3) solo puede encenderse si esta apagado, cerramos i3 y los
  // leds l1 y l2 esten encendidos.
  if ( l1==HIGH && l2==HIGH && i3==HIGH && l3==LOW ) digitalWrite(7, HIGH);

  // El led 3 solo se apagara cuando abramos el interruptor i3.
  if ( l3==HIGH && i3==LOW ) digitalWrite(7, LOW);

  // Si el led l1 estan encendido solo se apagará  si l3 está apagado y abrimos el 
  // interruptor.
  if ( l1==HIGH && l3==LOW && i1==LOW ) digitalWrite(5, LOW);

  // Si el led l2 esta encendido solo se apagará si l3 está apagado y abrimos
  // el interruptor.
  if ( l2==HIGH && l3==LOW && i2==LOW ) digitalWrite(6, LOW);
  
}

Como ves solo he aplicado un simple if, separando cada una de los condicionales, pero manteniendo el estado de las variables sin modificar durante todo el programa.

Hola Victorjam.
Te estoy muy agradecido por tu respuesta. Voy a simularlo a ver que tal y os comento.
Un saludo

Hola de nuevo.
Despues de tanto tiempo, por fin he podido probar la programación que me proponía aquí Victorjam, (por lo que te estoy muy agradecido). No obstante quería preguntaros como puedo añadirle ciertas funcionalidades más que se me habían olvidado. Lo he intentado por mi mismo programar esas nuevas funcionalidades pero la verdad, le he dedicado muchas horas y no encuentro la solución. La cuestión es la siguiente:
-Habíamos programado que el led L1 (si está encendido), sólo se apagará si L3 está apagado y abrimos el interruptor i1.
Tambien habiamos programado:
-Que el led L2 (si está encendido), sólo se apagará si L3 está apagado y abrimos el interruptor i2.

Pero ademas de esto, necesito que:
-Si estando encendida las 3 luces, si intentamos abrir el interruptor i1 (no sólo no se apague su led l1, sino que se abra el interruptor i3 o sino que se apague el led de l3. En este mismo caso con las 3 luces encendidas, si intentamos abrir i2, no solo no debe apagarse su luz, sino que debe abrirse i3 o apagarse su luz (led 3).

En realidad lo que busco y esto representa es una evacuación de energía a una subestación, donde i1 y i2 son 2 seccionadores (con sus correspondientes indicadores led 1 y led 2) e i3 es un interruptor automático (los 3 están en serie en una subestación). Entonces, como los seccionadores (i1 e i2) no tienen capacidad o poder de corte para abrir un circuito energizado, por eso necesito que cuando los 3 estén cerrados, si intento abrir primero el i1 o i2 no debe permitírmelo y debe saltar el interruptor automático (i3 debe abrirse). Eso si, una vez abierto i3, (se desergiza la red) y ya si pueden abrir i1 e i2.

-Tambien necesito un añadir un interruptor, que si se pulsa por primera vez, abra el interruptor i3, por 5 segundos o al menos que apague su luz por ese tiempo. Pasados los 5 segundos vuelve a estar activo y si se vuelve a pulsar el interruptor, pues debe abrir i3 o su led por 30 segundos. Si vuelve a ocurrir una tercera vez, deja ya abierto permanentemente i3 o su luz. En realidad, esto (el interruptor) sería la simulación de un fallo en la red, donde la primera vez se desactiva (salta el interruptor automatico i3) y se reengancha a los segundos para finalmente al tercer fallo, quedar permanentemente abierto por motivos de seguridad.

Gracias anticipadas

Moderador
Creo que no has leído las Normas del foro y por lo visto si te desempeñas en un ambiente eléctrico industrial lo que pides me parece poco gentil de tu parte.
El foro no hace tareas, si responde dudas y no veo duda en tu segundo comentario y menos en el primero.

Te pido que pongas un tiempo de tu parte, intentes resolver los items indicados y te iremos guiando y/o aconsejando.

Gracias por tu comprensión, esperamos tu código y tus dudas.

Hola buenos días Señor Moderador y todos los que me lean. Como Usted ha sido tan tajante, tambien lo voy a ser yo, pues que me quedo de piedra con su respuesta:

  1. No me desempeño en un entorno industrial (desempeñarse es alguien que sabe desenvolverse en una tarea en concreto). Yo soy una persona que intenta aprender por sus medios sobre Electrónica y electricidad industrial y renovables pero no soy un profesional, sino un estudiante que ronda los 60 años y desgraciadamente no tengo ya ni la capacidad de aprender ni capacidad atencional para asumir nuevos conceptos como me requiere la electricidad y arduino.
  2. Por lo dicho en el punto anterior, necesito ayuda para resolver ese planteamiento o cualquier otro.
  3. No estoy pidiendo que me lo resuelven, sino que me digan que tipo de condicionales o como puedo enfocar la solución.
  4. Como he dicho en mi anterior post, le he dedicado muchísimas horas, pero estoy atascado y necesitaba orientación. He leído muchos artículos, libros y post sobre programación en arduino, pero no se me da bien la programación.
  5. Creo que usted como moderador, ha sido muy osado en sacar conclusiones antes de tiempo.

Un saludo

Hago una observación incisa:

El moderador se ha preocupado, lo mismo que yo al leer las palabras: subestación, seccionador y interruptor automático. Esas tres palabras implican, si o si, entorno industrial y más dudas. Es algo muy gordo que un simple Arduino encendiendo o apagando leds.

Te pongo mis dudas, para que comprendas lo que me vino la cabeza al leer tu post:

En realidad lo que busco y esto representa es una evacuación de energía a una subestación, donde i1 y i2 son 2 seccionadores (con sus correspondientes indicadores led 1 y led 2) e i3 es un interruptor automático (los 3 están en serie en una subestación). Entonces, como los seccionadores (i1 e i2) no tienen capacidad o poder de corte para abrir un circuito energizado, por eso necesito que cuando los 3 estén cerrados, si intento abrir primero el i1 o i2 no debe permitírmelo y debe saltar el interruptor automático (i3 debe abrirse). Eso si, una vez abierto i3, (se desergiza la red) y ya si pueden abrir i1 e i2.

Que yo sepa la mayoria de los seccionadores son manuales, por lo tanto ¿qué impide que un operador lo abra? ¿Los seccionadores son motorizados?, si fuera el caso habría que saber como se controla dicho seccionador, es mas, un seccionador solo debe operarse es ausencia de corriente, por lo cual, deberia tener un candado y no tocarse. Cuando dices interruptor automático y subestación, a mi cabeza vienen interruptores de caja moldeada o de bastidor abierto. Los cuales llevan asociados generalmente dos bobinas una de cierre y otra de apertura, por lo que el control de un caso u otro son circuitos distintos.

Si se puede hacer con Arduino, por supuesto. Yo lo haría bajo una condición: un analisis exhaustivo de todo el circuito y creando un PLC a medida para dicho proyecto: con entradas optoacopladas, prueba de ruidos, salidas protegidas, etc. Pero yo, soy yo. Tanto el moderador como yo trabajamos en entornos industriales y debemos tener eso en cuenta; sobretodo si alguien sin conocimientos quiere jugar con fuego.

ANTE TODO SEGURIDAD, NO QUEREMOS ACCIDENTES!!.

En cuanto el planteamiento de tu problema.

Si estando encendida las 3 luces, si intentamos abrir el interruptor i1 (no sólo no se apague su led l1, sino que se abra el interruptor i3 o sino que se apague el led de l3. En este mismo caso con las 3 luces encendidas, si intentamos abrir i2, no solo no debe apagarse su luz, sino que debe abrirse i3 o apagarse su luz (led 3).

Tal y como se ha planteado en el primer post es imposible que se abra el interruptor i3 de manera automática, como mucho podemos apagar el led 3.

L3 se apagará cuando i3 se abra, cuando i1 se abra o cuando i2 se abra, o traducido en código, un simple condicional debería bastar:

if ( l3==HIGH && ( i1==LOW || i2==LOW || i3 == LOW ) ) digitalWrite(l3, LOW);
-Tambien necesito un añadir un interruptor, que si se pulsa por primera vez, abra el interruptor i3, por 5 segundos o al menos que apague su luz por ese tiempo. Pasados los 5 segundos vuelve a estar activo y si se vuelve a pulsar el interruptor, pues debe abrir i3 o su led por 30 segundos. Si vuelve a ocurrir una tercera vez, deja ya abierto permanentemente i3 o su luz. En realidad, esto (el interruptor) sería la simulación de un fallo en la red, donde la primera vez se desactiva (salta el interruptor automatico i3) y se reengancha a los segundos para finalmente al tercer fallo, quedar permanentemente abierto por motivos de seguridad.

Aquí la idea es usar un contador que cuente las veces que se ha cerrado. Cada vez que el interruptor se cierre cuentas. Si el contador vale 1, debes usar un temporizador para contar 5 segundos, tras los cuales debes encender el led. Eso se realiza mediante millis y puedes pasarte por la sección documentación y ver algunos tutoriales que se han creado para aprender a usarla. Cuando el contador vale 2, lo mismo pero esperando 30 segundos; y si vale 3, no necesitas contar tiempo solo abrir.

Aquí ya no son simples condicionales, es más complicado y conviene practicar un poco con una serie de ejemplos, hasta que al final la temporización entre en la cabeza.

¿O sea que yo que cumplo los 60 en un par de meses ya estaría desahuciado?
No, no lo creo. Mientras tenga una neurona funcionando pienso seguir aprendiendo.
Pienso seguir leyendo para adquirir nuevos conceptos, colaborando humildemente aquí en el foro y desarrollando códigos aunque sean inútiles para el resto del mundo.
Y el día que no pueda hacerlo me dedicaré a tejer al crochet o al bordado, pero quedarme quieto jamás. :wink:


Por otro lado coincido con el compañero @victorjam, has puesto 3 palabras que no se condicen con alguien que no sabe de lo que habla, y si en realidad no sabes, no quisiera estar cerca de una subestación si un seccionador llega a generar un arco.

Saludos

Yo creo que tendras 60 (como yo los tengo) pero no sabes leer las normas de un foro.
Dices haber hecho por semanas códigos pero no has publicado nada.
Para mi estas pidiendo que te hagan la tarea. Lisa y llanamente.
Mi primer escrito era de creer que eras un estudiante pidiendo la tarea como pasa todos los dias, luego leo subestación y digo.. bueno, este esta en otra actividad y es sumamente riesgoso hacerlo con Arduino (que no esta certificado para esto).
En fin, entiendo que te molestes pero como no has leído las normas, tu solo caes en desconocer como nos manejamos en los foros técnicos.
No es personal, no te conozco y seguramente café mediante entenderías todo y no te pondrias a la defensiva como lo has hecho.
Te pedí que leas las normas, lo hiciste?
Por tu respuesta parece que no aún. Bueno, hazlo y al menos comprenderás mejor los por qué de los ultimos 3 comentarios.

Te agradezco tu respuesta Victorjam y quizas no me he explicado bien, ya que yo he hablado de simulación de una línea de subestación, cuando quizas debí decir APROXIMACIÓN a una simulación, ya que ni muchísimo menos pretendo llevar esto a la práctica y como dices el control de una posición de una subestación es algo más complejo. Como digo, os precipitais al pensar que es para aplicación profesional, simplemente que estudio por mi cuenta un certificado de profesionalidad de Energias renovables, lo cual implica la generación y distribución eléctrica (subestaciones) y quería combinarlo con estudiar un poco de electronica de control y potencia y por supuesto arduino.
Básicamente me planteamiento era una simplificación de una linea de llegada de energía a una subestación, dónde tienes un seccionador de barras, un interruptor automatico (puede ser de caja moldeada pero estos no van a armario, sino que son de otro tipo) y otro seccionador de línea (todos en serie y los seccionadores van gobernados por relés).
Bueno, voy a darle una vuelta de tuerca a lo que has publicado.
Gracias de nuevo.

Hola Gatul.
Yo tengo más ganas que nunca de aprender (no te quepa duda). El problema es que desgraciadamente no tengo la capacidad de concentración y aprendizaje que tenía antes. Pero esto me pasa a mi y no tiene porque pasarle lógicamente a todo el mundo de mi edad.
Saludos y gracias

@rotawas
Aquí muchos tenemos ya problemas de próstata. :sweat_smile:
Yo te recomiendo que empieces comprando un kit de incio (starter kit) con sensores etc y que tenga documentación. Como este que puede traer documentación en español:
https://store.arduino.cc/collections/kits/products/arduino-starter-kit-multi-language

Tenga en cuenta que lo que está preguntando es muy básico en arduino/programación.
Creo que de nada sirve que le hagan el programa si no comprende cómo se hace...
Por lo menos aprender con el kit cómo encender leds, cómo funcionan los pulsadores, etc etc etc.

Saludos.