Activar dos leds con un pulsador {Solucionado}

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

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;

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... :blush:

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

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.

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

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

PE PUDIERAIS PASAR EL CODIGO YA TERMINADO PORFAVOR

joseluisg3D bienvenido a foro arduino.
Se que eres nuevo (3 msgs) pero no te percataste que todos los mensajes son del 2013?
No solo no has leído las normas del foro y has pasado por alto la advertencia en letras rojas que te advertía que el hilo tenia mas de 120 dias sin movimientos, pero lo peor es que no has leído nada?

El código esta en el hilo, resuelto por Noter.