Secuencias luces policia.

buenos días, estoy haciendo un proyecto el cual en una moto quad de batería a 12 v le voy a poner las luces de policía, lo único es el código que lo tengo medio hecho, le he creado varias secuencias para que cada botón del teclado haga una secuencia, pero se inicia bien la cuestión es parar la secuencia una vez comenzada, le he puesto una interrupción pero no funciona como quisiera, aver si alguien puede echarme un cable con el código. Lo que quiero es poder parar la secuencia y si aprieto otra vez que vuelva a iniciar .

int saltar=0; // Variable que indica el numero de la secuencia a ejecutarse
int contador = 0;
int n = contador ;
void setup() {

 //indicamos el pin de entrada
pinMode(3, INPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
attachInterrupt( 0, (secuencia0,secuencia1,secuencia2, secuencia3), LOW);
}

void loop() {
if (digitalRead(3)==HIGH){ //Al presionar el pulsador
saltar++; // Cambia de secuencia
if (saltar>3){ //Solo hay 4 secuencias 0,1,2 y 3 al ser 3 . .
saltar=0; // Vuelve a secuencia 0
}
while (digitalRead(3)==HIGH){} // Mientras se pulsa no haga nada mas
}

if(saltar==0){ //Si es 1 inicie funcion de secuencia1
secuencia0();
}
if(saltar==1){ //Si es 2 inicie funcion de secuencia2
secuencia1();
}
if(saltar==2){ //Si es 3 inicie funcion de secuencia3
secuencia2();
}
if(saltar==3){ //Si es 4 inicie funcion de secuencia4
secuencia3();
}

}
   void secuencia0(){
     
   
      digitalWrite(12, HIGH);// turn the LED on (HIGH is the voltage level)
  digitalWrite(10, HIGH);
  delay(50);                       // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(10, LOW); 
  delay(50);   
  
  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(10, HIGH);
  delay(50);                       // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(10, LOW);
  delay(50);     

  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(10, HIGH);
  delay(50);                       // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(10, LOW);
  delay(50);     


  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(10, HIGH);
  delay(50);                       // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(10, LOW);
  delay(50);

  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(10, HIGH);
  delay(50);                       // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(10, LOW);
  delay(50);
  
  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(10, HIGH);
  delay(50);                       // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(10, LOW);
  delay(300);

// LED AZUL

  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(10, HIGH);
  delay(50);                       // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(10, LOW);
  delay(50);   
  
  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(10, HIGH);
  delay(50);                       // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(10, LOW);
  delay(50);     

  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(10, HIGH);
  delay(50);                       // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(10, LOW);
  delay(50);     


  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(10, HIGH);
  delay(50);                       // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(10, LOW);
  delay(50);

   digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(10, HIGH);
  delay(50);                       // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(10, LOW);
  delay(50);
  
  digitalWrite(11, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(10, HIGH);
  delay(50);                       // wait for a second
  digitalWrite(11, LOW);    // turn the LED off by making the voltage LOW
  digitalWrite(10, LOW);
  delay (300);
    }

    void secuencia1(){
    
      digitalWrite (12, HIGH);
digitalWrite (11, HIGH);
digitalWrite (10, HIGH);
delay (50);
digitalWrite (12, LOW);
digitalWrite (11, LOW);
digitalWrite (10, LOW);
delay (50);

digitalWrite (12, HIGH);
digitalWrite (11, HIGH);
digitalWrite (10, HIGH);
delay (50);
digitalWrite (12, LOW);
digitalWrite (11, LOW);
digitalWrite (10, LOW);
delay (50);

digitalWrite (12, HIGH);
digitalWrite (11, HIGH);
digitalWrite (10, HIGH);
delay (50);
digitalWrite (12, LOW);
digitalWrite (11, LOW);
digitalWrite (10, LOW);
delay (50);

digitalWrite (12, HIGH);
digitalWrite (11, HIGH);
digitalWrite (10, HIGH);
delay (50);
digitalWrite (12, LOW);
digitalWrite (11, LOW);
digitalWrite (10, LOW);
delay (500);
    }
    
 void secuencia2(){
      
      digitalWrite(11,HIGH); 
      digitalWrite(12,LOW);  

      delay(100); 

     digitalWrite(12,HIGH); 
     digitalWrite(11,LOW); 

     delay(100); 

{
  digitalWrite (10, HIGH);

  delay (35);

  digitalWrite (10, LOW);
}
}
void secuencia3(){

  digitalWrite (12, HIGH);
  digitalWrite (11, HIGH);
  digitalWrite (10, HIGH);
}

Moderador
Los códigos se postean con etiqueta de código </> o cuando hace click se ve asi [code][/code] y no etiqueta de citas como has usado que es esta

Ahora debes editar tu código y modificar donde veas quote por code y lucirá como corresponde.

le he creado varias secuencias para que cada botón del teclado haga una secuencia, pero se inicia bien la cuestión es parar la secuencia una vez comenzada, le he puesto una interrupción pero no funciona como quisiera, aver si alguien puede echarme un cable con el código.

El problema de tu código es el bendito DELAY del que has abusado hasta el cansancio y tanto has abusado que como no sabes para que sirve mas que provoca una demora que necesitas simplemente has obviado el hecho que cuando lo invocas hasta tanto no termine el procesador no hace nada, no mira si presionas algo, no presta atención a nada de nada.
Usar eso y una interrupción para mi gusto es un derroche de recursos de querer tapar con un parche (interrupción) una mala programación.
OLVIDA DELAY y mira que lo digo gritando (mayúsculas en un foro es como gritar).

Ve a Documentación => Indice de temas tutoriales => millis() y también lee máquina de estados.

Hazlo y conversamos, sea conmigo o con otro forero que tome la posta de esta consulta.

Bueno, después de tu merecida llamada de atención por poner indebidamente tu código en el foro, te paso una pequeña modificación que hice a tu código, no está comentado porque voy un poco tarde al trabajo igual no lo probé, pruebalo tu y dime si funciona, asigne nombres a los pines I(tu deberías hacer lo mismo como buena practica de programación) ya que tu solo pusiste el numero de los pines y eso complica mucho las cosas
bueno aquí dejo el código

//LucesPolicia.ino
      byte saltar=0; // Variable que indica el numero de la secuencia a ejecutarse
const byte pulsador=3,
           ledRojo=12,   
           ledAzul=11, 
           ledX=10;

bool estadoPulsador, 
     anteriorPulsador;           

unsigned long db;   //para evitar rebotes
unsigned long tiempoActual;
unsigned long tActual2;

void setup() {

 //indicamos el pin de entrada
pinMode(pulsador, INPUT);
pinMode(ledRojo, OUTPUT);
pinMode(ledAzul, OUTPUT);
pinMode(ledX, OUTPUT);
//attachInterrupt( 0, (secuencia0,secuencia1,secuencia2, secuencia3), LOW);   //Esto no se para que lo pusiste...
}

 void loop() {
	estadoPulsador=digitalRead(pulsador);

    if(estadoPulsador && anteriorPulsador && millis()-db >= 100UL){
         saltar++;
         db=millis(); 
        }
     anteriorPulsador=estadoPulsador;
        
    if (saltar>3) saltar=0; //Solo hay 4 secuencias 0,1,2 y 3 al ser 3 . .
 
   switch (saltar) {
   	 case 0:
    	  SECUENCIA(50, 0);
     	 break;

    	case 1:
      	SECUENCIA(50, 1);
      	break;
     	case 2:
      	SECUENCIA(100,2);
      	break;

     	case 3:
      	digitalWrite (ledRojo, HIGH);
      	digitalWrite (ledAzul, HIGH);
      	digitalWrite (ledX, HIGH);
     	break;
 
  		}

 //if (digitalRead(3)==HIGH){ //Al presionar el pulsador
//saltar++; // Cambia de secuencia
 // Vuelve a secuencia 
 // while (digitalRead(3)==HIGH){} // Mientras se pulsa no haga nada mas //Esto es una forma horrible de evitar los rebotes

}


void SECUENCIA(unsigned long intervalo, byte secuencia){
    

  if(millis() - tiempoActual >= intervalo){
      
      switch (secuencia) {
        case 0:
           digitalWrite(ledRojo, !digitalRead(ledRojo));
           digitalWrite(ledX, !digitalRead(ledX));
        
        break;
        
        case 1:
           digitalWrite(ledRojo, !digitalRead(ledRojo));
           digitalWrite(ledX, !digitalRead(ledX));
           digitalWrite(ledAzul, !digitalRead(ledAzul)); 

        
          break;

        case 2:
           digitalWrite(ledRojo, !digitalRead(ledRojo));
           digitalWrite(ledAzul, !digitalRead(ledRojo));
             
             if(!digitalRead(ledAzul))
                 tActual2=millis();
       
           if(millis()-tActual2<=35UL)
             digitalWrite(ledX,HIGH);
           else 
             digitalWrite(ledX, LOW); 
           break;   
          
       }
   tiempoActual=millis();  
   
   }
  
}

muchas gracias por tu codigo rig, si funciona pero mi intención es que pueda dejar apagada la secuencia o caso, este cambia la secuencia pero nunca se apaga. Aqui he grabado un video enseñando las secuencias y el teclado que utilizo, lo que quiero es que al presionar se encienda la secuencia que este asignada y si presiono el mismo que se apague o si presiono otro que pase a la secuencia que sea https://www.youtube.com/watch?v=8ZrUN3sULEg

Hola.compañero,, te hablo desde la ignorancia. Pero a veces para un problema complejo hace falta una solución simple. ¿Has probado a ponerle al.quad un botón que de corriente o la corte a la placa?

Yo hace unos años preparé un quad para mi hijo asi.

Miralo y me cuentas.

Un saludo.

Bien @toniet3. Ese fallo lo vi desde un principio, pero me base en tu código y supuse que apagabas la alimentación, pero eso es simple de corregir

Solo es agregar un caso más o dejarlo en default todo apagado

]//LucesPolicia.ino
      byte saltar=0; // Variable que indica el numero de la secuencia a ejecutarse
const byte pulsador=3,
           ledRojo=12,   
           ledAzul=11, 
           ledX=10;

bool estadoPulsador, 
     anteriorPulsador,
     estadoledA,
     anteriorledA;           

unsigned long db;   //para evitar rebotes
unsigned long tiempoActual;
unsigned long tActual2;

void setup() {

 //indicamos el pin de entrada
pinMode(pulsador, INPUT);
pinMode(ledRojo, OUTPUT);
pinMode(ledAzul, OUTPUT);
pinMode(ledX, OUTPUT);
//attachInterrupt( 0, (secuencia0,secuencia1,secuencia2, secuencia3), LOW);   //Esto no se para que lo pusiste...
}

 void loop() {
    estadoPulsador=digitalRead(pulsador);

    if(estadoPulsador && !anteriorPulsador && millis()-db >= 100UL){
         saltar++;
         digitalWrite (ledRojo, LOW);
          digitalWrite (ledAzul, LOW);
          digitalWrite (ledX, LOW);
          tiempoActual=millis();
         db=millis(); 
        }
     anteriorPulsador=estadoPulsador;
        
    if (saltar>4) saltar=0; //Solo hay 4 secuencias 0,1,2 y 3 al ser 3 . .

   switch (saltar) {
       case 0:
         digitalWrite (ledRojo, LOW);
          digitalWrite (ledAzul, LOW);
          digitalWrite (ledX, LOW);
          break;

     
      case 1:
          SECUENCIA(50, 0);
         break;

      case 2:
         SECUENCIA(50, 1);
         break;

      case 3:
         SECUENCIA(100,2);
          if(millis()-tActual2>=35UL)
             digitalWrite(ledX,LOW);
      break;
        
        case 4:
         digitalWrite (ledRojo, HIGH);
          digitalWrite (ledAzul, HIGH);
          digitalWrite (ledX, HIGH);
         break;
  
       }

 // while (digitalRead(3)==HIGH){} //  //Esto es una forma horrible de evitar los rebotes

}

void SECUENCIA(unsigned long intervalo, byte secuencia){
    

  if(millis() - tiempoActual >= intervalo){
      
      switch (secuencia) {
        case 0:
           digitalWrite(ledRojo, !digitalRead(ledRojo));
           digitalWrite(ledX, !digitalRead(ledX));
        
        break;
        
        case 1:
           digitalWrite(ledRojo, !digitalRead(ledRojo));
           digitalWrite(ledX, !digitalRead(ledX));
           digitalWrite(ledAzul, !digitalRead(ledAzul)); 

        
          break;

        case 2:
             
           digitalWrite(ledRojo, !digitalRead(ledRojo));
           digitalWrite(ledAzul, !digitalRead(ledRojo));
             estadoledA=digitalRead(ledAzul);
             if(anteriorledA && !estadoledA){
                 digitalWrite(ledX, HIGH);
                 tActual2=millis();
             }
                 anteriorledA=estadoledA;
                
           break; 

          
       }
   tiempoActual=millis();  
   
   }
  
}

Pruébalo, espero no tener algún error porque lo estoy haciendo desde el movil

Edito: Tenia algunos errores en el código, ya quedo corregido, ya tiene que funcionar, solo ten en cuenta que puse los colores de led a mi modo, si no coinciden los colores solo cámbialo en las variables

muchas gracias RIG esta semana estoy de vacaciones ya iré subiendo fotos vídeos de la moto cuando este terminada.