Encendido de led con boton y apagado mediante bluetooth

Hola, tengo un proyecto escolar en el cual tengo que hacer encender un LED, el cual va permanecer 15 segundos encendido, 5 apagado y vuelve a empezar hasta que no lo desactive mediante bluetooth.
Alguna ayuda? Hasta ahora tengo el encendido y apagado por bluetooth, pero no puedo darle la programacion al LED.

const int boton = 4; 
const int led =  2;
int estado = 0;
int estado_anterior = 0;
int LED = 0;
String readString;


void setup() {
 pinMode(led, OUTPUT);
 pinMode(boton, INPUT); 
 Serial.begin(9600);
}

void loop(){
 
  estado = digitalRead(boton);
  
  if((estado == HIGH) && (estado_anterior == LOW)){
    LED = 1 - LED;
    delay(250);
  }
  estado = estado_anterior;
   if (LED==1){
     digitalWrite(led, HIGH);
   }else {
     digitalWrite(led, LOW);
   }

while (Serial.available()) {
    delay(3);  
    char c = Serial.read();
    readString += c; 
  }
  if (readString.length() >0) {
    Serial.println(readString);
    if (readString == "w")
    {
     LED = 0; 
    }
    
   readString="";
}}

Con este código logro apagar el LED, pero tengo que esperar a que de la secuencia completa para que se apague, no puedo interrumpir la secuencia en cualquier momento que es lo que quiero hacer.
*Puse los tiempos en 1 segundo para poder apreciar mas rápido en que momento apaga el LED.

const int LED =2;
const int BOTON = 4;
int val = 0; 
int state = 0;
int old_val = 0; 
String readString;

void setup(){ 
 pinMode(LED,OUTPUT); 
 pinMode(BOTON,INPUT); 
 Serial.begin(9600);
}

void loop() {
val= digitalRead(BOTON);
if ((val == HIGH) && (old_val == LOW)){
state=1-state;
delay(10);
}
old_val = val;
if (state==1){
 digitalWrite(LED, HIGH);
 delay(1000);
 digitalWrite(LED,LOW);
 delay(1000);
 digitalWrite(LED,HIGH);
 delay(1000);
 digitalWrite(LED,LOW);
 delay(1000);
}

if (Serial.available()) { 
    char c = Serial.read();
    readString += c; 
  }
  if (readString.length() >0) {
    Serial.println(readString);
    if (readString == "A")
    {
     state = 0; 
    }
    
   readString="";
    }
}

Eso te ocurre porque usas delay().
No te enseño tu profesor que delay() no permite hacer nada e incluso detiene la operación del microcontrolador?

La solución es usar millis() asi que lee esto

Ve a Documentación => Indice de temas tutoriales => Millis()

Creo que olvide mencionar que es la primera vez que manejo un arduino :sweat_smile:
Hasta ahora tengo algo así:
Acciono el botón, empieza el parpadeo y puedo desactivarlo mediante el bluetooth, el problema es que si lo hago cuando el LED esta encendido lo deja encendido, si lo hago cuando esta apagado lo deja apagado.
Supongo que es problema de las ultimas lineas del código pero no logro encontrar la manera de hacerlo correcto.

const int LED =2;
const int BOTON = 4;
boolean val = 0; 
boolean state = 0;
boolean old_val = 0;
boolean flag = true;
long previousMillis = 0;
long On = 1000;
long Off = 1000;  
String readString;

void setup(){
 pinMode(LED,OUTPUT);
 pinMode(BOTON,INPUT);
 Serial.begin(9600);
}

void loop() {
val= digitalRead(BOTON);
if (val && !old_val){
state=1-state;
}
old_val = val;
 if (state==1){
  if(millis() < (previousMillis + On + Off)){
   flag = true; 
  }
 else {
  flag = false; 
  previousMillis = millis();
 }
 if (flag == true){
  if (millis() > (previousMillis + On)){
  digitalWrite(2, LOW);
  }
  else{
    digitalWrite(2, HIGH); 
  }
 }
 }

if (Serial.available()) { 
    char c = Serial.read();
    readString += c; 
  }
  if (readString.length() >0) {
    Serial.println(readString);
    if (readString == "A")
    {
     state = 0; 
    }
   readString="";
    }
}

No digo que este perfecto pero reubicando tu código debería estar cerca

const int LED 			= 2;
const int BOTON 		= 4;
boolean val 			= 0; 
boolean state 			= 0;
boolean old_val 		= 0;
boolean flag 			= true;
unsigned long previousMillis 	= 0;
unsigned long On 				= 1000;
unsigned long Off 				= 1000;  
String readString;

void setup(){
	pinMode(LED,OUTPUT);
	pinMode(BOTON,INPUT);
	Serial.begin(9600);
}

void loop() {

	if (Serial.available()) { 
		char c = Serial.read();
		readString += c; 
	}
	if (readString.length() >0) {
		Serial.println(readString);
		if (readString == "A") {
			state = 0; 
			flag = false;   // para apaga led
		}
		readString="";
	}

	val= digitalRead(BOTON);

	if (val && !old_val) {
		state = 1-state;
	}
	old_val = val;
	if (state){
		if (millis() < (previousMillis + On + Off)){
			flag = true; 
		}
		else {
			flag = false; 
			previousMillis = millis();
		}
	}


	if (flag){
		if (millis() > (previousMillis + On)){
			digitalWrite(2, LOW);
		}
		else{
			digitalWrite(2, HIGH); 
		}
	}
}