Go Down

Topic: Activar dos leds con un pulsador {Solucionado} (Read 1 time) previous topic - next topic

Araldez

Apr 07, 2013, 09:56 pm Last Edit: Apr 09, 2013, 05:46 pm by Araldez Reason: 1
Hola a todos ,
Quiero encender dos leds con el mismo pulsador , cada uno con diferente duración de pulsación.(Espero que se pueda hacer)
Encender/Apagar el Led 1 con una pulsacion de menos de 0.200seg y el siguiente también Encendido/apagado , con una pulsación de mas de 0.5seg
La parte de encender el segundo si funciona cuando intento hacer algo con el primero , no funciona.



// Parametros
int HOLD_DELAY = 500;   // Seleccionar el tiempo necesario para el segundo pulsador
int HOLD_DELAY1 = 200; // Seleccionar el tiempo necesario para el primer pulsador
int ledPin = 10 ;
int ledPin1  = 11;      // LED esta conectado
int switchPin  = 8;      // Pulsador conectado al Pin X

//  Variables
unsigned long start_hold;
boolean allow = false;
int sw_state;
int sw_laststate = LOW;
int led_state = LOW;
int led_state1 = LOW;

// Setup
void setup() {
 Serial.begin(9600);
 pinMode(ledPin, OUTPUT);   // Configura el Pin como salida
 pinMode(ledPin1, OUTPUT);  // Configura el Pin como salida
 pinMode(switchPin, INPUT);    // Configura el Pin como entrada
}

// Loop
void loop(){
 sw_state = digitalRead(switchPin);             // Lectura valor entrada
 
 if (sw_state == HIGH && sw_laststate == LOW){  // for button pressing
   start_hold = millis();                       // marca el tiempo
   allow = true;                                // permite el cambio de estado del Led
 }
   
  if (allow == true && sw_state == HIGH && sw_laststate == HIGH){  // si el boton permanece presionado
     if ((millis() - start_hold) >= HOLD_DELAY){                   // Durante mas de  x/1000 sec(s)
        led_state = !led_state;                                   // cambia estado del Led
        allow = false;                                            // prevent multiple state changes
     }
     
     //EL  OTRO LED /*/**************************************//*
     
 if (sw_state == HIGH && sw_laststate == LOW){  // for button pressing
   start_hold = millis();                       // mark the time
   allow = true;                                // allow LED state changes
 }
   
  if (allow == true && sw_state == HIGH && sw_laststate == HIGH){  // if button remains pressed
     if ((millis() - start_hold) >= HOLD_DELAY1){                   // for longer than x/1000 sec(s)
        led_state1 = !led_state;                                   // change state of LED
        allow = false;                                            // prevent multiple state changes
     }
 }

 sw_laststate = sw_state;  
 digitalWrite(ledPin, led_state);
 digitalWrite(ledPin1, led_state1);
}
}

American2020

#1
Apr 08, 2013, 01:33 am Last Edit: Apr 08, 2013, 01:38 am by American2020 Reason: 1
Hola, no estoy seguro, pero prueba esto.

Estás reteniendo el código en el IF que verifica que el botón está pulsado y está esperando si llega a los 500 milisegundos, si lo sueltas y no llegó a los 500 milisegundos, entonces pasas al segundo IF (Osea, nunca entra acá, porque el botón ya fué soltado antes de los 500 milis)

Por ende, acá abajo directamente deberías seguir con el código que asume que se lo presionó por menos de 500 milisegundos, por ende directamente prendes o apagas el LED 1

También podrías hacer un código que lea por cuanto tiempo se mantuvo presionado el botón y que devuelva un valor, y luego si fué de más de 500 aplicas a un código y si fué de 10 a 499 aplicas a otro.

Sólo habría que ver que está pasando con el "Bounce" en este código, pero creo que por este lado va la solución...


Y ojo que tienes led_state1 = !led_state;   

creo que debería ser led_state1 = !led_state1; 
My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

Araldez

Por mas que lo he intentado no me funciona , vamos (que no se como hacerlo), y yo pensando en poner otra salida con mas aún mas tiempo... :smiley-red:

Algún alma caritativa puede ayudarme ? nose como va el contador del tiempo de la pulsación .

noter

Prueba a ver con este código para ver qué milisegundos de pulsación te da. Espero no haber metido la pata, porque no lo he testado. Tal vez se te presente un problema de "rebote" de interruptor. Si funciona y Serial te devuelve longitudes de pulsación congruentes, sólo te queda poner los if donde está el Serial.print.
Code: [Select]
const int switchPin  = 8;      // Pulsador conectado al Pin X

//  Variables
unsigned long start_hold;
int sw_laststate = LOW;

// Setup
void setup() {
  Serial.begin(9600);
  pinMode(switchPin, INPUT);    // Configura el Pin como entrada
}

void loop(){
  if(digitalRead(switchPin)!=sw_laststate){             // Cambio estado pin
      sw_laststate = !sw_laststate;
      if (sw_laststate==HIGH){
        start_hold=millis();
      } else {
        Serial.print("Tiempo pulsado: ");
        Serial.println(millis()-start_hold);
      }
  }
}


Espero no haber metido la pata y que te sirva de ayuda.
Saludos

Araldez

Muchas Gracias Noter , Me has sido de gran Ayuda .
:D :D

Go Up