Go Down

Topic: Duda rápida pulsador (Read 1 time) previous topic - next topic

PascuaL

Seria pulsar un pulsador y que se encienda un led y cuando se vuelva a pulsar que se apague.No me estoy refiriendo a un delay y que se quede un tiempo, sino que se encienda y apague tiempo indefinido.





Muchas gracias de antemano.

yOPERO

Busca la librería "Button.h" y escoge la opción "button.onpress"
Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

PepeChorva

Tienes que crearte un registro para saber en qué estado está el led, y luego variar su estado en cada pulsación, algo así;
Code: [Select]

int estado =0
setup(){
...
}
void loop(){
buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH) {
   if(estado)
       digitalWrite(ledPin, HIGH);
  else
       digitalWrite(ledPin, LOW);
  estado ~= estado;
 }
}
---
Saludos,
José Chorva
www.pepechorva.com
@pepechorva on twitter

PascuaL

Ok pruebo y te digo algo.Muchas gracias!

PepeChorva

la línea de estado ~= estado; no la he probado, no se si funcionaría, espero que sí.
Si no funciona, puedes usar este otro método;
Code: [Select]
...
if( estado%2 != 0)
...
estado++;
...

---
Saludos,
José Chorva
www.pepechorva.com
@pepechorva on twitter

PascuaL

No entiendo lo que dices exactamente, a poder ser, si no es mucha molestia me gustaria ver el código con el pulsador.
Gracias!

0xDA_bit

Para no complicarte mucho aunque el post de PepeChorva es perfecto usaria esta alternativa:

Code: [Select]

contador=1;
buttonState=analogRead(pulsador);
if(buttonState==HIGH){
   if(buttonState==LOW){         //Esta parte es solo para asegurar que el pulsador se ha pulsado una vez
      if(contador==1){
         digitalWrite(led, HIGH);
         contador--;                  //Puedes usar esta instrucción o asginarle directamente contador=0;
      }
      else{
         digitalWrite(led, LOW);
         contador++;                 //Puedes usar esta instrucción o asginarle directamente contador=1;
      }
   }
}


Espero haberte ayudado
riKon
visita mi blog tallerarduino.wordpress.com

PepeChorva

He probado lo de estado ~=estado y no me funciona, cámbialo por estado = !estado;

Te explico el código;
Code: [Select]
int estado =0 //comprobador de estado (para encendido/apagado)
setup(){
...
}
void loop(){
buttonState = digitalRead(buttonPin); //lectura del botón, si esta pulsado entrará
  if (buttonState == HIGH) {
    if(estado) //comprueba el valor de estado (1 o 0) encendido o apagado
        digitalWrite(ledPin, HIGH);
   else
        digitalWrite(ledPin, LOW);
   estado = !estado; //niega el valor de estado, si era 1, pasa a ser 0 y viceversa
  }
}


En la otra forma que te decía, en lugar de negar el valor de estado, le va sumando 1 y comprueba si el valor es par o impar, para decidir si encender o apagar el led
Code: [Select]

int estado =0
setup(){
...
}
void loop(){
buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    if(estado%2==0) //comprueba si estado es par o impar, si es par enciende el led
        digitalWrite(ledPin, HIGH);
   else //si es impar, apaga el led
        digitalWrite(ledPin, LOW);
   estado++; //estado va acumulando el valor de 1 en 1 (par e impar) para las siguientes comprobaciones
  }
}
---
Saludos,
José Chorva
www.pepechorva.com
@pepechorva on twitter

roca


En la otra forma que te decía, en lugar de negar el valor de estado, le va sumando 1 y comprueba si el valor es par o impar, para decidir si encender o apagar el led
Code: [Select]

int estado =0
setup(){
...
}
void loop(){
buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    if(estado%2==0) //comprueba si estado es par o impar, si es par enciende el led
        digitalWrite(ledPin, HIGH);
   else //si es impar, apaga el led
        digitalWrite(ledPin, LOW);
   estado++; //estado va acumulando el valor de 1 en 1 (par e impar) para las siguientes comprobaciones
  }
}



No tendrías problemas de overflow con al variable "estado"? Porque siempre la haces crecer y llegara al máximo permitido. Utilizando tu código y poniendo la asignación de estado=estado%2 se solucionaría, quedaría así:

Code: [Select]

int estado =0
setup(){
...
}
void loop(){
buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    estado=estado%2;
    if(estado==0) //comprueba si estado es par o impar, si es par enciende el led
        digitalWrite(ledPin, HIGH);
   else //si es impar, apaga el led
        digitalWrite(ledPin, LOW);
   estado++; //estado va acumulando el valor de 1 en 1 (par e impar) para las siguientes comprobaciones
  }
}

PepeChorva

#9
Dec 23, 2011, 01:28 pm Last Edit: Dec 23, 2011, 01:42 pm by PepeChorva Reason: 1
Cierto roca, pero tendrías que pulsar el botón millones de veces, no se yo si el botón lo resisitiría  :smiley-mr-green:

Tu forma sería más correcta, sí señor.

Edito; me he dejado un detalle que quizás es relevante, un delay, para que de tiempo a quitar el dedo del botón:
Code: [Select]
const int buttonPin = 8;
const int ledPin =  13;
int estado = 0;

void setup() {
  pinMode(ledPin, OUTPUT);     
  pinMode(buttonPin, INPUT);     
}

void loop(){
  if (digitalRead(buttonPin) == HIGH) {
    delay(500);
    if(estado)
        digitalWrite(ledPin, HIGH);
   else
        digitalWrite(ledPin, LOW);
   estado = ~estado;
  }
}
---
Saludos,
José Chorva
www.pepechorva.com
@pepechorva on twitter

PascuaL

OLE, OLE Y OLE!!
Muchísimas gracias a todo vuestro apoyo, funciona 100%.He utilizado el último código de PepeChorva.
Feliz Navidad!=)

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy