Actualizar codigo con otra funcion

Hola de nuevo voy al grano hace unos meses subí mi tema luces led para chaleco ciclista, (como había mencionado anteriormente aun estoy en etapa de aprendizaje) los compas de aquí me ayudaron y quedo perfecto, pero ahora quiero cambiarle o agregarle otra función, en especifico es cambiar el estado de los push botons, actualmente al apretar el botón 0 , 1 o 2 hace funciones de direccionales y stop, pero se tiene que dejar presionado el botón para que realice dicha acción.

OPCION 1 ahora lo que quiero agregarle es que solo se presione una vez dicho botón y se quede la acción como esta es decir si presiono botón 0 direccional derecha se quede hasta que apriete de nuevo y regrese a opción 1 que es aleatorio, o presiono botón 2 direccional izquierda se quede hasta presionar otra vez el botón.

OPCION 2 presionar y se quede en ese estado por unos 5 segundos y regrese a opción 1 aleatorio.

aquí el código funcionando

int bot [] = {1, 2, 3};
int led[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int numbots = 3;
int numleds = 10;
int tiemporet = 400;
int tiemporetociosa = 200;
int estepin;
int cuenta_alto = 0;
int cuenta_der = 0;
int cuenta_izq = 0;
int cuenta_ocio;

boolean bot_alto = LOW;
boolean bot_derecha = LOW;
boolean bot_izquierda = LOW;


void setup() {

  for (estepin = 0; estepin < numbots; estepin++)
  {
    pinMode(bot[estepin], INPUT);
  }

  for (estepin = 0; estepin < numleds; estepin++)
  {
    pinMode(led[estepin], OUTPUT);
  }
}


void loop() {

  for (estepin = 0; estepin < numleds; estepin++)
  {
    digitalWrite (led[estepin], LOW);
  }

  bot_derecha = digitalRead (bot[0]);
  bot_alto = digitalRead (bot[1]);
  bot_izquierda = digitalRead (bot[2]);

  if (bot_derecha == HIGH)
  {
   
    derecha ();
  }
  else if (bot_alto == HIGH)
  {
    alto ();
  }
  else if (bot_izquierda == HIGH)
  {
    izquierda ();
  }
  else
  {
    ociosa ();
  }
}

void alto() {

  if (cuenta_alto == 1)
  {
    for (estepin = 0; estepin < numleds; estepin++)
    {
      digitalWrite(led[estepin], HIGH);
    }
  }
  else
  {
    for (estepin = 0; estepin < numleds; estepin++)
    {
      digitalWrite(led[estepin], LOW);
    }
  }
  delay(tiemporet);
  cuenta_alto++;
  if (cuenta_alto > 1)
  {
    cuenta_alto = 0;
  }
}

void izquierda() {

  switch (cuenta_izq)
  {
    case 0:

      digitalWrite(led[2], HIGH);
      digitalWrite(led[9], HIGH);
      digitalWrite(led[4], HIGH);
      break;

    case 1:

      digitalWrite(led[1], HIGH);
      digitalWrite(led[8], HIGH);
      digitalWrite(led[5], HIGH);
      break;

    case 2:

      digitalWrite(led[0], HIGH);
      digitalWrite(led[7], HIGH);
      digitalWrite(led[6], HIGH);
      break;
    default:
      ;// no hay instrucciones a realizar
      break;
  }
  
delay(tiemporet);
cuenta_izq++;
if (cuenta_izq > 3)
{
  cuenta_izq = 0;
}
}

void derecha ()
{
  switch (cuenta_der)
  {
    case 0:
      digitalWrite (led[0], HIGH);
      digitalWrite (led[8], HIGH);
      digitalWrite (led[6], HIGH);
      break;
    case 1:
      digitalWrite (led[1], HIGH);
      digitalWrite (led[9], HIGH);
      digitalWrite (led[5], HIGH);
      break;
    case 2:
      digitalWrite (led[2], HIGH);
      digitalWrite (led[3], HIGH);
      digitalWrite (led[4], HIGH);
      break;
    default:
       break;
  }
  delay (tiemporet);
  cuenta_der++;
  if (cuenta_der > 3)
  {
    cuenta_der = 0;
  }
}

void ociosa ()
{
  digitalWrite (led[cuenta_ocio], HIGH);
  digitalWrite (led[cuenta_ocio + 4], HIGH);
  delay (tiemporetociosa);
  digitalWrite(led[cuenta_ocio], LOW);
  digitalWrite(led[cuenta_ocio], LOW);
  cuenta_ocio++;
  if (cuenta_ocio > 3)
  {
    cuenta_ocio = 0;
  }
}

Aquí el código con del botón

const int LED =13;
const int BOTON = 7;
int val = 0; //val se emplea para almacenar el estado del boton
int state = 0; // 0 LED apagado, mientras que 1 encendido
int old_val = 0; // almacena el antiguo valor de val
void setup(){  // definir si la variable es de entrada // o salida.
 pinMode(LED,OUTPUT); // establecer que el pin digital es una señal de salida
 pinMode(BOTON,INPUT); // y BOTON como señal de entrada
}
void loop() {       // loop = realice un lazo continuamente
val= digitalRead(BOTON); // lee el estado del Boton
if ((val == HIGH) && (old_val == LOW)){
state=1-state;
delay(10);
}
old_val = val; // valor del antiguo estado
if (state==1){
 digitalWrite(LED, HIGH); // enciende el LED
}
else{
 digitalWrite(LED,LOW); // apagar el LED
}
}

MI problema es que al parecer al integrarlo lo hice mal , gracias de antemano por la ayuda como siempre salud2.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.