Pages: [1] 2   Go Down
Author Topic: Problema con conmutador.  (Read 2104 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: September 23, 2011, 07:03:50 am by Mig_Shadow » Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink saludos!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
// 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

}

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Un saludo.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Okay!!!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
// 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

}

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-confuse...pues no, sigue repitiendose....arrrrggg!!!!
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

cachis! smiley-lol Me he dejado una cosa... smiley-lol aver si ahora funciona

Code:
// 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

}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-sad...nada, es curioso, es como si se reiniciara y cada vez empezara de cero y no le hiciera caso al for smiley-confuse
« Last Edit: September 24, 2011, 12:46:05 pm by Mig_Shadow » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

smiley-lol me puedes pasar el circuito, aver como esta montado?
Logged

Pages: [1] 2   Go Up
Jump to: