Auteur Sujet: Un Arduino par module....ou pas.  (Lu 71132 fois)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Un Arduino par module....ou pas.
« Réponse #30 le: février 19, 2015, 12:20:52 pm »
Bonjour,

D'après ce que je comprends de ton programme :

La variable a est incrémentée de 0 à 500 toutes les 20ms. Au total le cycle prend 10 secondes

Quand a vaut 10, soit après 200ms la première branche du case est exécutée. Cette première branche n'incrémente x que si l'exécution a lieu après 50 ms. La première fois c'est toujours vrai. Ensuite il faut attendre 10,2 secondes pour que a vaille de nouveau 10. La seconde fois c'est également vrai et x est incrémenté. etc. Pour que la lumière passe de 0 à 255, il faudra 42 minutes et des poussière. Est-ce le comportement attendu ? Que veux tu faire exactement ?
Cordialement

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Un Arduino par module....ou pas.
« Réponse #31 le: février 19, 2015, 12:29:45 pm »
J'avoue alors que je ne sais pas sur une lecture rapide. J'étudierai plus en détail quand j'aurais plus le temps. J'ai du mal à voir le rapport entre le graphique et ton prog pour le moment.
Pour ma part, je n'utilise pas le millis() comme cela avec 2 variables temps. Chacun a ses propres pratiques de codage mais de mon coté j'utilise une seule variable time unsigned long. Je l'initialise à millis() dans le setup et dans la boucle, je fais comme cela :
if((millis() -temps)>intervallefixe){
temps=millis();
puis action
}
J'utilise comme cela moins d'espace mémoire allouable pour les variables (la ram).

Après pour ma part, j'ai pris le parti de faire une variable heure dirons nous qui dit quelle heure il est et en fonction de cette variable les animations se font ou pas. J'aurais qu'une variable unsigned long pour millis(). Je présenterai cela plus tard sur le post.
G.

petitrain

  • Jr. Member
  • **
  • Messages: 86
    • Voir le profil
Re : Un Arduino par module....ou pas.
« Réponse #32 le: février 19, 2015, 12:54:54 pm »
Pour Jean Luc:
 Non, ce n'est pas ce que j'attendais. Je voudrais mettre en oeuvre mon graphique:
  des sorties PWM qui puissent être réglables et qui se déclenchent à différents moments d'un cycle jour/nuit.

Pour Guillaume:
Je comprends mieux comment tu fais. OK pour la variable heure qui dit quand faire quoi; mais comment fais-tu pour commander des fonctions analogWrite(), il te faut bien d'autres variables qui dépendent elles aussi du temps....ou je me trompe?

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Un Arduino par module....ou pas.
« Réponse #33 le: février 19, 2015, 01:08:12 pm »
Tu as raison, schématiquement je fais comme tu as dis avec ce que j'ai dit :
donc une variable heure int qui va de 0000 à 2359 en ne mettant pas les 2267 par exemple en fait c'est l'heure mais tout attachée. Cela va définir si l'animation doit être on ou off dans le cas de sortie numérique simple sans PWM c'est suffisant. Dans le cas de PWM effectivement non, et là il faut rajouter une variable millis() avec une condition pour effectuer ta montée au début de on et la descente au début de off.
Voilà en gros, c'est la théorie, je l'ai mis en pratique pour certains trucs cela marche.
G.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Un Arduino par module....ou pas.
« Réponse #34 le: février 19, 2015, 03:15:46 pm »
Hem, j'avais pas vu le graphique.

Pour s'en sortir avec un programme, il faut d'abord établir les données nécessaires. Une fois les données nécessaires déterminées, le code vient (presque) tout seul. Ton appli n'est pas des plus simples car tu as plusieurs intervalles de temps à gérer et qui plus est 2 chronomètre, un pour compter les durées des rampes d'augmentation et de diminution et un pour compter les intervalles de temps entre deux augmentations ou diminutions de la PWM.

Il faut tout d'abord exprimer le temps en unités qui correspondent à ton application. Par exemple, le tick est la seconde. Le mieux est de faire une fonction qui te renvoie dans le nombre de ticks :

const unsigned long dureeDuTick = 1000;

unsigned long temps()
{
    return millis()/dureeDuTick;
}

