Pages: [1]   Go Down
Author Topic: Activar dos leds con un pulsador {Solucionado}  (Read 902 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
}
}
« Last Edit: April 09, 2013, 10:46:59 am by Araldez » Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 252
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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;   
« Last Edit: April 07, 2013, 06:38:58 pm by American2020 » Logged

My 3x3x3 Led Cube

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

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

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

Palencia, Spain
Offline Offline
Sr. Member
****
Karma: 20
Posts: 401
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Muchas Gracias Noter , Me has sido de gran Ayuda .
 smiley-grin smiley-grin
Logged

Pages: [1]   Go Up
Jump to: