Problema con conmutador.

Muy buenas,
Primero presentarme como novato en este mundo y agradecer la info que comparteis (sobre todo para los novatos como yo).
Os cuento un poco mi problema:
Estoy trabajando en un proyecto muy sencillo, tengo un conmutador con dos posiciones y cada posición me hace una combinación diferente con dos leds. Hasta ahí todo bien y me funciona, el problema lo tengo cuando quiero repetir la misma posición, es decir, si estoy en la posición 1 y quiero volver a repetirla, tengo que mover el conmutador a la posición 2 y luego a la 1 y lo que me ocurre (y es lo que no quiero) es que, aunque lo haga muy rápido, me hace la combinación de la posición 2 y luego la combinación de la posición 1.

Encontré algo de información diciendo que se puede añadir una condición que se esperara un segundo para tomar la acción, pero no se como implantarla.
Lo máximo que he llegado es a meter un delay, que me hace esperar un segundo para cada posición, pero no consigo nada mas.

Os agradecería si me podéis echar un cable.
El código es el siguiente:

// iniciamos pines digitales les como salidas y entradas.
int arriba = 4; // Pin 4 (Luz Arriba)
int derecha = 5; // Pin 5 (Luz Derecha)
int mezcla1 = 8; // Pin 8 (Mezcla luces 1)
int mezcla2 = 9; // Pin 9 (Mezcla luces 2)
int contadormezcla1;
int contadormezcla2;
void setup() {
pinMode(arriba, OUTPUT);
pinMode(derecha, OUTPUT);
pinMode(mezcla1, INPUT);
pinMode(mezcla2, INPUT);
}
void loop() {
if (digitalRead(mezcla1) == HIGH) { // Si activamos mezcla luces 1
if (contadormezcla1 == 0) {
digitalWrite(derecha, HIGH); // Encendemos luz derecha
delay(5000); // Durante 5 seg
digitalWrite(derecha, LOW); // Apagamos luz derecha
delay(1000); // Esperamos 1 seg
digitalWrite(arriba, HIGH); // Encendemos luz arriba
delay(5000); // Durante 5 seg
digitalWrite(arriba, LOW); // Apagamos luz arriba
delay(1000); // Esperamos 1 seg
contadormezcla1 = 1;
}
}
else {
contadormezcla1 = 0;
}
if (digitalRead(mezcla2) == HIGH) { // Si activamos mezcla luces 2
if (contadormezcla2 == 0) {
digitalWrite(derecha, HIGH); // Encendemos luz derecha
delay(5000); // Durante 5 seg
digitalWrite(derecha, LOW); // Apagamos luz derecha
delay(1000); // Esperamos 1 seg
digitalWrite(derecha, HIGH); // Encendemos luz derecha
delay(5000); // Durante 5 seg
digitalWrite(derecha, LOW); // Apagamos luz derecha
delay(1000); // Esperamos 1 seg
contadormezcla2 = 1;
}
}
else {
contadormezcla2 = 0;
}
}

Gracias de nuevo y un saludo.

Hola Mig_Shadow, bienvenido.

Una tontería... ¿Por qué no pones dos pulsadores en lugar de un conmutador? No sé muy bien la aplicación para la que haces esto pero en general cuando se quiere repetir un proceso aunque se acabe de hacer lo lógico es poner un pulsador. Si se pone un conmutador o un pulsador con enclavamiento es porque no se quiere dar al usuario la posibilidad de repetir la acción si es la que se ha hecho en últimar lugar.

Muiy buenas,

Pues la idea de poner un conmutador es que mas adelante lo quiero escalar a 12 posiciones con 4 luces y claro....12 pulsadores...
Alguna idea de como puedo poner alguna condición para que solo actue sobre el último contacto del conmutador?

Un saludo.

