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.