2led un botón

Necesito ayuda!! he estado intentanto hacer un proyecto con arduino en el que dandole a un boton se encienda primero un led(se apago solo) y al darle otra vez se encienda el 2º led(se apaga solo) y cuando el boton no este pulsado esten los dos apagados.

He conseguido el efecto de que se apague solo pero me falta que primero sea uno y luego otro ya que se encienden los dos a la vez cuando le doy al botón en vez de primera vez que pulso uno y segunda vez otro. Alguien que me pueda ayudar? Este es el código:

const int pinled1 = 11; // declaración de variables const int pinled2 = 5; // declaración de variables const int pinbtn = 3; // declaración de variables int pin; int x = 0; int encender = 0; // Si esta encendido el led int anterior = 0; //Pulsación anterior int estado = 0; //El estado actual del botón void setup() { pinMode(pinled1, OUTPUT); pinMode(pinled2, OUTPUT); pinMode(pinbtn, INPUT); }

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

if(estado == HIGH)//comprobamos si el anterior estaba pulsado y el de ahora {digitalWrite(pinled1, HIGH); } else{ digitalWrite(pinled1, LOW); } { estado = digitalRead(pinbtn); //comprobamos el estado

if(estado == HIGH)//comprobamos si el anterior estaba pulsado y el de ahora {digitalWrite(pinled2, HIGH); } else{ digitalWrite(pinled2, LOW); } } } }

Hola,

Te recomiendas que leas algo acerca del “rebote” en un pulsador porque a medida que vayas poniendo mas codigo iras viendo como su intervencion te produce cosas raras que no esperas.

Basicamente se trata de que al pulsar, (o al dejar de pulsar), el cambio de LOW a HIGH y visceversa no es unico. En medio se producen unos cuantos LOW-HIHG-LOW-HIGH-LOW, etc., aunque tu no los aprecies, pero tu codigo si lo detectara.

Una vez dicho esto para lo que tu quieres puedes agregar:

Una variable POR EJEMPLO del tipo Byte, donde inicialmente valga “1”. Luego en el if que preguntas si btn es HIGH tambien preguntate si la variable es “1” y en caso afirmativo enciende el led 1 y guarda “2” en la variable.

Luego otro if donde te preguntes si btn es HIGH y tambien si la variable es “2” y en caso afirmativo enciende el led 2 y guarda “1” en la variable de manera que este lista para el proximo ciclo.

Cuando btn sea LOW apaga ambos.

En resumen la nueva variable guardar el numero del siguiente led a encender, y se encendera ese y solo ese.

Estas usando dos veces el mismo botón para comandar dos LEDs?

  estado = digitalRead(pinbtn); //comprobamos el estado

  if(estado == HIGH)//comprobamos si el anterior estaba pulsado y el de ahora
  
  //..... y luego repites!!!
  estado = digitalRead(pinbtn); //comprobamos el estado

  if(estado == HIGH)//comprobamos si el anterior estaba pulsado y el de ahora

Entonces la secuencia debe ser otra.

  // antes de setup define
  bool estado; //El estado actual del botón
  bool estadoAnt = false;
  bool valor = false;
  bool estadoLed1 = false, estadoled2 = false;
  unsigned long start;

  estado = digitalRead(pinbtn); //comprobamos el estado
  if (estado && estadoAnt) {
      valor = !valor;
      if (valor) 
          estadoLed1 = 0;
      else
          estadoLed2 = 0;
      start = millis()+1000; // cambia 1000 mseg = 1 seg por el valor que desees
  }  
  estadoAnt = estado;

  if (valor) 
      enciendoLed1();
  else 
      enciendoLed2();

Bueno con esto resuelves la situación general de que con cada pulsación cambias el control sobre el led que funcionará. una de las funciones led sería así

void enciendoLed1() {
    switch(estadoLed1) {
         case 0: digitalWrite(pinled1, HIGH);
                 estadoLed1 = 1;
                 break;
         case 1: if (millis() > start) {
                    digitalWrite(pinled1, LOW);
                    estadoLed1 = 2;
                 }
                 break;
        default: break;
    }
}

La segunda rutina es igual y te la dejo a ti.

De donde te sacas enciendoLed1 y 2 ya que me da error.

if (valor) enciendoLed1(); else enciendoLed2();

No has visto al final que te cree la rutina enciendoLed1 y luego te dije que TU hagas enciendoLed2 con los datos correspondientes?