mmmm.... has pensado en un conmutador de 3 posiciones? la posición del medio la dejas vacía y las otras como pos1 i pos2 entonces para repetir la uno, vuelves al medio, que no tiene ninguna función, y vuelves a la1, es la única manera que se me ocurre(eso si he entendido bien lo que quieres hacer) ahora, que yo soy bastante novato, es solo una idea...

Yo lo que haría, de caras a tener 12 modos de luces, llamemos-lo así, seria poner un par de displays de 7 segmentos con 2 botones, uno para incrementar el numero del modo y otro para seleccionar dicho modo, me explico, la idea seria que al pulsar el pulsador de incremento, el numero del dysplay se incrementara en uno, con posibilidad de incrementar hasta 12, i que retornara a 1 si el numero actual fuera 12, i una vez seleccionado el modo deseado, el otro botón serviría para ponerlo en acción, de manera que tendrías una función asociada a cada numero. Si no he entendido el concepto o me he explicado mal (cosa que es probable) pregunta :wink: saludos!

dacas999, gracias por la idea, pero eso implicaría poner mas botones de lo que pensaba y no es la idea.

gGacias de todos modos.

Alguna idea para poder poner una condición extra, como por ejemplo esperar un segundo, una vez detectado el interruptor y si consigue pasar un segundo que realice la acción siguiente?
Creo que con eso solucionaría el problema, no se si me explico.

Un saludo a todos.

Es muy extraño las características de funcionamiento que buscas y así se reflejará en la programación, tanto que no vas a encontrar una solución sencilla de añadir aquí o allá un delay.

La idea de lo que necesitas podría ser: leer continuamente el estado de todos los pulsadores (de momento lo estás haciendo sólo con dos).

  • Cuando uno cambie de estado de LOW a HIGH tienes que empezar a contar el tiempo. Pasados X milisegundos si no ha cambiado el estado de esa entrada entonces ejecutas su ciclo de luces. Si ha cambiado no hay que ejecutar su ciclo de luces.

  • Cuando uno cambie de estado de HIGH a LOW empezar a contar el tiempo. Si en menos de los mismos X milisegundos vuelve a estado HIGH ejecutar el programa del primer punto. Si no vuelve a estao HIGH no ejecutar su ciclo de luces.

Esta es la idea, ahora tienes que implementar el código.

Prueba lo siguiente, aunke no se si funcionara, no lo he probado...

// iniciamos pines digitales les como salidas y entradas.
int arriba = 4;  // Pin 4 (Luz Arriba)
int derecha = 5;  // Pin 5 (Luz Derecha)
int mezcla1 = 8;  // Pin 8 (Mezcla luces 1)
int mezcla2 = 9; // Pin 9 (Mezcla luces 2)

boolean contadormezcla1; //variables booleanas
boolean contadormezcla2;

boolean esperar = true;



void setup() { 
  
  pinMode(arriba, OUTPUT);   
  pinMode(derecha, OUTPUT); 
  pinMode(mezcla1, INPUT);
  pinMode(mezcla2, INPUT);
  
}
 
 
void loop() {
  
  Programa();//llama a la funcion programa
   
}

void Programa() {
  
   if (digitalRead(mezcla1) == HIGH) { // Si activamos mezcla luces 1
      
       if (esperar == true){
       
           delay(1000);
           esperar = false;
           Programa();
       
       }
       if (contadormezcla1 == true && esperar == false) {
         
           ModoLuces_1();
           contadormezcla1 = false;
           esperar = true;
        
       } 
       else {
           contadormezcla1 = true;
       }
   
   
    
      
  }
   
  
    if (digitalRead(mezcla2) == HIGH) { // Si activamos mezcla luces 2
     
       if (esperar == true){
       
           delay(1000);
           esperar = false;
           Programa();
       
       }
       if (contadormezcla2 == true) {
         
           ModoLuces_2();
           contadormezcla2 = false;
           esperar = true;
        
       } 
       else {
           contadormezcla2 = true;
       }
   
  
   
  }  
  
}

