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;
}
}
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.
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?
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 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.
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.
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)