Duda rápida pulsador

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.

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

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

int estado =0
setup(){
...
}
void loop(){
 buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    if(estado)
        digitalWrite(ledPin, HIGH);
   else
        digitalWrite(ledPin, LOW);
   estado ~= estado;
  } 
}

Ok pruebo y te digo algo.Muchas gracias!

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;

...
if( estado%2 != 0)
...
estado++;
...

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

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

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

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

Te explico el código;

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

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

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

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

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

Cierto roca, pero tendrías que pulsar el botón millones de veces, no se yo si el botón lo resisitiría :grin:

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:

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;
  } 
}

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