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