void ModoLuces_1() {
  
  digitalWrite(derecha, HIGH);  // Encendemos luz derecha
  delay(5000);  // Durante 5 seg
  digitalWrite(derecha, LOW);  // Apagamos luz derecha
  delay(1000);  // Esperamos 1 seg
  digitalWrite(arriba, HIGH);  // Encendemos luz arriba
  delay(5000);  // Durante 5 seg
  digitalWrite(arriba, LOW);  // Apagamos luz arriba
  delay(1000);  // Esperamos 1 seg

}

void ModoLuces_2() {

  digitalWrite(derecha, HIGH);  // Encendemos luz derecha
  delay(5000);  // Durante 5 seg
  digitalWrite(derecha, LOW);  // Apagamos luz derecha
  delay(1000);  // Esperamos 1 seg
  digitalWrite(derecha, HIGH);  // Encendemos luz derecha
  delay(5000);  // Durante 5 seg
  digitalWrite(derecha, LOW);  // Apagamos luz derecha
  delay(1000);  // Esperamos 1 seg

}

Gracias por la ayuda dacas999, lo pruebo y te cuento.

Un saludo.

Okay!!!

dacas999, parece que funciona, pero se repite continuamente y la idea era que solo lo haga una vez.
Ya falta menos!

Gracias por la ayuda!

Mig_Shadow:
dacas999, parece que funciona, pero se repite continuamente y la idea era que solo lo haga una vez.
Ya falta menos!

Gracias por la ayuda!

Pruebo a pornerle un bucle for para que lo haga solo una vez.

// iniciamos pines digitales les como salidas y entradas.
int arriba = 4;  // Pin 4 (Luz Arriba)
int derecha = 5;  // Pin 5 (Luz Derecha)
int mezcla1 = 8;  // Pin 8 (Mezcla luces 1)
int mezcla2 = 9; // Pin 9 (Mezcla luces 2)

boolean contadormezcla1; //variables booleanas
boolean contadormezcla2;

boolean esperar = true;



void setup() { 
  
  pinMode(arriba, OUTPUT);   
  pinMode(derecha, OUTPUT); 
  pinMode(mezcla1, INPUT);
  pinMode(mezcla2, INPUT);
  
}
 
 
void loop() {
  
  Programa();//llama a la funcion programa
   
}

void Programa() {
  
   if (digitalRead(mezcla1) == HIGH) { // Si activamos mezcla luces 1
     
      
       if (esperar == true){
       
           delay(1000);
           esperar = false;
           Programa();
       
       }
       if (contadormezcla1 == true && esperar == false) {
         
         for (int i = 1; i<2; i++){
           ModoLuces_1();
           contadormezcla1 = false;
           esperar = true;
         }
        
       } 
       else {
           contadormezcla1 = true;
       }
   
   
    
      
  }
   
  
    if (digitalRead(mezcla2) == HIGH) { // Si activamos mezcla luces 2
      
     
       if (esperar == true){
       
           delay(1000);
           esperar = false;
           Programa();
       
       }
       if (contadormezcla2 == true) {
         
         for (int x = 1; x<2; x++){
           ModoLuces_2();
           contadormezcla2 = false;
           esperar = true;
           
         }
        
       } 
       else {
           contadormezcla2 = true;
       }
   
  
   
  }  
  
}

void ModoLuces_1() {
  
  digitalWrite(derecha, HIGH);  // Encendemos luz derecha
  delay(5000);  // Durante 5 seg
  digitalWrite(derecha, LOW);  // Apagamos luz derecha
  delay(1000);  // Esperamos 1 seg
  digitalWrite(arriba, HIGH);  // Encendemos luz arriba
  delay(5000);  // Durante 5 seg
  digitalWrite(arriba, LOW);  // Apagamos luz arriba
  delay(1000);  // Esperamos 1 seg

}

