Cambiar a Bucle Cerrado

Que tal chicos, yo sé que no es correcto hacer las programaciones por los demas pero realmente necesito ayuda, tengo esta programación de un solo ciclo en el cual uno a traves de un potenciometro varia el tiempo que esta encendido el led, lo que necesito es que ese bucle sea cerrado y que el mismo tiempo que la led se mantiene encendida este apagada y lo haga indefinidamente hasta que uno le de stop y pueda reconfigurar el tiempo
C++:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd (0x3f,16,2);
#define   ST_TIME   A1
#define   START     A2
#define   STOP      A3
#define   LED_PRO   5
#define   BUZZER    6


//////////////////////////////////////////////////////////////////

unsigned int tiempo, cont = 0;
unsigned int display_time = 0;
unsigned long PREV_MILLIS = 0;
const int FALSE = 0;
const int TRUE = 1;
short FLAG_STOP = 0;
char buffer[16];


//////////////////////////////////////////////////////////////////

void setup()
{
  pinMode(START,INPUT_PULLUP);  // Habilita Pullup Interna
  pinMode(STOP,INPUT_PULLUP);   // Habilita Pullup Interna

  pinMode(BUZZER, OUTPUT);
  pinMode(LED_PRO, OUTPUT);

  lcd.init();
  lcd.backlight();
  //Serial.begin(9600);

  mensaje_bienvenida();
  lcd.clear();

  while(digitalRead(START) || tiempo == 0)
  {
    tiempo = analogRead(ST_TIME) * 0.176;
    display_tiempo();
    delay(200);
  }

  lcd.clear();
  digitalWrite(LED_PRO, HIGH);  //  INDICADOR
}

//////////////////////////////////////////////////////////////////

void loop()
{
  while (FLAG_STOP == FALSE)
  {
    unsigned long CURRENT_MILLIS = millis();
    display_tiempo();
    delay(200);

    if (CURRENT_MILLIS - PREV_MILLIS >= 1000)
 {
      tiempo--;
      PREV_MILLIS = CURRENT_MILLIS;
    }

    if (!digitalRead(STOP)||(tiempo==0))
{
      FLAG_STOP = TRUE;
      mensaje_bienvenida() ;
}
  }

  while(FLAG_STOP)
  {
 digitalWrite(LED_PRO, LOW);  // APAGA INDICADOR MODO PROCESO
 final_proceso();
 lcd.clear();
 
 while(digitalRead(START) || tiempo == 0)
 {
 tiempo = analogRead(ST_TIME) * 0.176;
 display_tiempo();
 delay(200);
 }
 lcd.clear();
 digitalWrite(LED_PRO, HIGH);  // ACTIVA INDICADOR MODO PROCESO
 FLAG_STOP = FALSE;
 delay(100);
  }

}

//////////////////////////////////////////////////////////////////

void mensaje_bienvenida()
{
  lcd.clear();
  lcd.println("  TEMPORIZADOR");
  lcd.setCursor(0, 1);
  lcd.println("   AUTOMATICO");
  delay(3000);
  lcd.clear();
  lcd.println("INICIALIZANDO");
  delay(200);
  lcd.println(".");
  delay(200);
  lcd.println(".");
  delay(200);
  lcd.println(".");
  delay(100);
}

//////////////////////////////////////////////////////////////////

void display_tiempo()
{
  unsigned int minuto, segundo;

  lcd.setCursor(0, 0);
  minuto = tiempo / 60;
  segundo = tiempo % 60;
  sprintf(buffer, " TIEMPO : %u:%0.2u   ", minuto, segundo);
  lcd.println(buffer);
}

void final_proceso()
{
    lcd.clear();
    lcd.println("    PROCESO ");
    lcd.setCursor(0, 1);
    lcd.println("   FINALIZADO ");
    digitalWrite(LED_PRO, LOW);
    digitalWrite(BUZZER, HIGH);
    delay(1000);
    digitalWrite(BUZZER, LOW);
    delay(1000);
    digitalWrite(BUZZER, HIGH);
    delay(1000);
    digitalWrite(BUZZER, LOW);
    delay(1000);
    digitalWrite(BUZZER, HIGH);
    delay(1000);
    digitalWrite(BUZZER, LOW);
    delay(1000);
    digitalWrite(BUZZER, HIGH);
    delay(1000);
    digitalWrite(BUZZER, LOW);
    delay(1000);
    digitalWrite(BUZZER, HIGH);
    delay(1000);
    digitalWrite(BUZZER, LOW);
    delay(1000);
    digitalWrite(BUZZER, HIGH);
    delay(1000);
    digitalWrite(BUZZER, LOW);
}
 
Atrás
Arriba