[RÉSOLU]Aide pour un programme signal PWM

Pas tout a fait cela.
Déjà mon break était mal placé.

Voici une proposition de modification

void loop()
{
  switch( etat )
  {
  //---------------------------------------------
  case REPOS:
    // on attend le bouton
    if ( digitalRead( pushpin ) == LOW )
    {
      etat = EN_COURS;
      // reinitialiser les variables pour etre sur
      luminosite = 0;
      variation = 5;
    }
    break;
  //---------------------------------------------
  case EN_COURS:
    if ( (millis() - heure_dernier_changement) > 1000 )
    {
      analogWrite(ledpin, luminosite);
      if ( variation > 0 )
      {
        luminosite = luminosite + variation;
        if ( luminosite == 25)
          variation = - variation;
      }
      else
      {
        if ( luminosite == 0 )
          etat = REPOS;
        else        
          luminosite = luminosite + variation;
      }
      heure_dernier_changement = millis();
    }
    break;
  //---------------------------------------------
  }  // switch
} // loop

Comme tu le vois, le code de EN_COURS commence a s'alourdir avec des tests imbriqués un peu compliqués.
On peut prendre avantage de la notion d'automate en renommant EN_COURS comme UP et ajoutant un nouvel état DOWN :

enum {
  REPOS,          // Attente pression poussoir
  START,         // 1ere etape  
  UP,               // gradateur up
  DOWN           // et down
} etat = REPOS;

void loop()
{
  switch( etat )
  {
  //---------------------------------------------
  case REPOS:
    // on attend le bouton
    if ( digitalRead( pushpin ) == LOW )
      etat = START;
    // pas de break : on enchaîne directement sur START sans repasser par loop();
  //---------------------------------------------
  case START:
    // 1ere étape du gradateur avec luminosite = 0
    analogWrite(ledpin, luminosite);
    // on continue après avec UP
    etat = UP;
    // on mémorise l'heure
    heure_dernier_changement = millis();
    break;
  //---------------------------------------------
  case UP:
    if ( (millis() - heure_dernier_changement) > 1000 )
    {
      // maintenant je pré-calcule la valeur avant de l'écrire
      luminosite = luminosite + variation;
      analogWrite(ledpin, luminosite);
      // si la dernière écriture était 0, on passe en DOWN
      if ( luminosite == 25)
          etat = DOWN ;
      // on mémorise l'heure
      heure_dernier_changement = millis();
    }
    break;
  //---------------------------------------------
  case DOWN:
    if ( (millis() - heure_dernier_changement) > 1000 )
    {
      luminosite = luminosite - variation;  // note que je change le signe ici plutot que la valeur
      analogWrite(ledpin, luminosite);
      // si la dernière écriture était 0, on passe en REPOS
      if ( luminosite == 0)
          etat = REPOS ;
      // on mémorise l'heure
      heure_dernier_changement = millis();
    }
    break;
  //---------------------------------------------
  }  // switch
} // loop

Ce code garantit parfaitement que l'on passe par 0 ... 25 ... 0