Pour gérer tes éclairages, tu as besoin, en plus du temps, de gérer l'état de chacun des éclairages. Comme tu as certains éclairages qui accomplissent 2 cycles par 24h, la led verte et la led rouge, il faut 8 états. À savoir :

ETEINT1, AUGMENTATION1, ALLUME1, DIMINUTION1, ETEINT2, AUGMENTATION2, ALLUME2 et DIMINUTION2.

Je te propose de représenter cela par un enum

enum { ETEINT1, AUGMENTATION1, ALLUME1, DIMINUTION1, ETEINT2, AUGMENTATION2, ALLUME2, DIMINUTION2 };

Ensuite il te faut un chronomètre par éclairage pour compter le temps écoulé avant de passer d'un état au suivant et il te faut également les durées, en nombre de ticks, des états. Il te faut aussi le nombre de tick entre 2 augmentations de valeur de PWM. C'est donné par la durée de l'augmentation ou de la diminution divisée par 255.

Et enfin la pin PWM concernée et la valeur de la PWM.

Je te propose de représenter cela par une structure :

struct eclairage {
  const byte pin; /* pin de PWM */
  byte etat;
  byte valeurPWM;
  byte intervallePWM; /* nombre de ticks entre 2 changement de PWM */
  unsigned long chronometre;
  const int dureeEteint1;
  const int dureeAugmentation1;
  const int dureeAllume1;
  const int dureeDiminution1;
  const int dureeEteint2;
  const int dureeAugmentation2;
  const int dureeAllume2;
  const int dureeDiminution2;
};


Ensuite il faut instancier une struct par éclairage. Si je reprends ton graphique, on a ledVerte, ledRouge, ledBleue, ledBlancChaud et halogene.

Je n'arrive pas bien à voir les date exactes sur ton graphique mais on va dire que la led verte reste éteinte pendant 8h30 = 27000s. Puis elle augmente pendant 2h = 7200. Puis elle reste allumée pendant 0. Puis elle diminue pendant 3h = 10800. Puis elle reste éteinte pendant 5h = 18000s puis elle augmente pendant 2h = 7200 puis reste allumée 1h30 = 5400s puis diminue pendant 2h = 7200s. Total = 30600 + 7200 + 0 + 10800 + 18000 + 7200 + 5400 +7200 = 86400 / 3600 = 24. On est bon
Les temps sont en seconde car le tick est à la seconde. Ce qui donne pour ledVerte :

struct eclairage ledVerte = { pinLedVerte, ETEINT1, 0, 25200, 30600, 7200, 0, 10800, 18000, 7200, 6400, 7200 };

Le chronomètre est initialisé à une durée de 7h car au 0 de ton cycle, on a déjà consommé 1h30.

La gestion du cycle de lumière :

void gereEclairage(struct eclairage& lumiere)
{
  unsigned long dateCourante = millis();
 
  switch (lumiere.etat) {
    case ETEINT1:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeAugmentation1;
        lumiere.etat = AUGMENTATION1;
        lumiere.valeurPWM = 0;
        lumiere.intervallePWM = lumiere.dureeAugmentation1 / 255;
        lumiere.dateChargementIntervallePWM = dateCourante;
      }
      break;
    case AUGMENTATION1:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeAllume1;
        lumiere.etat = ALLUME1;
        lumiere.valeurPWM = 255;
      }
      else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
      {
        lumiere.dateChargementIntervallePWM = dateCourante;
        lumiere.valeurPWM++;
        analogWrite(lumiere.pin, lumiere.valeurPWM);
      }
      break;
    case ALLUME1:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeDiminution1;
        lumiere.etat = DIMINUTION1;
        lumiere.valeurPWM = 0;
        lumiere.intervallePWM = lumiere.dureeDiminution1 / 255;
        lumiere.dateChargementIntervallePWM = dateCourante;
      }
      break;
    case DIMINUTION1:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeEteint2;
        lumiere.etat = ETEINT2;
        lumiere.valeurPWM = 0;
      }
      else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
      {
        lumiere.dateChargementIntervallePWM = dateCourante;
        lumiere.valeurPWM--;
      }
      break;
    case ETEINT2:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeAugmentation2;
        lumiere.etat = AUGMENTATION2;
        lumiere.valeurPWM = 0;
        lumiere.intervallePWM = lumiere.dureeAugmentation2 / 255;
        lumiere.dateChargementIntervallePWM = dateCourante;
      }
      break;
    case AUGMENTATION2:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeAllume2;
        lumiere.etat = ALLUME2;
        lumiere.valeurPWM = 255;
      }
      else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
      {
        lumiere.dateChargementIntervallePWM = dateCourante;
        lumiere.valeurPWM++;
        analogWrite(lumiere.pin, lumiere.valeurPWM);
      }
      break;
    case ALLUME2:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeDiminution2;
        lumiere.etat = DIMINUTION2;
        lumiere.valeurPWM = 0;
        lumiere.intervallePWM = lumiere.dureeDiminution2 / 255;
        lumiere.dateChargementIntervallePWM = dateCourante;
      }
      break;
    case DIMINUTION2:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeEteint1;
        lumiere.etat = ETEINT1;
        lumiere.valeurPWM = 0;
      }
      else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
      {
        lumiere.dateChargementIntervallePWM = dateCourante;
        lumiere.valeurPWM--;
      }
      break;
  }
  analogWrite(lumiere.pin, lumiere.valeurPWM);
}

