Utilisation fonction millis

Bonjour,

J'essaie de me familiariser avec la fonction millis histoire de ne pas utiliser la fonction delay mais je galère un peu.

 cloudlong = random(2000, 5000);
intercloud = random(10000, 15000);
cloudmoded = 0,5;
  
  
   fade = 3000; 

 tempsactuel = millis();
 if (tempsactuel - tempsprecedent <= fade) 
   {
   
    cloudmod = map((millis()), tempsprecedent, tempsprecedent + fade, 1, cloudmoded);
    
   }
 if ((tempsactuel - tempsprecedent > fade) && (tempsactuel - tempsprecedent <= fade + cloudlong)) 
   {
    cloudmod = cloudmoded;
   
   }  
   
  
 if ((tempsactuel - tempsprecedent > fade + cloudlong) && (tempsactuel - tempsprecedent <= fade + cloudlong +fade)) 
   {
    cloudmod = map((millis()), tempsprecedent + fade + cloudlong, tempsprecedent + fade + cloudlong + fade, cloudmoded, 1);
   } 
 if (tempsactuel - tempsprecedent > fade + cloudlong + fade + intercloud)
   {
 
    tempsprecedent = tempsactuel;
   } 
  

  
  ledlevel = cloudmod * ledmax;

Le but est de jouer sur la valeur de pondération cloudmod avec un effet de fade via la fonction map. SI quelqu'un passe dans le coin et peut m'aider ?

Merci d'avance.

Yep!

What is the problem ??

Je veux bien t'aider mais ton code est imbuvale en l'état. Procedons par étape si tu le veux bien.

Tu veux "mappé" millis() entre 0.5 et 1 par rapport aux périodes précedentes ???

@+

Zoroastre.

Désolé c'est vrai que je ne code pas depuis longtemps donc j'ai encore un peu de mal a optimiser ce que je fais :slight_smile:

En fait je veux simuler le passage de nuages au niveau de ma rampe d'aquarium. Ma sortie pwm est réglée sur une valeur disons Ledmax et je cherche a diminuer légèrement cette valeur avec un fade en entré et en sortie.

Sachant que la durée de cette diminution devra être aléatoire (cloudlong) et que l'intervalle entre les diminution devra également être aléatoire (intercloud) et que si possible le fade le serait aussi.

Je pensais donc créer une valeur ledmod qui serait une pondération de ledmax, par exemple ledmod = 0,5*Ledmax. Et jouer sur la pondération pour créer l'effet de fade.

Utiliser la fonction millis me permettrai de ne pas "bloquer" l'arduino pendant les "nuages" en utilisant delay.

Il existe surement d'autre manière d'y arriver mais je n'ai pas encore trouvé comment :stuck_out_tongue:

Yep!

Voici la réponse que j'obtiens avec ton code (remanié) et un delais de 500 ms pour avoir une lecture plus souple.

255.00
255.00
255.00
255.00
255.00
255.00
127.50
127.50
127.50
127.50
127.50
127.50
127.50
0.00
127.50
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
255.00
255.00
255.00
255.00
255.00
127.50
127.50
127.50
127.50
127.50
127.50
0.00
0.00
0.00
127.50
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00

Comme tu peux le constater, la réponse est soit de 100%, 50% ou 0% de ledmax. L'ecart de 0.5 à 1 est trop faible.
Si on place l'ecart entre 0.5 et 100 :

25500.00
21420.00
17085.00
12750.00
8415.00
4080.00
127.50
127.50
127.50
127.50
127.50
127.50
127.50
12750.00
127.50
21165.00
22185.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
21420.00
17085.00
12750.00
8415.00
25500.00
21420.00
17085.00
12750.00
8415.00
4080.00
127.50
127.50
127.50
127.50
127.50
127.50
127.50
12750.00
127.50
21165.00
22185.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
6885.00
21420.00
17085.00
12750.00
8415.00

Ici le resultat se rapproche de tes desideratas il me semble, mais la fonction 'random' a peu d'influence sur ledlevel, le cycle est constant.

Voici le code du deuxième cas, il te servira de base pour repartir.

#define fade 3000

unsigned long tempsactuel, tempsprecedent;
float cloudmod, cloudmoded = 0.5;
float ledlevel, ledmax = 255;

void setup() {
  Serial.begin(9600);
}

void loop() {

unsigned long cloudlong = random(2000, 5000);
unsigned long intercloud = random(10000, 15000);

tempsactuel = millis();
   /* diff temps <= 3sec */
   if ((tempsactuel-tempsprecedent) <= fade) {
    cloudmod = map(tempsactuel, tempsprecedent, tempsprecedent + fade, 100, cloudmoded);
   }
   /* diff temps > 3sec && diff temps <= 3sec + {2<x<5} */
   if ((tempsactuel - tempsprecedent > fade) && (tempsactuel - tempsprecedent <= fade + cloudlong)) {
    cloudmod = cloudmoded;
   }
   /* diff temps > 3sec + {2<x<5} && diff temps < 6sec + {2<x<5} */
   if ((tempsactuel - tempsprecedent > fade + cloudlong) && (tempsactuel - tempsprecedent <= fade + cloudlong +fade)) {
    cloudmod = map(tempsactuel, tempsprecedent + fade + cloudlong, tempsprecedent + fade + cloudlong + fade, cloudmoded, 100);
   }
   /* diff temps > 3sec + {2<x<5} + 3sec + {10<x<15} */
   if (tempsactuel - tempsprecedent > fade + cloudlong + fade + intercloud) {
    tempsprecedent = tempsactuel;
   }
   
ledlevel = cloudmod * ledmax;
delay(500);
Serial.println(ledlevel);

}

Remarque :
millis() est une valeur croissante de type long, le unsigned devant te permet de développer l'amplitude des valeurs long au strict positif (de 0 à 4,294,967,295).
Il serait bon de redefinir certaines variables pour faciliter la lecture des boucles conditionnelles, par exemple :

unsigned long periode1 = fade + cloudlong;
unsigned long periode2 = tempsprecedent + fade + cloudlong;

C'est juste un avis. Des fois on choisit une forme litterale de la pensée, des fois on reduit au formalisme.

Dernière chose, mapper des valeurs trés grande vers de trés petite semble peu resultant. Comme millis() et les variables qui en découlent vont assurement grandir de manière importante, il te faudra soit choisir un nombre de reference conséquent et le réduire par palier pour obternir une valeur pwm, soit opter pour une autre startégie. Les valeurs flottantes (entre 0.5 et 1) qui peuvent contenir plein plein de chiffres loin loin aprés la virgule sont à proscrire.

Je vais y songer, entre deux coupes de champagnes :wink: fêtes de fin d'années obligent.

@+

Zoroastre.

Merci beaucoup pour ton aide. Je vais essayer de repartir avec cette base :slight_smile: