Pages: [1]   Go Down
Author Topic: Duda rápida pulsador  (Read 1198 times)
0 Members and 1 Guest are viewing this topic.
Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Madrid
Offline Offline
Sr. Member
****
Karma: 5
Posts: 481
Life isn't about finding yourself, life is about creating yourself!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Busca la librería "Button.h" y escoge la opción "button.onpress"
Logged

Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

Onda
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
This is personal...
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
int estado =0
setup(){
...
}
void loop(){
 buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    if(estado)
        digitalWrite(ledPin, HIGH);
   else
        digitalWrite(ledPin, LOW);
   estado ~= estado;
  }
}
Logged

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

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok pruebo y te digo algo.Muchas gracias!
Logged

Onda
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
This is personal...
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
...
if( estado%2 != 0)
...
estado++;
...
Logged

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

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Barcelona
Offline Offline
Jr. Member
**
Karma: 0
Posts: 64
electronix
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

riKon
visita mi blog tallerarduino.wordpress.com

Onda
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
This is personal...
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Te explico el código;
Code:
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:
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
  }
}
Logged

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

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

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

Onda
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
This is personal...
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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;
  }
}
« Last Edit: December 23, 2011, 07:42:02 am by PepeChorva » Logged

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

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: