Problema con bucle en el loop

Estoy haciendo un sketch, al menos intentándolo, para encender un quemador de gas. El problema reside en que quiero que haga tres intentos de encendido y, si no lo consigue, corte el gas y de una alarma. He puesto en el loop un while, pero se ejecuta " a la velocidad de la luz" y no hace el encendido como yo quiero. Que conste que me he repasado los posts al respecto, y he visto que esta función es la adecuada.
Seguro que se me pasa algo. Adjunto el código a ver si alguien me puede echar una mano. Gracias.
Espero que se entiendan bien los comentarios.

#define chispa 12
#define led2 13
#define sensor 2
#define buzzer 3
#define ev 4
#define puls 5
#define presostato 11
bool val = 0;
int i = 0;

unsigned long previousMillis = 0;
int chispaState = LOW;
const long interval = 3000; 

  
void setup(){

	pinMode(chispa, OUTPUT);
	pinMode(led2, OUTPUT);
	pinMode(ev, OUTPUT);
        pinMode (buzzer, OUTPUT) ;
        pinMode(presostato, INPUT);
        pinMode(sensor, INPUT);
        pinMode (puls, INPUT) ;
        
          Serial.begin(9600);
          
               
}

void zumbador()
{
unsigned char i, j ;// define variables
while (1)
{
for (i = 0; i <80; i++)
{
digitalWrite (buzzer, LOW) ; // Turn buzzer ON
delay (1) ;// Delay 1ms
digitalWrite (buzzer, HIGH) ;// turn buzzer OFF
delay (1) ;// delay ms
}
for (i = 0; i <100; i++) // new frequency
{
digitalWrite (buzzer, LOW) ;// turn buzzer ON
delay (2) ;// delay 2ms
digitalWrite (buzzer, HIGH) ;// turn buzzer OFF
delay (2) ;// delay 2ms
}
}
}


void intermitente()
{
      unsigned long currentMillis = millis();

	if(currentMillis - previousMillis >= interval) { // Empieza Blink
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // si el LED esta off lo pone on y vice-versa:
    if (chispaState == LOW)
      chispaState = HIGH;
    else
      chispaState = LOW;

    // set el LED con ledState como variable:
    digitalWrite(chispa, chispaState);

	} // Fin del Blink
} 



void loop(){
  
  digitalWrite(led2,HIGH); // led de marcha
if(digitalRead(presostato) == HIGH) {  // si presostato esta activado...
     digitalWrite(ev, HIGH);    // abre EV - deja pasar gas  
  while(i<=3) {   
    intermitente();  // enciende la chispa
    
    val = digitalRead(sensor);  // Lee el sensor
    if (val == LOW) { // si detecta llama
      chispaState = LOW;
      digitalWrite(chispa, chispaState); // apaga la chispa
      break;
    
    }else{
   delay(100);
   i++;
    }
   // si transcurridos tres encendidos no detecta llama 
  digitalWrite(chispa, LOW); // apaga la chispa   
  digitalWrite(ev,LOW);   // cierra EV 
 // if(digitalRead(puls) == LOW){
  zumbador(); // suena alarma
//  }
 delay(1000);
Serial.print(i);
  }

   }else{ 
    digitalWrite(chispa, LOW); // apaga la chispa   
    digitalWrite(ev,LOW);   // cierra EV   
     
     
       }  // fin de presostato 
  

}

A nadie se le ocurre la solución?

Ahun no controlo mucho en arduino espero que sea de ayuda
También tengo el mismo proyecto entre manos…
Podrias añadir referencias de los componentes y cableado?
intenta poner el void intermitente dentro de wile

while(i<=3) {   
   unsigned long currentMillis = millis();

	if(currentMillis - previousMillis >= interval) { // Empieza Blink
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // si el LED esta off lo pone on y vice-versa:
    if (chispaState == LOW)
      chispaState = HIGH;
    else
      chispaState = LOW;

    // set el LED con ledState como variable:
    digitalWrite(chispa, chispaState);  // enciende la chispa
    
    val = digitalRead(sensor);  // Lee el sensor
    if (val == LOW) { // si detecta llama
      chispaState = LOW;
      digitalWrite(chispa, chispaState); // apaga la chispa
      break;
    
    }

Gracias Rantamplan por el apunte. Ya he puesto el intermitente, tal cual, dentro del loop, pero sigue haciendo lo mismo. Uso un NANO y un sensor de llama YG1006. Espero encontrar la solución...

Siento que no pueda ser de mas ayuda, solo se me ocurre que vayas chekeando el codigo añadiendo serial prints para comprobar los procesos.

Diria que esto:

while(1){

}

es un bucle infinito ,nunca vas a salir de ahi porque la condicion siempre es cierta.

A ver si entiendes y puedes desarrollar este código. No lo he probado, y seguramente tenga alguna falla, pero no debería ser difícil arreglarla:

#define chispa 12
#define led2 13
#define sensor 2
#define buzzer 3
#define ev 4
#define puls 5
#define presostato 11
bool val = 0;
int intento = 0;

unsigned long previousMillis = 0;
int chispaState = LOW;
const long interval = 3000;


void setup(){

	pinMode(chispa, OUTPUT);
	pinMode(led2, OUTPUT);
	pinMode(ev, OUTPUT);
	pinMode (buzzer, OUTPUT) ;
	pinMode(presostato, INPUT);
	pinMode(sensor, INPUT);
	pinMode (puls, INPUT) ;	
	Serial.begin(9600);
}

void zumbador()
{
	unsigned char i, j ;// define variables
	while (1)
	{
		for (i = 0; i <80; i++)
		{
			digitalWrite (buzzer, LOW) ; // Turn buzzer ON
			delay (1) ;// Delay 1ms
			digitalWrite (buzzer, HIGH) ;// turn buzzer OFF
			delay (1) ;// delay ms
		}
		for (i = 0; i <100; i++) // new frequency
		{
			digitalWrite (buzzer, LOW) ;// turn buzzer ON
			delay (2) ;// delay 2ms
			digitalWrite (buzzer, HIGH) ;// turn buzzer OFF
			delay (2) ;// delay 2ms
		}
	}
}


bool intermitente()
{
	unsigned long currentMillis = millis();
	while (intento < 3) {
		if(currentMillis - previousMillis >= interval) { // Cambio de estado de led
		    // save the last time you blinked the LED
		    previousMillis = currentMillis;   
		    // si el LED esta off lo pone on y vice-versa:
		    if (chispaState == LOW) {
		    	chispaState = HIGH;
		    }
		    else {
		    	chispaState = LOW;
		    	intento ++;
		    }
		    // set el LED con ledState como variable:
		    digitalWrite(chispa, chispaState);
		} // Fin del Blink}
		val = digitalRead(sensor);  // Lee el sensor
		if (val == LOW) { // si detecta llama
			return (true); // Llama encendida
		}
	}
	return (false); // No hay llama y han transcurrido los tres intentos
}


void loop(){
	digitalWrite(led2,HIGH); // led de marcha
	if(digitalRead(presostato) == HIGH) {  // si presostato esta activado...
		digitalWrite(ev, HIGH);    // abre EV - deja pasar gas 
		if (intermitente() == true) {
			digitalWrite(chispa, LOW); // apaga la chispa 
			digitalWrite(ev,LOW);   // cierra EV
			zumbador(); // suena alarma
		}
	}

 }

jose:
Diria que esto:

while(1){

}




es un bucle infinito ,nunca vas a salir de ahi porque la condicion siempre es cierta.

Donde hay un blucle infinito?
Bueno he encontrado el problema. y se debe principalmente a que cuando el sensor no esta en LOW, tu ciclo se ejecuta en 400 mseg de i = 0 a i = 3 ya que tienes un delay(100);
pero intermitente demora 3 seg por cada disparo de chispa.
Asi que ahi tienes un problema.

Yo lo voy a modificar como para que haga una chispa cada 3 seg y descanse 3 como esta tu cambio de estado en la variable chispastate.
Luego me dices

#define sensor      2
#define buzzer      3
#define ev          4
#define puls        5
#define presostato  11
#define chispa      12
#define led2        13
#define interval    3000UL
bool val =          0;
int i =             0;

unsigned long previousMillis = 0;
bool chispaState = LOW;

  
void setup(){

  pinMode(chispa, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(ev, OUTPUT);
  pinMode (buzzer, OUTPUT) ;

  pinMode(presostato, INPUT);
  pinMode(sensor, INPUT);
  pinMode (puls, INPUT) ;
        
  Serial.begin(9600);
}

void zumbador() {
  unsigned char i, j ;// define variables
  while (1)   {
        for (i = 0; i <80; i++)   {
            digitalWrite (buzzer, LOW) ; // Turn buzzer ON
            delay (1) ;// Delay 1ms
            digitalWrite (buzzer, HIGH) ;// turn buzzer OFF
            delay (1) ;// delay ms
        }
        for (i = 0; i <100; i++) { // new frequency
        
            digitalWrite (buzzer, LOW) ;// turn buzzer ON
            delay (2) ;// delay 2ms
            digitalWrite (buzzer, HIGH) ;// turn buzzer OFF
            delay (2) ;// delay 2ms
        }
  }
}


void intermitente() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) { // Empieza Blink
     // save the last time you blinked the LED 
     previousMillis = currentMillis;   

     // si el LED esta off lo pone on y vice-versa:
     chispaState = !chispaState;
     //  if (chispaState == LOW)
     //    chispaState = HIGH;
     // else
     //    chispaState = LOW;
     Serial.println("Intermitente");
     Serial.print(chispaState?"Chispa : ON  =>":"Chispa : OFF =>");
     Serial.println(chispaState);
     if (chispaState)
        i++;


     // if (chispaState == LOW)
     //    chispaState = HIGH;
     // else
     //    chispaState = LOW;

     // set el LED con ledState como variable:
     digitalWrite(chispa, chispaState);
  } // Fin del Blink
} 



void loop(){
  
  digitalWrite(led2,HIGH); // led de marcha

  if (digitalRead(presostato) == HIGH) {  // si presostato esta activado...

      digitalWrite(ev, HIGH);    // abre EV - deja pasar gas  
      while(i<=3) {   
          intermitente();  // enciende la chispa
       
          val = digitalRead(sensor);  // Lee el sensor
          if (val == LOW) { // si detecta llama
            chispaState = LOW;
            i = 4;
            digitalWrite(chispa, chispaState); // apaga la chispa
            break;
          }
      }    
      // si transcurridos tres encendidos no detecta llama 
      digitalWrite(chispa, LOW); // apaga la chispa   
      digitalWrite(ev,LOW);   // cierra EV 
      // if(digitalRead(puls) == LOW){
      zumbador(); // suena alarma
      //  }
      delay(1000);    
  } else { 
      digitalWrite(chispa, LOW); // apaga la chispa   
      digitalWrite(ev,LOW);   // cierra EV      
  }  // fin de presostato 

}

surbyte:
Donde hay un blucle infinito?
Bueno he encontrado el problema. y se debe principalmente a que cuando el sensor no esta en LOW, tu ciclo se ejecuta en 400 mseg de i = 0 a i = 3 ya que tienes un delay(100);
pero intermitente demora 3 seg por cada disparo de chispa.
Asi que ahi tienes un problema.

Yo lo voy a modificar como para que haga una chispa cada 3 seg y descanse 3 como esta tu cambio de estado en la variable chispastate.
Luego me dices

#define sensor      2

#define buzzer      3
#define ev          4
#define puls        5
#define presostato  11
#define chispa      12
#define led2        13
#define interval    3000UL
bool val =          0;
int i =            0;

unsigned long previousMillis = 0;
bool chispaState = LOW;

void setup(){

pinMode(chispa, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(ev, OUTPUT);
  pinMode (buzzer, OUTPUT) ;

pinMode(presostato, INPUT);
  pinMode(sensor, INPUT);
  pinMode (puls, INPUT) ;
       
  Serial.begin(9600);
}

void zumbador() {
  unsigned char i, j ;// define variables
  while (1)  {
        for (i = 0; i <80; i++)  {
            digitalWrite (buzzer, LOW) ; // Turn buzzer ON
            delay (1) ;// Delay 1ms
            digitalWrite (buzzer, HIGH) ;// turn buzzer OFF
            delay (1) ;// delay ms
        }
        for (i = 0; i <100; i++) { // new frequency
       
            digitalWrite (buzzer, LOW) ;// turn buzzer ON
            delay (2) ;// delay 2ms
            digitalWrite (buzzer, HIGH) ;// turn buzzer OFF
            delay (2) ;// delay 2ms
        }
  }
}

void intermitente() {
  unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval) { // Empieza Blink
    // save the last time you blinked the LED
    previousMillis = currentMillis;

// si el LED esta off lo pone on y vice-versa:
    chispaState = !chispaState;
    //  if (chispaState == LOW)
    //    chispaState = HIGH;
    // else
    //    chispaState = LOW;
    Serial.println(“Intermitente”);
    Serial.print(chispaState?“Chispa : ON  =>”:“Chispa : OFF =>”);
    Serial.println(chispaState);
    if (chispaState)
        i++;

// if (chispaState == LOW)
    //    chispaState = HIGH;
    // else
    //    chispaState = LOW;

// set el LED con ledState como variable:
    digitalWrite(chispa, chispaState);
  } // Fin del Blink
}

void loop(){
 
  digitalWrite(led2,HIGH); // led de marcha

if (digitalRead(presostato) == HIGH) {  // si presostato esta activado…

digitalWrite(ev, HIGH);    // abre EV - deja pasar gas 
      while(i<=3) { 
          intermitente();  // enciende la chispa
     
          val = digitalRead(sensor);  // Lee el sensor
          if (val == LOW) { // si detecta llama
            chispaState = LOW;
            i = 4;
            digitalWrite(chispa, chispaState); // apaga la chispa
            break;
          }
      }   
      // si transcurridos tres encendidos no detecta llama
      digitalWrite(chispa, LOW); // apaga la chispa 
      digitalWrite(ev,LOW);  // cierra EV
      // if(digitalRead(puls) == LOW){
      zumbador(); // suena alarma
      //  }
      delay(1000);   
  } else {
      digitalWrite(chispa, LOW); // apaga la chispa 
      digitalWrite(ev,LOW);  // cierra EV     
  }  // fin de presostato

}

Prueba esto y me cuentas:

void bucle(){
  while(1){
    Serial.println("Estoy en un bucle infinito");
    delay(500); 
  } 
}  
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  bucle();
  Serial.println("Estoy en el loop");
  delay(500);
}

