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 fêtes de fin d'années obligent.
@+
Zoroastre.