Dans setup :

void setup() {
  pinMode(ledVerte.pin, OUTPUT);
}

Dans loop :

void loop() {
  // put your main code here, to run repeatedly:
  gereEclairage(ledVerte);
}

Le code complet, ça compile mais ce n'est absolument pas testé.

const unsigned long dureeDuTick = 1000;

const byte pinLedVerte = 3;

unsigned long temps()
{
    return millis()/dureeDuTick;
}

enum { ETEINT1, AUGMENTATION1, ALLUME1, DIMINUTION1, ETEINT2, AUGMENTATION2, ALLUME2, DIMINUTION2 };

struct eclairage {
  const byte pin; /* pin de PWM */
  byte etat; /* etat : ETEINT, AUGMENTATION, ALLUME, DIMINUTION */
  unsigned long chronometre;
  unsigned long dateChargementChronometre;
  unsigned long dateChargementIntervallePWM;
  unsigned long intervallePWM; /* nombre de ticks entre 2 changement de PWM */
  byte valeurPWM;
  const int dureeEteint1;
  const int dureeAugmentation1;
  const int dureeAllume1;
  const int dureeDiminution1;
  const int dureeEteint2;
  const int dureeAugmentation2;
  const int dureeAllume2;
  const int dureeDiminution2;
};

struct eclairage ledVerte = { pinLedVerte, ETEINT1, 25200, 0, 0, 0, 0, 30600, 7200, 0, 10800, 18000, 7200, 6400, 7200 };

void gereEclairage(struct eclairage& lumiere)
{
  unsigned long dateCourante = millis();
 
  switch (lumiere.etat) {
    case ETEINT1:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeAugmentation1;
        lumiere.etat = AUGMENTATION1;
        lumiere.valeurPWM = 0;
        lumiere.intervallePWM = lumiere.dureeAugmentation1 / 255;
        lumiere.dateChargementIntervallePWM = dateCourante;
      }
      break;
    case AUGMENTATION1:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeAllume1;
        lumiere.etat = ALLUME1;
        lumiere.valeurPWM = 255;
      }
      else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
      {
        lumiere.dateChargementIntervallePWM = dateCourante;
        lumiere.valeurPWM++;
        analogWrite(lumiere.pin, lumiere.valeurPWM);
      }
      break;
    case ALLUME1:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeDiminution1;
        lumiere.etat = DIMINUTION1;
        lumiere.valeurPWM = 0;
        lumiere.intervallePWM = lumiere.dureeDiminution1 / 255;
        lumiere.dateChargementIntervallePWM = dateCourante;
      }
      break;
    case DIMINUTION1:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeEteint2;
        lumiere.etat = ETEINT2;
        lumiere.valeurPWM = 0;
      }
      else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
      {
        lumiere.dateChargementIntervallePWM = dateCourante;
        lumiere.valeurPWM--;
      }
      break;
    case ETEINT2:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeAugmentation2;
        lumiere.etat = AUGMENTATION2;
        lumiere.valeurPWM = 0;
        lumiere.intervallePWM = lumiere.dureeAugmentation2 / 255;
        lumiere.dateChargementIntervallePWM = dateCourante;
      }
      break;
    case AUGMENTATION2:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeAllume2;
        lumiere.etat = ALLUME2;
        lumiere.valeurPWM = 255;
      }
      else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
      {
        lumiere.dateChargementIntervallePWM = dateCourante;
        lumiere.valeurPWM++;
        analogWrite(lumiere.pin, lumiere.valeurPWM);
      }
      break;
    case ALLUME2:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeDiminution2;
        lumiere.etat = DIMINUTION2;
        lumiere.valeurPWM = 0;
        lumiere.intervallePWM = lumiere.dureeDiminution2 / 255;
        lumiere.dateChargementIntervallePWM = dateCourante;
      }
      break;
    case DIMINUTION2:
      if (lumiere.dateChargementChronometre + lumiere.chronometre > dateCourante)
      {
        lumiere.dateChargementChronometre = dateCourante;
        lumiere.chronometre = lumiere.dureeEteint1;
        lumiere.etat = ETEINT1;
        lumiere.valeurPWM = 0;
      }
      else if (lumiere.dateChargementIntervallePWM + lumiere.intervallePWM > dateCourante)
      {
        lumiere.dateChargementIntervallePWM = dateCourante;
        lumiere.valeurPWM--;
      }
      break;
  }
  analogWrite(lumiere.pin, lumiere.valeurPWM);
}

void setup() {
  pinMode(ledVerte.pin, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  gereEclairage(ledVerte);
}
Cordialement

petitrain

  • Jr. Member
  • **
  • Messages: 86
    • Voir le profil
Re : Un Arduino par module....ou pas.
« Réponse #35 le: février 19, 2015, 06:48:35 pm »
Merci pour ces réponses, je vais étudier tout ça....
Finalement, quand je demandai "est-ce que c'est trop demandé à l'Arduino?" je parlai du langage Arduino. Et, je m'aperçois, en voyant la réponse de Jean Luc, qu'effectivement, c'est trop demandé... il faut passer par d'autres langages. Ne connaissant pas le C#, j'ai peur de pas tout comprendre.

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Un Arduino par module....ou pas.
« Réponse #36 le: février 19, 2015, 06:57:49 pm »
C'est vrai que la réponse de Jean Luc est complète, et rassures toi je n'ai pas encore tout compris. Mais cela s'apprend il n'y a pas de difficulté majeure. Je suis parti de zéro il n'y pas si longtemps et j'arrive à faire des class certes simples mais tout de même ;), et finalement on pourrait dire c'est trop dur. Mais tout le monde peut y arriver.

Chacun y arrivera à sa manière. N'hésite pas à revenir poser des questions.
G.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Re : Un Arduino par module....ou pas.
« Réponse #37 le: février 19, 2015, 08:29:34 pm »
... il faut passer par d'autres langages. Ne connaissant pas le C#, j'ai peur de pas tout comprendre.

Hummmm. Ce n'est pas du C#. C'est du C c'est à dire le langage de l'Arduino qui a de multiples facettes.

Si tu as des soucis de compréhension, regarde mon dernier article : Les structures

Ce que tu essayes de faire n'est pas des plus simple  :) et ça va nécessiter des notions au delà du niveau débutant.
Cordialement

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Un Arduino par module....ou pas.
« Réponse #38 le: février 20, 2015, 08:19:27 am »
Note que pour tester, il suffit de diminuer la constante dureeDuTick pour enchaîner la séquence à plus grande vitesse.
Cordialement

petitrain

  • Jr. Member
  • **
  • Messages: 86
    • Voir le profil
Re : Un Arduino par module....ou pas.
« Réponse #39 le: février 20, 2015, 08:56:16 am »
C'est ce que j'ai fait, j'ai même réduit le tick à 1. Le programme compile bien mais ma led s'allume au debut du programme et reste tout le temps allumé. J'essaie de comprendre le programme mais c'est pas simple, il me manque beaucoup de connaissance
pour m'en sortir tout seul. Est-ce que ça ne serait pas plus simple de se servir d'un CI dédié à la PWM, par exemple le TLC5940 ou autre avec une library qui va bien, est-ce que je pourrais gérer mon éclairage d'une manière plus souple, en faisant chevaucher mes différentes sorties?

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 204
    • Voir le profil
    • Locoduino
Re : Un Arduino par module....ou pas.
« Réponse #40 le: février 20, 2015, 09:15:48 am »
Les connaissances viendront mais bon tu as quand même une base en parlant des Tmachin.