Ahhh tienes razón jose cuando probé el código comenté la función zumbador y fue por eso que no me di cuenta. Pero esa función tranquilamente la reemplaza por

tone(buzzer, 500, 600);

500 es la frecuencia del buzzer 600 son 600mseg que es lo que mas o menos demora esa rutina si funcionara bien.

Gracias a todos. He probado el código de surbyte y funciona. Ahora falta pulirlo para que haga unas cuantas cosas más. El tema del zumbador lo he sustituido por la función simple tone(). Tampoco hace falta que haga florituras... Ya os iré contando.

Probando y reprobando, lamento decir que no funciona bien. El intermitente si que lo hace, pero cuando detecta la llama se apaga tanto la chispa como la ev, lo que para todo el sistema. Tampoco funciona en el caso de que vuelva a tener señal alta de presostato. El funcionamiento debería ser el siguiente: 1.- Detecta presión con el presostato, abre la ev y empieza el ciclo de encendido. 2.- El ciclo consta de tres intentos de chispa. Si se cumplen los tres intentos, se cierra la ev, se apaga la chispa, da una alarma y se pone en espera de reset con un pulsador. 3.- Si se detecta llama, la chispa se para y la ev se mantiene abierta mientras que el presostato esté alto.

Así es como debería funcionar. Le he dado mil vueltas. He anidado multitud de IF's y no he sido capaz de hacerlo funcionar. Siento mucho dares la lata, pero no se como salir del "bucle".

Un saludo.

Modificalo entonces.. ya te dimos un buen empujón, creo.