sinodal para controlar un led por pulsador.

He buscado varias maneras de hacer parpadear un led PWM de la forma mas estetica y finalmente he encontrado una que me gusta mucho, es suave y no usa delay pero el fade responde a una ecuación asociada a millis que siempre esta activa y no se como hacer para que el fade inicie desde cero cada vez que pulso el botón que lo dispara.

long time=0;
int value;
int periode = 1000;
int buttonPin = 9;
int ledPin = 3;

void setup()
{
}

void loop()
{
  time = millis();
  value = 127+128*cos(2*PI/periode*time);

  if (digitalRead(9) == HIGH)
    {
    analogWrite(ledPin, value);
  }else{
    analogWrite(ledPin, 0);
  }      
}

El efecto es muy bueno siempre que pueda controlarse el punto de inicio y final, como podría hacerlo?

Vaya forma tan interesante de hacer un fade en un led.
Pues por lo pronto lo único que se me ocurre es que detectes el paso por 0 y ahí inicies con el fade

unsigned long time=0;
int value;
int periode = 1000;
int buttonPin = 9;
int ledPin = 3;
bool flag;

void setup()
{
  pinMode(buttonPin,INPUT);  
  pinMode(ledPin,OUTPUT);
  
}

void loop()
{
  
  time = millis();
  value = 127+128*cos(2*PI/periode*time);
   
   
  if(digitalRead(buttonPin)){
        if (value==0)  
        flag=true;
       } 
       
  else{
    
    flag=false;
    analogWrite(ledPin, 0);
  }            
        
     if(flag)  
    analogWrite(ledPin, value);
       
}

Solo que tiene un "pequeño" inconveniente: notaras un retraso ya que si value está digamos por ejemplo en 5, tienes que hacer todo el barrido desde 5 hasta 255 y de 255 a 0, y ahí comienza el fade.
Esperemos respuestas de los mas experimentados, debe haber otra solución
Igual yo haría el fade de otra forma sin usar la ecuación, pero quizá el código no seria igual de estético