Je dirais que c'est encore un peu compliqué la donne que de mettre un autre CI. L'arduino peut gérer cela, et les connaissances apprises te serviront pour autre chose.
G.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Un Arduino par module....ou pas.
« Réponse #41 le: février 20, 2015, 09:25:19 am »
Le TLC5940 va juste te donner des PWM supplémentaires et 12 bits (de 0 à 4095) au lieu de 8 bits. Mais leur gestion restera identique aux PWM internes de l'Arduino.

Effectivement la LED s'allume et reste allumée tout le temps. Je regarde où je me suis trompé.
« Modifié: février 20, 2015, 10:05:06 am par Jean-Luc »
Cordialement

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Un Arduino par module....ou pas.
« Réponse #42 le: février 20, 2015, 10:07:24 am »
Plusieurs erreurs : il faut appeler temps() au lieu de millis() au début de gereEclairage :)

Ensuite mes comparaisons de temps ... c'était n'importe quoi  :o

Voici le code corrigé. J'ai laissé les print de debug et c'est accéléré 1000 fois :

const unsigned long dureeDuTick = 1;

const byte pinLedVerte = 3;

unsigned long temps()
{
    return millis()/dureeDuTick;
}

enum { ETEINT1, AUGMENTATION1, ALLUME1, DIMINUTION1, ETEINT2, AUGMENTATION2, ALLUME2, DIMINUTION2 };

struct eclairage {
  const byte pin; /* pin de PWM */
  byte etat;
  unsigned long duree;
  unsigned long dateChargementduree;
  unsigned long dateChargementIntervallePWM;
  unsigned long intervallePWM; /* nombre de ticks entre 2 changement de PWM */
  byte valeurPWM;
  const int dureeEteint1;
  const int dureeAugmentation1;
  const int dureeAllume1;
  const int dureeDiminution1;
  const int dureeEteint2;
  const int dureeAugmentation2;
  const int dureeAllume2;
  const int dureeDiminution2;
};

void afficheEtatEclairage(byte etat)
{
  switch (etat)
  {
    case ETEINT1:       Serial.print("ETEINT-1");       break;
    case AUGMENTATION1: Serial.print("AUGMENTATION-1"); break;
    case ALLUME1:       Serial.print("ALLUME-1");       break;
    case DIMINUTION1:   Serial.print("DIMINUTION-1");   break;
    case ETEINT2:       Serial.print("ETEINT-2");       break;
    case AUGMENTATION2: Serial.print("AUGMENTATION-2"); break;
    case ALLUME2:       Serial.print("ALLUME-2");       break;
    case DIMINUTION2:   Serial.print("DIMINUTION-2");   break;
    default:            Serial.print("etat inconnu");
  }
}

void afficheEclairage(struct eclairage& lumiere)
{
  Serial.print("date:"); Serial.print(temps()); Serial.print(", ");
  Serial.print(lumiere.pin); Serial.print(", "); afficheEtatEclairage(lumiere.etat); Serial.print(", ");
  Serial.print("duree="); Serial.print(lumiere.duree);
  Serial.print(", progression="); Serial.print(temps() - lumiere.dateChargementduree);
  Serial.println();
}

struct eclairage ledVerte = { pinLedVerte, ETEINT1, 25200, 0, 0, 0, 0, 30600, 7200, 0, 10800, 18000, 7200, 6400, 7200 };

void gereEclairage(struct eclairage& lumiere)
{
  unsigned long dateCourante = temps();
 
  switch (lumiere.etat) {
    case ETEINT1:
      if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
      {
        lumiere.dateChargementduree = dateCourante;
        lumiere.duree = lumiere.dureeAugmentation1;
        lumiere.etat = AUGMENTATION1;
        lumiere.valeurPWM = 0;
        lumiere.intervallePWM = lumiere.dureeAugmentation1 / 255;
        lumiere.dateChargementIntervallePWM = dateCourante;
      }
      break;
    case AUGMENTATION1:
      if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
      {
        lumiere.dateChargementduree = dateCourante;
        lumiere.duree = lumiere.dureeAllume1;
        lumiere.etat = ALLUME1;
        lumiere.valeurPWM = 255;
      }
      else if (dateCourante - lumiere.dateChargementIntervallePWM > lumiere.intervallePWM)
      {
        lumiere.dateChargementIntervallePWM = dateCourante;
        lumiere.valeurPWM++;
      }
      break;
    case ALLUME1:
      if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
      {
        lumiere.dateChargementduree = dateCourante;
        lumiere.duree = lumiere.dureeDiminution1;
        lumiere.etat = DIMINUTION1;
        lumiere.valeurPWM = 255;
        lumiere.intervallePWM = lumiere.dureeDiminution1 / 255;
        lumiere.dateChargementIntervallePWM = dateCourante;
      }
      break;
    case DIMINUTION1:
      if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
      {
        lumiere.dateChargementduree = dateCourante;
        lumiere.duree = lumiere.dureeEteint2;
        lumiere.etat = ETEINT2;
        lumiere.valeurPWM = 0;
      }
      else if (dateCourante - lumiere.dateChargementIntervallePWM > lumiere.intervallePWM)
      {
        lumiere.dateChargementIntervallePWM = dateCourante;
        lumiere.valeurPWM--;
      }
      break;
    case ETEINT2:
      if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
      {
        lumiere.dateChargementduree = dateCourante;
        lumiere.duree = lumiere.dureeAugmentation2;
        lumiere.etat = AUGMENTATION2;
        lumiere.valeurPWM = 0;
        lumiere.intervallePWM = lumiere.dureeAugmentation2 / 255;
        lumiere.dateChargementIntervallePWM = dateCourante;
      }
      break;
    case AUGMENTATION2:
      if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
      {
        lumiere.dateChargementduree = dateCourante;
        lumiere.duree = lumiere.dureeAllume2;
        lumiere.etat = ALLUME2;
        lumiere.valeurPWM = 255;
      }
      else if (dateCourante - lumiere.dateChargementIntervallePWM > lumiere.intervallePWM)
      {
        lumiere.dateChargementIntervallePWM = dateCourante;
        lumiere.valeurPWM++;
        analogWrite(lumiere.pin, lumiere.valeurPWM);
      }
      break;
    case ALLUME2:
      if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
      {
        lumiere.dateChargementduree = dateCourante;
        lumiere.duree = lumiere.dureeDiminution2;
        lumiere.etat = DIMINUTION2;
        lumiere.valeurPWM = 255;
        lumiere.intervallePWM = lumiere.dureeDiminution2 / 255;
        lumiere.dateChargementIntervallePWM = dateCourante;
      }
      break;
    case DIMINUTION2:
      if (dateCourante - lumiere.dateChargementduree > lumiere.duree)
      {
        lumiere.dateChargementduree = dateCourante;
        lumiere.duree = lumiere.dureeEteint1;
        lumiere.etat = ETEINT1;
        lumiere.valeurPWM = 0;
      }
      else if (dateCourante - lumiere.dateChargementIntervallePWM > lumiere.intervallePWM)
      {
        lumiere.dateChargementIntervallePWM = dateCourante;
        lumiere.valeurPWM--;
      }
      break;
  }
  analogWrite(lumiere.pin, lumiere.valeurPWM);
}

void setup() {
  Serial.begin(9600);
  afficheEclairage(ledVerte);
  pinMode(ledVerte.pin, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  gereEclairage(ledVerte);
 
  static unsigned long dateAff = 0;
  unsigned long date = millis();
  if (date - dateAff > 1000)
  {
    afficheEclairage(ledVerte);
    dateAff = date;
  }
}


Pour les autres lumières, il suffit de déclarer autant de variables de type struct eclairage qu'il y a de lumières avec les durées voulues dans l'initialisation de la struct et d'appeler gereEclairage pour chacune d'entre elles.
« Modifié: février 20, 2015, 10:14:03 am par Jean-Luc »
Cordialement

petitrain

  • Jr. Member
  • **
  • Messages: 86
    • Voir le profil
Re : Un Arduino par module....ou pas.
« Réponse #43 le: février 20, 2015, 01:52:13 pm »
Un grand merci.... Ca marche.... Je n'ai plus qu'a potasser le C pour comprendre comment tu as fait. Avant que j'arrive à faire ça moi-même, jamais je n'aurais imaginé qu'il faille se torturer ôtant les méninges pour faire le jour et la nuit...

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1691
    • Voir le profil
Re : Un Arduino par module....ou pas.
« Réponse #44 le: février 20, 2015, 02:50:27 pm »
La difficulté est de faire plusieurs choses simultanément. Un seul éclairage est très facile a faire  :)
Cordialement