Duda al encender 4 leds a ritmos diferentes con botones

Hola amigos , soy nuevo con esto de arduino y tengo una super duda con la que llevo dias y aun no encuentro respuestas pero tal vez para ustedes sea fácil y sea algo sencillo.

tengo 4 leds y cada led tiene un boton con el que se prende y apaga , al prender el led va ir parpadeando de lento a rapido hasta que quede completamente encendido.

mis problemas son estos, cuando está parpadeando un led y quiero encender otro no puedo hasta que termine el ciclo anterior y lo que quiero es que cada led se pueda prender cada uno con su ritmo sin importar que ya haya uno prendido. y otro problema es que cuando llega a 0 el tiempo de parpadeo del led ya no lo puedo apagar. este es el codigo que usaba, lo estoy intentando con dos led.

int botonMto=7;
int botonCld=6;
int Mantenimiento =12;
int Calidad=11;
int tiempo =1000;
int tiempo1 = 1000;
int tiempo2 = 50;
int tiempo3 =1000;
void setup()
{
Serial.begin(9600);
pinMode(botonMto,INPUT); //push button pin
pinMode(botonCld,INPUT);
pinMode(botonIng,INPUT);
pinMode(botonMfa,INPUT);
pinMode(Mantenimiento,OUTPUT);
pinMode(Calidad,OUTPUT);
pinMode(Ingenieria,OUTPUT);
pinMode(Manufactura,OUTPUT); // LED pin
}

void loop()
{

int pulsador1 = digitalRead(botonMto);

while( pulsador1 == HIGH ) //cuando se aplasta el boton
{

//blink
digitalWrite(Mantenimiento,HIGH);
delay(tiempo1-=tiempo2);
digitalWrite(Mantenimiento,LOW);
delay(tiempo1);
Serial.println(tiempo1);
pulsador1 = digitalRead(botonMto); //refrescar el valor

}
if (pulsador1 == LOW);
{
digitalWrite(Mantenimiento,LOW);
pulsador1 = digitalRead(botonMto); //refrescar el valor
//tiempo1= tiempo;
}
if(tiempo1==0)
{
if(pulsador1 == LOW);
{
digitalWrite(Mantenimiento,LOW);
}
}

int pulsador2 = digitalRead(botonCld);
while( pulsador2 == HIGH ) //cuando se aplasta el boton
{

//blink
digitalWrite(Calidad,HIGH);
delay(tiempo3-=tiempo2);
digitalWrite(Calidad,LOW);
delay(tiempo3);
Serial.println(tiempo1);
pulsador1 = digitalRead(botonCld); //refrescar el valor

}
if (pulsador2 == LOW);
{
digitalWrite(Calidad,LOW);

}
}

se que uno de los problemas está en que uso delay, pero no logro comprender bien la funcion millis y menos que haga eso que quiero hacer, ayudenme porfavor

The problem is using delay(). The Arduino can't do anything else while delaying.

The answer is to NOT use delay() and use the millis() function instead.

Study the Blink Without Delay tutorial, and the tutorial on How to do Several Things at the Same Time.

Doy recompensa si me ayudan con el problema

  1. You can post on the Spanish section of the forum sección en español.

Doy recompensa si me ayudan con el problema.

  1. If you wish to pay for the help, post on the Gigs & Collaborations section of the forum

Antes de dar recompensas lee las normas del foro, edita tu post usando etiquetas y aprende que si posteas en una sección en un determinado idioma debes usar ese idioma y no el propio para plantear tu duda.
El primer hilo de cada sección te diré que hacer.