Je cherche à "temporiser la valeur reçue d'un capteur". Je m'explique.
Imaginons un LDR dans une pièce noire, lumières éteintes. Si j'allume la lumière de la pièce, la valeur de mon LDR va brutalement varier de 0 à 100 par exemple.
J'essaye de trouver un moyen de rendre ce changement plus fluide, moins brutal.
J'ai pensé à un système d'incrémentation mais je ne sais pas comment l'exprimer en code.
Par exemple :
La valeur de mon LDR est 0
La lumière s'allume, le LDR passe à 100
Je créé une variable qui part de 0 vers la valeur actuelle de mon capteur de façon logarithmique dans un temps donné.
(C'est là ou je coince).
Ou peut-être y a t-il une autre façon de faire plus simple ?
Cheerhill:
Ou peut-être y a t-il une autre façon de faire plus simple ?
il y a une solution en faisant une moyenne tournante sur un certains nombres de mesures, la nouvelle mesure remplace la plus ancienne ... en prenant une puissance de 2 (2 4 8 16 ...) la moyenne est facile a faire (addition + décalage)
Si j'allume la lumière de la pièce, la valeur de mon LDR va brutalement varier de 0 à 100 par exemple.
J'essaye de trouver un moyen de rendre ce changement plus fluide, moins brutal.
Sans cahier des charges et un peu plus d'explications on n'y arrivera pas.
le capteur a ses caractéristiques de réponse, tu ne cherche pas à les modifier. Oui/Non ?
Tu veux que le résultat final passe par tous un certain nombre de niveaux intermédiaires entre mesure_1 et mesure_2 et que cela prenne un certain temps. Oui/Non ?
Si les réponses sont Oui il faut que tu définisse le nombre de niveaux intermédiaires et le temps d'établissement du nouveaux résultat de mesure. La suite sera de la programmation toute simple, une boucle for, ou while, devrait faire l'affaire.
Il y a aussi la possibilité de placer un "gros" condensateur aux bornes de la LDR mais la faisabilité dépendra du temps demandé. Défaut de la solution le temps de charge du condensateur ne sera pas constant il dépendra de la valeur résistive de la LDR.
Je vous remercie pour vos réponses et vais essayer d'être plus clair.
J'utilise un capteur de lumière pour créer des variations avec un synthétiseur. Lorsque l'on éteint la lumière la variation est très brutale. C'est pourquoi j'aimerais la rendre plus douce.
On allume la lumière : La valeur de mon LDR passe de 0 à 100( par exemple) subitement.
J'essaye de trouver un moyen par exemple pour que cette valeur passe à 100 en une seconde en passant par toutes les valeurs entre 0 et 100.
Sauf erreur de ma part, la proposition d'Alain46 permet de réaliser une transition linéaire, entre une valeur initiale et une valeur finale (= consigne).
C'est le plus simple à faire, mais aux extrémités le démarrage et l'arrêt sont brutaux.
Pour bien illustrer : si je fais par exemple un parallèle avec le déplacement physique d'un objet depuis un point A vers un point B, c'est comme si ce déplacement se faisait à vitesse constante entre A et B. Là où ce n'est pas réaliste, c'est qu'au démarrage on passe instantanément d'une vitesse nulle à une vitesse constante, et inversement à l'arrivée.
Le mouvement idéal part du point A avec une vitesse nulle, accélère progressivement jusqu'au milieu de la distance, puis ralentit progressivement jusqu'à s'arrêter en B.
Si tu veux une vraie transition douce, c'est ce type de trajectoire qu'il te faut modéliser.
Mathématiquement, si on raisonne en accélération constante, la courbe temporelle est basée sur des paraboles, tangentes en milieu de trajectoire.
Mais on peut aussi utiliser une sinusoïde, peut-être plus simple à mettre en oeuvre, avec un rendu très proche.
Dans les exemples associés à ma bibliothèque simpleLedRGB.h tu trouveras un exemple de gestion de transition douce basée sur une sinusoïde, simultanément sur les trois couleurs.
C'est l'exemple 3 fondu aléatoire.
alpha doit être compris entre 0 et 1. Toutes les variables sont de type float. alpha va déterminer le temps de réponse. Plus alpha sera petit plus on mettra de temps pour atteindre la valeur finale.
La solution de fdufnews convient parfaitement. La formule lisse très bien les résultats obtenus et empêche les "sautes" brusques en cas de parasites ou de changement brutaux de valeurs.
Une photo du résultat de mon "poor man's oscilloscope".