Go Down

Topic: 2 led 1 botón PROBLEMA (Read 966 times) previous topic - next topic

manolito29

Buenas,

Necesito ayuda con un trabajo en el que con un solo botón he de encender un led, que al soltarlo se apague, y depués al darle otra vez al botón que se encienda el segundo led y se vuelva a apagar al soltar el botón. y asi sucesivamente, alternandose los leds.
He hecho una programación que no entiendo porque no funciona correctamente.
Si alguien me ayudara estaría agradecido.
 Estan son las pautas:
 Uso de un pulsador (entradas digitales) para encender dos leds alternativamente.
Si no se pulsa el pulsador los dos leds están apagados. Si se pulsa el pulsador se enciende un único led. Los leds se irán encendiendo alternativamente. Con cada pulsación se enciende el que no se encendió la vez anterior.

Uso de un pulsador (entradas digitales) para encender dos leds alternativamente.

Si no se pulsa el pulsador los dos leds están apagados. Si se pulsa el pulsador se enciende un único led. Los leds se irán encendiendo alternativamente. Con cada pulsación se enciende el que no se encendió la vez anterior.
Este es el codigo:
const int pinled1 = 11; // declaración de variables
const int pinled2 = 5; // declaración de variables
const int pinbtn = 3; // declaración de variables
bool anterior = false; //Pulsación anterior
int estado;
int anterior1;
void setup()
 

  pinMode(pinled1, OUTPUT);
  pinMode(pinled2, OUTPUT);
  pinMode(pinbtn, INPUT);
}

void loop()
{
estado = digitalRead(pinbtn); //comprobamos el estado del boton


  if(estado == 1 && anterior == false)//comprobamos si el anterior estaba pulsado y el de ahora
  {
    digitalWrite(pinled2, HIGH);
    digitalWrite(pinled1, LOW);
    anterior == true;
  }
   
  if ( estado == 1 && anterior == true){
    digitalWrite(pinled1, HIGH);
      digitalWrite(pinled2, LOW);
      anterior == false;
  }
   

}

Alfaville

Prueba esto:
Code: [Select]

const int pinled1 = 11; // declaración de variables
const int pinled2 = 5; // declaración de variables
const int pinbtn = 3; // declaración de variables

void setup()
{
  pinMode(pinled1, OUTPUT);
  pinMode(pinled2, OUTPUT);
  pinMode(pinbtn, INPUT);
  digitalWrite(pinled1,LOW);
  digitalWrite(pinled2,LOW);
}

void loop()
{
   if(digitalRead(pinbtn))
   {
       digital(Write(pinled2,!digitalRead(pinled2));
       digital(Write(pinled1,!digitalRead(pinled2));
   }
}

manolito29


Alfaville

Y ahora ?
Code: [Select]

const int pinled1 = 11; // declaración de variables
const int pinled2 = 5; // declaración de variables
const int pinbtn = 3; // declaración de variables

void setup()
{
  pinMode(pinled1, OUTPUT);
  pinMode(pinled2, OUTPUT);
  pinMode(pinbtn, INPUT);
  digitalWrite(pinled1,LOW);
  digitalWrite(pinled2,LOW);
}

void loop()
{
   if(digitalRead(pinbtn))
   {
       digital(Write(pinled2,!digitalRead(pinled2));
       digital(Write(pinled1,!digitalRead(pinled2));
       while(digitalRead(pinbtn)) { delay(20); }
   }
}


Irá "perezoso" ante las pulsaciones del boton.
No digas "sigue mal", explica que ocurre.

manolito29

Casi funciona, cada vez que le doy al botón cambia de led(hasta ahí todo bien) pero se tienen que apagar solo cuando deje de pulsar el botón.
Me explico, yo le doy al botón se enciende un led, dejo de pulsar se apaga ese led, le doy al botón se enciende el otro led y dejo de pulsar y se apaga así todo el rato

Alfaville

Pues vale, ahi va:
Code: [Select]


const int pinled1 = 11; // declaración de variables
const int pinled2 = 5; // declaración de variables
const int pinbtn = 3; // declaración de variables
boolean led1=true;

void setup()
{
  pinMode(pinled1, OUTPUT);
  pinMode(pinled2, OUTPUT);
  pinMode(pinbtn, INPUT);
  digitalWrite(pinled1,LOW);
  digitalWrite(pinled2,LOW);
}

void loop()
{
   while(digitalRead(pinbtn))
   {
       if(led1)
       {
           digitalWrite(pinled1,HIGH);
           digitalWrite(pinled2,LOW);
       }
       else
       {
          digitalWrite(pinled1,LOW;
          digitalWrite(pinled2,HIGH);
       }
   }
   led1 = !led1;
   digitalWrite(pinled1,LOW);
   digitalWrite(pinled2,LOW);
}

Atencion este codigo NO está optimizado (ejecuta muchas veces los digitalWrite()), si funciona como quieres te paso la versión optimizada.
Dime como vá ahora.

Alfaville

Code: [Select]


const int pinled1 = 11; // declaración de variables
const int pinled2 = 5; // declaración de variables
const int pinbtn = 3; // declaración de variables
boolean led1=true;
boolean procesado=false;

void setup()
{
  pinMode(pinled1, OUTPUT);
  pinMode(pinled2, OUTPUT);
  pinMode(pinbtn, INPUT);
  digitalWrite(pinled1,LOW);  // Opcional, solo por establecer condicion de arranque
  digitalWrite(pinled2,LOW);  // Opcional, solo por establecer condicion de arranque
}

void loop()
{
   if(digitalRead(pinbtn))
   {
       if(!procesado)
       {
           if(led1)
           {
               digitalWrite(pinled1,HIGH);
               digitalWrite(pinled2,LOW);
           }
           else
           {
               digitalWrite(pinled1,LOW;
               digitalWrite(pinled2,HIGH);
           }
           led1 = !led1;
           procesado=true;
       }
   }
   else if(procesado)
   {
       digitalWrite(pinled1,LOW);
       digitalWrite(pinled2,LOW);
       procesado=false;
   }
}

Si te funciona bien el anterior, usa este que está mejorado:
- No se buclea y por tanto el programa puede hacer mas cosas.
- Solo ejecuta una vez los "digitalWrite" para cada cambio del pulsador (on-off)

manolito29

Gracias, me funciona perfectamente, me has ayudado mucho muchas gracias.

Alfaville

No las merece.
Lo que si sería interesante es que estudiases el código y procurases ver por tí mismo como funciona.
A fin de cuentas el objetivo es aprender.

Go Up