[RÉSOLU]Aide pour un programme signal PWM

Soit tu considère que ta sortie relai est une sortie de la même tâche que celle qui joue le gradateur sur les leds.
Par exemple tu considère que le relai se ferme au moment où tu commence le cycle UP et s'ouvre au moment où tu retourne au repos.

.......
  //---------------------------------------------
  case START:
    // 1ere étape du gradateur avec luminosite = 0
    analogWrite(ledpin, luminosite);
    // on continue après avec UP
    etat = UP;
    // fermeture du relai
    digitalWrite( pin_relai, HIGH );                                        // <<<< FERMETURE RELAI
    // 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 ;
          // ouverture du relai
          digitalWrite( pin_relai, LOW );                                        // <<<< OUVERTURE RELAI
      }
      // on mémorise l'heure
      heure_dernier_changement = millis();
    }
    break;
  //---------------------------------------------
  }  // switch

Soit le relai doit vivre sa vie de manière différente. Par exemple, il démarre bien avec le bouton poussoir comme l'automate des leds mais il ne reste fermé que 300ms par exemple.

Dans ce cas, il vaut mieux créer un nouvel automate ce qui veut dire :
Nouvelle variable d'état enum { REPOS_RELAI, START_RELAI } etat_relai;
Et un switch différent : switch( etat_relai )

Si tu choisit cette option, pour commencer à ajouter un peu de lisibilité dans le code, je te suggère de commencer à créer des sous fonctions telles que

  • void automate_led() qui contiendras le code du switch sur la variable d'état de la led (a renommer peut être etat_led pour lever l'ambiguïté)
  • void automate_relai() idem pour le switch sur etat_relai.
    La fonction loop devient alors
void loop()
{
  automate_led();
  automate_relai();
}

Ca devient un exemple typique de la bonne idée d'écrire les tâches sous la forme de machines d'états non bloquantes.

Au fait tu sais faire pour piloter un relai par Arduino ?
On ne branche pas un relai en direct sur un broche de l'arduino surtout ci ce n'est pas un relai 5V.
On utilise une résistance qui attaque la base d'un transistor en collecteur ouvert e ton n'oublie pas la diode de roue libre;
Voir page 27 du 1er document indiqué par Osaka dans ce post : http://arduino.cc/forum/index.php/topic,102618.0.html
Suivant le relai, tu n'est pas obligé d'aller chercher un TIP120. Un transistor plus petit peut suffir.

Quelles infos as tu sur ton relai ?
Tension de commande ?
Impédance de la bobine ou courant de commande ?
Est-ce que tu as déjà des transistors qui trainent chez toi ?