void ModoLuces_2() {

  digitalWrite(derecha, HIGH);  // Encendemos luz derecha
  delay(5000);  // Durante 5 seg
  digitalWrite(derecha, LOW);  // Apagamos luz derecha
  delay(1000);  // Esperamos 1 seg
  digitalWrite(derecha, HIGH);  // Encendemos luz derecha
  delay(5000);  // Durante 5 seg
  digitalWrite(derecha, LOW);  // Apagamos luz derecha
  delay(1000);  // Esperamos 1 seg

}

:~...pues no, sigue repitiendose....arrrrggg!!!!

cachis! XD Me he dejado una cosa... XD aver si ahora funciona

// iniciamos pines digitales les como salidas y entradas.
int arriba = 4;  // Pin 4 (Luz Arriba)
int derecha = 5;  // Pin 5 (Luz Derecha)
int mezcla1 = 8;  // Pin 8 (Mezcla luces 1)
int mezcla2 = 9; // Pin 9 (Mezcla luces 2)

boolean contadormezcla1; //variables booleanas
boolean contadormezcla2;

boolean esperar = true;



void setup() { 
  
  pinMode(arriba, OUTPUT);   
  pinMode(derecha, OUTPUT); 
  pinMode(mezcla1, INPUT);
  pinMode(mezcla2, INPUT);
  
}
 
 
void loop() {
  
  Programa();//llama a la funcion programa
   
}

void Programa() {
  
   if (digitalRead(mezcla1) == HIGH) { // Si activamos mezcla luces 1
     
      
       if (esperar == true){
       
           delay(1000);
           esperar = false;
           Programa();
       
       }
       if (contadormezcla1 == true && esperar == false) {
         
         
           ModoLuces_1();
           contadormezcla1 = false;
           esperar = true;
         
        
       } 
       else {
           contadormezcla1 = true;
       }
   
   
    
      
  }
   
  
    if (digitalRead(mezcla2) == HIGH) { // Si activamos mezcla luces 2
      
     
       if (esperar == true){
       
           delay(1000);
           esperar = false;
           Programa();
       
       }
       if (contadormezcla2 == true && esperar == false) {
         
         for (int x = 1; x<2; x++){
           ModoLuces_2();
           contadormezcla2 = false;
           esperar = true;
           
         }
        
       } 
       else {
           contadormezcla2 = true;
       }
   
  
   
  }  
  
}

void ModoLuces_1() {
  
  digitalWrite(derecha, HIGH);  // Encendemos luz derecha
  delay(5000);  // Durante 5 seg
  digitalWrite(derecha, LOW);  // Apagamos luz derecha
  delay(1000);  // Esperamos 1 seg
  digitalWrite(arriba, HIGH);  // Encendemos luz arriba
  delay(5000);  // Durante 5 seg
  digitalWrite(arriba, LOW);  // Apagamos luz arriba
  delay(1000);  // Esperamos 1 seg

}

void ModoLuces_2() {

  digitalWrite(derecha, HIGH);  // Encendemos luz derecha
  delay(5000);  // Durante 5 seg
  digitalWrite(derecha, LOW);  // Apagamos luz derecha
  delay(1000);  // Esperamos 1 seg
  digitalWrite(derecha, HIGH);  // Encendemos luz derecha
  delay(5000);  // Durante 5 seg
  digitalWrite(derecha, LOW);  // Apagamos luz derecha
  delay(1000);  // Esperamos 1 seg

}

:(...nada, es curioso, es como si se reiniciara y cada vez empezara de cero y no le hiciera caso al for :~

XD me puedes pasar el circuito, aver como esta montado?

Eso me va a costar un poco, pero lo intento.

Yo creo que el problema está en que ignora el estado del contador y para el siempre es verdadero :~

okay!

http://arduino.cc/forum/index.php/topic,73341.0.html

Mira, esto es algo parecido a lo que te decía al principio del post, solo necesitas 1 pulsador para activar los modos de luces que tu quieras, (si son muchos, puede ser bastante tedioso.. XD)