Mandar pulso a LED

Hola que tal a todos, tengo un problema con mi código que estoy intentando hacer. El programa lo que debería hacer es: Presiono un botón, prende el led y lo apaga. Cuando suelto el botón, prende el led y lo apaga de nuevo. El problema es que lo debería hacer una vez pero a mi se me queda haciendo múltiples veces y no logro poder hacer que lo haga una vez cada vez que presiono el botón.

int entrada = 6;
int led = 13;
int entero;

void setup() {
Serial.begin(9600);
  
pinMode(entrada,INPUT_PULLUP);
pinMode(led, OUTPUT);

}

void loop() {
Serial.println(entero);

if(digitalRead(entrada) == HIGH){
  if(entero == 1){
  digitalWrite(led, LOW);
  delay(500);
  digitalWrite(led, HIGH);
  delay(500);
  digitalWrite(led, LOW);
  delay(500);
  entero = 2;
  
}}

if(digitalRead(entrada) == LOW){ 
 if(entero == 2){
  digitalWrite(led, LOW);
  delay(500);
  digitalWrite(led, HIGH);
  delay(500);
  digitalWrite(led, LOW);
  delay(500);
  entero = 1;
  
}}



  
}

intente de multiples formas pero no logro pensarlo, alguien podria darme una mano?

int entrada = 6;
int led = 13;
int entero;



void setup() {
  Serial.begin(9600);
  
pinMode(entrada,INPUT_PULLUP);
pinMode(led, OUTPUT);

}

