Effectuer une action qu'une seule fois dans le loop() ?

si la lumière varie en permanence entre 499 et 501, c'est normal.
soit tu mets une valeur plus petite et une plus grande 400 - 550
soit tu mets hysteresis afin de palier au passage permanent entre chaque valeur.

mais le fait de mettre digitalWrite(onOff, LOW); dans ta boucle for, c'est pas le top :wink:
à chaque incrémentation, ca met le onoff à low
mets le après ta boucle

void MoteurAccelerationPWM()
{
  // Acceleration
  for( int i = 80; i<= 90; i++ )
  {
    analogWrite( onOff, i );
    delay(50); // delay pour avoir un progression
  }
    digitalWrite(onOff, LOW); // arrête le moteur a la fin de l'action
}

ou tu le mets juste après l'appel dans ton if

if (lum1 > 500 && valid == 0)
{ 
      digitalWrite(monter, HIGH);
      digitalWrite(descendre, LOW);
      MoteurAccelerationPWM();
valid = 1;
    digitalWrite(onOff, LOW); // arrête le moteur a la fin de l'action
    }
  
  if (lum1 < 500 && valid ==1 ) // Si lecture est inférieur a 500 le moteur descend en ralentissant.
    {
    digitalWrite(monter,LOW);
    digitalWrite(descendre, HIGH);
    MoteurDescelerationPWM();
valid = 0;
    digitalWrite(onOff, LOW); // arrête le moteur a la fin de l'action
    }

mais ca m'étonnerait que ta valeur puisse être égale à 500 très longtemps :wink: