Activación de led con temporización (SOLUCIONADO)

Buenas a todos, os expreso mis dudas, ya que soy nuevo en el tema del arduino y mi nivel de programación es muy bajo.

Actualmente estoy funcionando con un Arduino Leonardo.

Lo que quiero que haga el programa es lo siguiente, tengo actualmente 2 pulsadores y 3 leds, y lo que quiero:

-Activando el pulsador1 activar el led3 que pasen 10 segundos, se desactive el led3 y se active el led1 y se quede activo mientras el pulsador1 esta activo, y al soltar el pulsador1 se desactive tanto el led3 como el led1. -Activando el pulsador2 activar el led3 que pasen 10 segundos, se desactive el led3 y se active el led2 y se quede activo mientras el pulsador2 esta activo, y al soltar el pulsador1 se desactive tanto el led3 como el led2.

Esto es técnicamente lo que busco hacer. A continuación os paso lo que yo he hecho, el problema que tengo es que el led 1 y 2 y funcionan como quiero pero el 3 mientras tengo el pulsador activo esta en estado intermitente.

const int led1 = 13;
const int led2 = 12;
const int led3=11;
const int pulsador1 = 2;
const int pulsador2 = 3;
int estadoPulsador1 = 0;
int estadoPulsador2 = 0;

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(pulsador1, INPUT);
  pinMode(pulsador2, INPUT);

}

void loop() {
  estadoPulsador1=digitalRead(pulsador1);
  if (estadoPulsador1==HIGH){
   digitalWrite(led3, HIGH);
   delay(10000);
   digitalWrite(led3, LOW);
   delay(100);
   digitalWrite(led1, HIGH);
  }
  else{
   digitalWrite(led1, LOW);
  }
  estadoPulsador2=digitalRead(pulsador2);
  if(estadoPulsador2==HIGH){
   digitalWrite(led3, HIGH);
   delay(10000);
   digitalWrite(led3, LOW);
   delay(500);
   digitalWrite(led2, HIGH);
  }
  else{
   digitalWrite(led2, LOW);  
  }
  
  
}

El problema está en que, mientras mantienes pulsado el botón, la condición del if se repite constantemente. Necesitas que la condición de pulsado, se ejecute solamente una vez, mientras mantienes pulsado el botón. Esto se consigue con una variable de estado.

No sé si usas resistencias pulldown en los botones, pero si no las usas, puedes usar las pullup internas de arduino, para evitar ruido y falsas pulsaciones.

Prueba este código:

const int led1 = 13;
const int led2 = 12;
const int led3 = 11;
const int pulsador1 = 2;
const int pulsador2 = 3;
int estadoPulsador1 = 0;
int estadoPulsador2 = 0;

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(pulsador1, INPUT_PULLUP);
  pinMode(pulsador2, INPUT_PULLUP);
}

void loop() {
  if (digitalRead(pulsador1) == !HIGH && estadoPulsador1 == 0) {
    estadoPulsador1 = 1;
    digitalWrite(led3, HIGH);
    delay(10000);
    digitalWrite(led3, LOW);
    delay(100);
    digitalWrite(led1, HIGH);
  }

  if (digitalRead(pulsador1) == !LOW) {
    estadoPulsador1 = 0;
    digitalWrite(led1, LOW);
    delay(50);
  }

  if (digitalRead(pulsador2) == !HIGH && estadoPulsador2 == 0) {
    estadoPulsador2 = 1;
    digitalWrite(led3, HIGH);
    delay(10000);
    digitalWrite(led3, LOW);
    delay(500);
    digitalWrite(led2, HIGH);
  }

  if (digitalRead(pulsador2) == !LOW) {
    estadoPulsador2 = 0;
    digitalWrite(led2, LOW);
    delay(50);
  }
}

Con este conexionado:

|500x350

Al usar el pullup, el estado del pulsador se invierte, por eso las lecturas de HIGH, ahora son !HIGH, y las LOW, son !LOW.

Vamos a ver el caso del primer if. Fíjate que hora, no uso la variable estadoPulsador1 para guardar el estado del pulsador, si no que leo directamente el pulsador en el if, y la variable, la uso para que el if de la pulsación, solo se cumpla una vez, mientras mantengo pulsado el botón. Como las varibles de estado las ponemos a 0 al definirlas, cuando pulso el botón1, se cumple el primer if. Lo primero que hacemos, es cambiar la variable de estado a 1, para que el if, no se cumpla más, mientras tengamos pulsado el botón, y se cumple todo lo demás del if, o sea, el encendido y apagado de leds. Mientras mantenemos pulsado, la situación continúa igual, pero sin repetirse la secuencia. Cuando soltamos, se cumple el segundo if, que lo que hace es poner la variable de estado a 0, para que cuando volvamos a pulsar, se vuelva a cumplir la secuencia, y hacemos el apagado del led encendido durante la pulsación.

El delay (50) en los if del botón sin pulsar, son para hacer un "debounce", y evitar falsas pulsaciones al soltar el botón.

Va perfecto, lo acabo de probar y hace lo que quiero, muchas gracias.

Es que estoy empezando en lo relacionado con el arduino y no tiene nada que ver a lo que estoy acostumbrado a programar (autómatas), y mirando así manuales y ejemplo es como estoy practicando, pero cuando sale alguna cosa fuera de lo normal, estoy perdido, al menos por ahora.

Lo importante es que entiendas la explicación y el por qué de los cambios.

Justamente ese es el truco que pretendia el profesor que entendieras.

Bueno surbyte, al menos, ha planteado la duda correctamente, ha dado el código que tenía hecho (expuesto con el tag code). Yo le he planteado las correcciones sobre su código. Si quiere aprender, creo que leyendo las explicaciones y observando el nuevo código, puede aprender.

Creo que las ganas de aprender, van con la actitud de cada uno.

SI pudiera dar un premio, diría que es el mejor estudiante que ha planteado las cosas hasta el momento. Asi que ojalá se repita y haya muchos Zharion más

No No No, Zharion solo hay uno :P, y referente a lo anterior sigo haciendo pruebas y ampliando la aplicación para ir probando mas cosas y probando nuevas formas de hacer las cosas. La verdad es que me gustaría aprender mas en lo relacionado de programación en lenguaje arduino, y por ellos sigo haciendo pruebas en aplicaciones :smiley: y otra vez, muchas gracias por responder a mi duda. Un saludo a todos

Recuerda modificar el titulo del primer mensaje del post y añadirle [Solucionado]