void loop() {

if(digitalRead(entrada) == HIGH){
digitalWrite(led, HIGH);
  delay(1000);
  digitalWrite(led, LOW);
}
else{
digitalWrite(led, HIGH);
  delay(1000);
  digitalWrite(led, LOW);
}
bool estadoActual = false, estadoUltimo, contador = false;
const byte LED = 13;
const byte boton = 6;

void setup()
{
  pinMode(LED, OUTPUT); // Pin 113 como salida, para el Led.
  pinMode(boton, INPUT_PULLUP); // Pin 2 como entrada.
  Serial.begin(115200); // Velocidad en baudios para el puerto serie.
}

void loop()
{
  estadoActual = digitalRead(boton); // Guarda el estado del pulsador.
  //delay(50); // Retardo de 50 mili segundos par evitar antirebotes.

  // ¿Pulsador y estadoActual y negación del estadoUltimo es verdadero?
  if (digitalRead(boton) && estadoActual && !estadoUltimo)
  {
    contador = !contador;   // Cambio el estado tipo boleano.

    if (contador)
    {
      
      digitalWrite(LED, HIGH);
      delay(500);
      digitalWrite(LED, LOW);
      
      Serial.write("ON"); // Envía por el puerto ON.
    }
    else
    {
      
      digitalWrite(LED, HIGH);
      delay(500);
      digitalWrite(LED, LOW);
      
      Serial.write("OFF"); // Envía por el puerto OFF.
    }
  }

  // Pasa del estadoActual a estadoUltimo.
  estadoUltimo = estadoActual;
}

Este ultimo nada mas lo prende y apaga cada vez que presiono y suelto el botón.
Nose como no me puede salir, parece algo simple pero no lo puedo hacer.

No comprendo que quieres hacer.
Presionas y hace una secuencia, sueltas y hace otra secuencia y nada mas?

Explicaré tu primer código y de ahi resuelves tu problema, desde ya te digo que el problema es delay()

Cuando presionas por primera vez, el pulsador se pone en HIGH
Ejecuta lo que tiene dentro

          digitalWrite(led, LOW);
          delay(500);
          digitalWrite(led, HIGH);
          delay(500);
          digitalWrite(led, LOW);
          delay(500);

Dime cuando demora en hacerlo, pues 1.5 segundos o 1500 mseg.
Durante ese tiempo tu ya soltaste el botón, de modo que si quieres que el sistema responda no puedes hacerlo como lo estas encarando ahora sino usando una variable y no puedes usar delay() porque tienes que leer el estado del pulsador todo el tiempo.

Solución usar millis() y una máquina de estados.
Ve a Documentación, luego Indice de temas tutoriales y dentro millis() y máquiina de estados.

Esta variante con un retardo de 100 mseg puede funcionar.

int entrada = 6;
int led = 13;
int entero;
bool estadoPulsador;

void setup() {
Serial.begin(9600);
  
pinMode(entrada,INPUT_PULLUP);
pinMode(led, OUTPUT);

}

void loop() {
  Serial.println(entero);

  estadoPulsador = digitalRead(entrada);

  if ( estadoPulsador == HIGH){
      if (entero == 1){
          digitalWrite(led, LOW);
          delay2(500);
          digitalWrite(led, HIGH);
          delay2(500);
          digitalWrite(led, LOW);
          delay2(500);
          entero = 2;
      }
  }

  if (estadoPulsador == LOW){ 
      if (entero == 2){
          digitalWrite(led, LOW);
          delay2(500);
          digitalWrite(led, HIGH);
          delay2(500);
          digitalWrite(led, LOW);
          delay2(500);
          entero = 1;
      }     
  } 
}

void delay2(int time){
  for (int i; i< time/100; i++) {
      estadoPulsador = digitalRead(entrada);
      delay(100);
  }
}

surbyte:
No comprendo que quieres hacer.
Presionas y hace una secuencia, sueltas y hace otra secuencia y nada mas?

Tengo un pulsador y un led, cuando mantengo presionado el pulsador el led tiene que prender y apagar 1 vez, Y cuando suelto el pulsador el led debe prender y apagar otra vez.
Es eso pero nose como hacerlo.

Hola Surbyte, una pregunta ¿en la declaracion de la variable "entero" de este codigo no tendriamos que darle el valor de 1 por ejemplo para que pueda comenzar a entrar en el IF correspondiente? Saludos.

int entrada = 6;
int led = 13;
int entero;
bool estadoPulsador;

void setup() {
Serial.begin(9600);
  
pinMode(entrada,INPUT_PULLUP);
pinMode(led, OUTPUT);

}

void loop() {
  Serial.println(entero);

  estadoPulsador = digitalRead(entrada);

  if ( estadoPulsador == HIGH){
      if (entero == 1){
          digitalWrite(led, LOW);
          delay2(500);
          digitalWrite(led, HIGH);
          delay2(500);
          digitalWrite(led, LOW);
          delay2(500);
          entero = 2;
      }
  }

  if (estadoPulsador == LOW){ 
      if (entero == 2){
          digitalWrite(led, LOW);
          delay2(500);
          digitalWrite(led, HIGH);
          delay2(500);
          digitalWrite(led, LOW);
          delay2(500);
          entero = 1;
      }     
  } 
}

void delay2(int time){
  for (int i; i< time/100; i++) {
      estadoPulsador = digitalRead(entrada);
      delay(100);
  }
}

Hola a todos.
Armagedon no aclaras si solo quieres hacer que el led encienda y apague o si tu sketch lleva mas funciones, pero entrando a ver tu codigo veo cosas que yo creo que no deberian estar ahi (al menos que haga otra cosa aparte de encender y apagar un led)
Primero: ¿ para que usas la variable entero?
segundo: ¿para que comienzas con

digitalWrite(led, LOW)
 delay2(500);

si se supone que el led ya esta apagado
tercero: si vas a usar delay para encender y apagar el led ¿ porque usar la funcion delay2 ? ¿ porque no pones simplente el tiempo dentro del delay (tiempo) y listo

modifique tu codigo para que haga lo que dices aqui:

Tengo un pulsador y un led, cuando mantengo presionado el pulsador el led tiene que prender y apagar 1 vez, Y cuando suelto el pulsador el led debe prender y apagar otra vez.

Esto es solo para que te des una idea y puedas hacer los cambios que sean necesarios, como por ejemplo tratar de deshacerte de esos delays

int entrada = 6;
int led = 13;
int entero;
bool estado_entrada=true;
bool estado_ant_entrada=true;


void setup() {
Serial.begin(9600);
  
pinMode(entrada,INPUT_PULLUP);
pinMode(led, OUTPUT);

}

void loop() {
Serial.println(entero);

estado_entrada=digitalRead(entrada);


// Aqui cuando  presionas el led enciende y apaga una sola vez
  if (estado_entrada != estado_ant_entrada)     
    if(estado_entrada==false){                   
  delay(500);
  digitalWrite(led, LOW);
  delay(500);
  estado_ant_entrada=estado_entrada;
  entero = 2;               //No se para que usas esto...
  }
    
 //cuando sueltas el pulsador el led prende y apaga una vez
if (estado_entrada != estado_ant_entrada) 
 if(estado_entrada==true){
  digitalWrite(led, HIGH);
  delay(500);
  digitalWrite(led, LOW);
  delay(500);
  entero = 1; 
  estado_ant_entrada=estado_entrada; 
    }
}

Vaya confusión!!!

@RIG:
La función delay2() la cree yo así que no se la atribuyan a @Armagedon13 y no porque me gane un premio pero el tiene bastante con seguirnos.

@hypernovat, si creo que ese detalle no menos importante se me pasó porque supuse que el no había inicializado. Mala suposicion.

int entero = 1; para que arranque

Muy bien, lo pude hacer, hice de 2 formas(podría haber echo una tercera pero no me salio con millis()):

int entrada = 2;
int led = 3;
int estadoPulsador;
bool paso1 = false;
bool paso2 = false;

void setup() {
Serial.begin(9600);
  
pinMode(entrada,INPUT_PULLUP);
pinMode(led, OUTPUT);

digitalWrite(led, LOW);

}

void loop() {

estadoPulsador = digitalRead(entrada);
digitalWrite(led, LOW);


  if (estadoPulsador == HIGH && paso1 == false){
          digitalWrite(led, HIGH);
          delay(100);
          digitalWrite(led, LOW);
          delay(500);
          paso1=true;
          paso2=true;
      
  }

  if (estadoPulsador == LOW && paso2==true){ 
          digitalWrite(led, HIGH);
          delay(100);
          digitalWrite(led, LOW);
          delay(500);
          paso1=false;
          paso2=false;
          
          
  } 


}

Este es el primer codigo que pude hacer funcionar pero utiliza delay, aca dejo como funciona debia funcionar el programa.
prueba del programa en tinkercard
Y el problema con este programa es que al principio manda una señal de estado alto y nose porque(son los delay pero bueno).

El segundo programa es lo mismo pero con una libreria:

#include <Temporizador.h>
Temporizador temp;
Temporizador temp2;
Temporizador temp3;
Temporizador temp4;

int entrada = 2;
int led = 3;
int estadoPulsador;
bool paso1 = false;
bool paso2 = false;
int contador;

void setup() {
  
pinMode(entrada,INPUT_PULLUP);
pinMode(led, OUTPUT);

temp.temporizar(0,0,0,0,10);
temp2.temporizar(0,0,0,0,200);
temp3.temporizar(0,0,0,0,10);
temp4.temporizar(0,0,0,0,100);

}

void loop() {

estadoPulsador = digitalRead(entrada);

  if (estadoPulsador == HIGH && paso1 == false){
    temp.temporizar(0,0,0,0,10);
    contador = 1;}
    if(contador == 1){
      if(temp.completado()){
          digitalWrite(led, HIGH);
          temp2.temporizar(0,0,0,0,200);
          contador = 2;}}
          if(contador == 2){
            if(temp2.completado()){
            digitalWrite(led, LOW);
          paso1=true;
          paso2=true;
          contador = 3;
  }}

  if (estadoPulsador == LOW && paso2==true){ 
    temp3.temporizar(0,0,0,0,10);
    contador = 4;}
    if(contador == 4){
      if(temp3.completado()){
          digitalWrite(led, HIGH);
          temp4.temporizar(0,0,0,0,100);
          contador = 5;}}
          if(contador == 5){
            if(temp4.completado()){
            digitalWrite(led, LOW);
          paso1=false;
          paso2=false;
          contador = 5;    
  }}


}

El problema con este es cuando presiono muy rápido el botón y lo suelto se queda el led prendido.
Acá el link de la librería utilizada:temporizador

Intente hacerlo con millis() pero los tiempos se correspondían y el programa no funcionaba :confused: lastima que lo borre, mas tarde lo voy a intentar de nuevo y lo paso aca.

@RIG
Ya lo probé y cuando presiono el botón, no hace nada pero cuando suelto el botón recién prende y apaga el led (según el tiempo del delay)

Gracias por el tiempo que me tomé en corregir tu programa y ni siquiera lo probaste!!

Si lo pruebas recuerda poner int entero = 1;

surbyte:
Gracias por el tiempo que me tomé en corregir tu programa y ni siquiera lo probaste!!

Lo probé pero no lo comente acá, mala mía. El programa funciona bien pero cuando prendo el arduino o lo reinicio el led se prende y apapa. Osea, manda un estado alto y bajo como de medio segundo. Intente poner que cuando prenda mantenga su estado en bajo, pero igual se sigue prendiendo.

Lo hubieras comentado y se resolvía. El programa en si funciona tal como lo comentaste inicialmente.

El simple agregado de un flag que arranca en false y cuando se de la condición de que pulses y este en HIGH entonces comenzará la secuencia

int entrada = 6;
int led = 13;
int entero;
bool estadoPulsador;
bool flag = false;

void setup() {
Serial.begin(9600);
  
pinMode(entrada,INPUT_PULLUP);
pinMode(led, OUTPUT);

}

void loop() {
  Serial.println(entero);

  estadoPulsador = digitalRead(entrada);

  if ( estadoPulsador == HIGH){
      if (!flag) {
          entero = 1;
          flag = true;
      }
      if (entero == 1){
          digitalWrite(led, LOW);
          delay2(500);
          digitalWrite(led, HIGH);
          delay2(500);
          digitalWrite(led, LOW);
          delay2(500);
          entero = 2;
      }
  }

  if (estadoPulsador == LOW){ 
      if (entero == 2){
          digitalWrite(led, LOW);
          delay2(500);
          digitalWrite(led, HIGH);
          delay2(500);
          digitalWrite(led, LOW);
          delay2(500);
          entero = 1;
      }     
  } 
}

void delay2(int time){
  for (int i; i< time/100; i++) {
      estadoPulsador = digitalRead(entrada);
      delay(100);
  }
}

Ahí entendí, muchas gracias. Funciona perfecto, el comando "!" significa que si no es igual no?

Moderador: No repitas lo que se lee arriba

No lo compliquen tanto...

int entrada = 6;
int led = 13;
int entero = 1;

void setup() {
	Serial.begin(9600);
	pinMode(entrada,INPUT_PULLUP);
	pinMode(led, OUTPUT);
}

void loop() {
	if (digitalRead(entrada) == HIGH){
		if (entero == 1){
			digitalWrite(led, HIGH);
			delay(500);
			digitalWrite(led, LOW);
			entero = 2;
			Serial.println(entero);
		}
	}else{
		if (entero == 2){
			digitalWrite(led, HIGH);
			delay(500);
			digitalWrite(led, LOW);
			entero = 1;
			Serial.println(entero);
		}
	}
}

Hola probe yo tambien el codigo surbyte y funciona genial, pero yo ahora por rizar mas si cabe tengo que actuar sobre ese mismo led con otro pulsador diferente ejerciendo parcialmente la secuencia sin "else" alguna idea?

Moderador
@Guz1362 no revivas hilos viejos de mas de 4 meses sin movimientos. Este era del 2018 o sea tiene años.

Si el tema te importa haz dos cosas:

  1. Lee las normas del foro y
  2. Crea tu propio hilo explicándote en detalle y si quieres coloca la referencia a este.