proyecto_de_leds

no me resulta bien la secuencia de funcion de leds cuando se presione por PRIMERA vez el boton, el LED-1 debe de encenderce

  • cuando se presione por SEGUNDA vez el boton, el LED-1 debe de apagarce
  • cuando se presione por TERCERA vez el boton el LED-1 debe de parpadear (cada segundo)
  • cuando se presione por CUARTA vez el boton el LED-1 debe de apagarce.
    Acciones con el BOTON 2:
  • en cualquier momento cuando se aprete el Boton 2 (en cualquier momento) debe de encender el LED-2. Si se vuelve apretar el boton 2, el LED-2 se apaga. SI SE vuelve a apretar el BOTON-2 el led-2 se enciende
    en un arduino uno.
const int boton_1 =8;
const int boton_2 =2;
int led_1 =13;
int led_2 =4;

int control_accion = 0;

void setup(){
pinMode(boton_1, INPUT);
digitalWrite(boton_1, HIGH);
pinMode(boton_2, INPUT);
digitalWrite(boton_2, HIGH);
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);

attachInterrupt(digitalPinToInterrupt(boton_2), func_boton_2, FALLING);

digitalWrite(led_1, LOW);
digitalWrite(led_2, LOW);
}

void loop() {
 if(control_accion == 3){
   parpadeo();
 }
 if (!digitalRead(boton_1)) {
   delay(10);
   if (!digitalRead(boton_1)) {
     control_accion++;
     switch (control_accion) {
       case 1:
         digitalWrite(led_1, HIGH);
         break;

       case 2:
         digitalWrite(led_1, LOW);
         break;

       case 3:
         parpadeo();

       case 4:
         digitalWrite(led_1, LOW);
         control_accion = 0;
         break;

       default:
         control_accion = 0;
         break;
     }
   }
 }
}

void func_boton_2(){
 if(digitalRead(led_2)){
   digitalWrite(led_2, LOW);
 }
 else{
   digitalWrite(led_2, HIGH);
 }
}

void parpadeo() {
 digitalWrite(led_1, HIGH);
 delay(1000);
 digitalWrite(led_1, LOW);
 delay(1000);
}

alguien me pofria ayudar seria muy considerado.
gracias

Lo primero decirte que es lo mismo hacer:

pinMode(boton_1, INPUT);
digitalWrite(boton_1, HIGH);

pinMode(boton_1, INPUT_PULLUP);

Luego decirte que cada vez que presiones el boton_1 se generan muchos pulsos a los que llamamos rebotes y es por eso que hace la secuencia mas rápido de lo que puedes ver.

Una solución es detectar el flanco de subida del boton_1

const byte boton_1 = 8;
const byte boton_2 = 2;
const byte led_1 = 13;
const byte led_2 = 4;

byte control_accion = 0;

bool actual,anterior;

void setup(){
   pinMode(boton_1, INPUT_PULLUP);
   //digitalWrite(boton_1, HIGH);
   pinMode(boton_2, INPUT_PULLUP);
   //digitalWrite(boton_2, HIGH);
   pinMode(led_1, OUTPUT);
   pinMode(led_2, OUTPUT);

   attachInterrupt(digitalPinToInterrupt(boton_2), func_boton_2, FALLING);

   digitalWrite(led_1, LOW);
   digitalWrite(led_2, LOW);
}

void loop() {
   if(control_accion == 3){
      parpadeo();
   }
   actual = digitalRead(boton_1);
   if (!actual & anterior) {
      //delay(10);
      //if (!digitalRead(boton_1)) {
         control_accion++;
         switch (control_accion) {
         case 1:
            digitalWrite(led_1, HIGH);
            break;

         case 2:
            digitalWrite(led_1, LOW);
            break;

         case 3:
            parpadeo();
            break;

         case 4:
            digitalWrite(led_1, LOW);
            control_accion = 0;
            break;

         default:
            control_accion = 0;
            break;
         }
      //}
   }
   anterior = actual;
}

void func_boton_2(){
   if(digitalRead(led_2)){
      digitalWrite(led_2, LOW);
   }else{
      digitalWrite(led_2, HIGH);
   }
}

void parpadeo() {
   digitalWrite(led_1, HIGH);
   delay(1000);
   digitalWrite(led_1, LOW);
   delay(1000);
}