Loop dentro de otro loop

Buenas, he hecho esta misma pregunta en el foro principal pero no me han ayudado mucho :frowning:
Soy un poco novatillo, estoy estudiando electrónica pero aún no se nada de programación, lo poco que sé es lo que he visto en los ejemplos :slight_smile:

Tengo una "bomba" para airsoft, y quiero que cuando llegue el tiempo a 0, me saque un tono a unos altavoces, a 2 frecuencias "simultáneas". La idea es que suene 5 segundos por ejemplo, y se espere otros 5 segundos sin sonar, para volver a repetir. Y que haga eso mismo unas cuantas veces y se detenga, o bien que se detenga cuando pulso cualquier tecla del teclado.

El código es un código que me ha dejado un amigo, y estoy modificando la parte de cuando explota, que inicialmente lo único que hacía era introducir corriente en un mosfet durante x tiempo para activar algo, y lo estoy modificando para hacer lo de los altavoces.

Ésto es lo que he hecho, pero suena y no hay quien lo pare xD

void activateMosfet(){
  int x = 1;
  for(int i=0;i<=MOSFET_TIME;i=i+x){ //MOSFET_TIME está declarado en otra parte del código, es 5000
      tone(mosfet, 800);
      delay(20);
      tone(mosfet, 500);
      delay(20);
      
      if(i>MOSFET_TIME){
        noTone(10);
        delay(MOSFET_TIME);
        i=0;
      }
}
if(keypad.waitForKey() == key){
        cls();
        menuPrincipal();
      }
}

A ver si me podéis echar una mano de cómo lo tengo que modificar para que haga lo que quiero :slight_smile:

Otra pregunta, a qué velocidad avanzan los incrementos del FOR?

Contrapregunta:
¿Cuánto vale x?
Esa misma respuesta contesta a tu pregunta sobre a qué velocidad aumentan los ciclos de for.
Si por casualidad x vale cero, estás en un bucle infinito.
Saludos.

noter:
Contrapregunta:
¿Cuánto vale x?
Esa misma respuesta contesta a tu pregunta sobre a qué velocidad aumentan los ciclos de for.
Si por casualidad x vale cero, estás en un bucle infinito.
Saludos.

x vale 1, pero eso quiere decir que avanzará 1 por segundo? o 1 cada milisegundo? Esa es mi pregunta .

Sobre la pregunta principal no me puedes ayudar?

Saludos

Prueba a ver esto

void activateMosfet(){
  
  long lComienzo;
  
  lComienzo = millis();
  while ( millis() - lComienzo < MOSFET_TIME ) {
      tone( mosfet, 800 );
      delay( 20 );
      tone( mosfet, 500 );
      delay( 20 );
  }
  
  noTone( mosfet );
  
  if ( keypad.waitForKey() == key ) {
    cls();
    menuPrincipal();
  }

}

No, los ciclos de un bucle no son un milisegundo, son... pues depende de la cantidad de operaciones que realice el código que tenga dentro, una cantidad de milisegundos se mide como te he puesto en el código, hay que esperar a que el tiempo pase y la diferencia entre el tiempo actual (millis() ) y el tiempo registrado (la variable lComienzo) sea mayor que lo que has definido como espera .

Por otro lado, si haces un bucle como el que ponías con delay() entremedias, que te está haciendo una espera, que repetías 5000 veces, pues multiplicas 20 + 20 = 40 milisegundos por cada ciclo * 5000 = 200000 milisegundos, es decir 200 segundos, casi 3 minutos (que seguro no te esperabas para ver que aquello acababa) más los 5 segundos que colocabas después en el otro delay.

En resumen, los delay deben ser únicamente para retardos mínimos (los 40 milisegundos) y controlar el paso de tiempo, no depender de cuantos ciclos haces en un bucle (eso puede variar por muchos motivos).

Espero haberte resuelto las dudas, y no te lo tomes a mal, pero leete un buen manual de programación para ir aprendiendo este tipo de técnicas, porque sino vas a sufrir muchísimo con Arduino, y es una pena, porque tiene muchísimas posibilidades y te puede dar muy buenos ratos si no te rompes la cabeza con este tipo de cuestiones.