Note : quelques corrections et compléments d’informations ont été apportés suite aux remarques de @fgtoul.
Nouvelle modification le 16/12 pour supprimer la procédure de mise à jour par preset, apportant une complexité non nécessaire.
Contexte
Suite à la lecture du post Capteurs de Niveau, j’ai acheté deux capteurs de niveau : un pour mesurer le niveau de la nappe phréatique, l’autre pour mesurer le niveau dans une cuve. La sonde mesure un niveau de liquide jusqu’à 2 m avec une précision théorique de 0,5% soit de 1 cm.
Le résultat des mesures, s’il est globalement correct sur sa valeur moyenne, fluctue pas mal d’une mesure à l’autre. L’amplitude de la variation va jusqu’à 1 cm, de part et d’autre de sa valeur moyenne, pour la sonde de mesure du niveau de la nappe phréatique,. Cela est peut être lié à la l’angle d’inclinaison de 45° qui ne peut être respecté.
Mon besoin
Mon sous-sol est protégé depuis 25 ans des montées de niveau de la nappe par un drain remplissant une cuve de 2500l qui est automatiquement vidée par une pompe, plusieurs fois par jour en période critique. Le niveau de la cuve est maintenu en dessous de 1300 litres pour avoir le temps d’intervenir en cas de défaillance. En période critique, la pompe est physiquement descendue au niveau 500 litres. Une alerte est générée lorsque la pompe est déclenchée (sonde tore + x400CT). Le but de la sonde de la cuve est de vérifier le bon fonctionnement de la pompe et la variation de niveau dans la cuve.
Le niveau de la nappe phréatique est mémorisé tous les jours et doit générer une pré-alerte en début période critique, avant que l’ensemble cuve-pompe se mettre en fonction. En période critique, il permet de vérifier qu’elle est la tendance et la hauteur par rapport au sous-sol. La variation est en règle générale de 1 à 2 cm par jour. La fluctuation importante de la sonde rend illisible la tendance, d’où le besoin d’un lissage important.
Fonction de lissage
Pour lisser la mesure, il est possible d’utiliser l’objet fonction pour ajouter à la mesure temps réel, la moyenne des mesures précédentes. Un ratio permet de pondérer l’impact de cet ajout. La moyenne des mesures précédentes est donnée par la variable de sortie Result de la fonction.
Formula = (x+((ratio)*$ResultId$))/ratio+1
Si par exemple, ratio= 10, Formula = (x+(10*$ResultId$))/11
L’exécution de cette formule est cadencée par la sortie d’un clignotant appliqué sur l’entrée Enable de la fonction.
A l’initialisation, la sortie Result est à 0 et affichera la bonne valeur après que le clignotant aura été exécuté un nombre de fois égal au ratio .
Un ratio important permet de lisser fortement la mesure au détriment, bien sûr, de la réactivité. Pour la mesure du niveau de la nappe phréatique, un ratio de 100 semble convenir. Par contre, pour la mesure du volume d’eau de la cuve, un ratio de 10 permet de ne pas trop lisser le résultat et voir le résultat du vidage par la pompe sans trop de délai.
La variable Result doit être réglée avec la précision la plus grande possible, c’est-à-dire avec le plus grand nombre de décimales possible, surtout si le ratio est grand. En effet, dans l’ipx, une valeur n’est pas arrondie à la valeur de la dernière décimale la plus proche mais est simplement tronquée à la dernière décimale. En d’autres termes, 1,19999 n’est pas arrondie à 1,2 mais à 1,1. Dans notre cas, cette erreur sur la variable Result est multipliée par le ratio et la valeur en sortie est minorée par rapport à la véritable valeur.
Mise en œuvre
Pour la sonde cuve
- La valeur à filtrer (Result de Remplissage cuve) est reliée à l’input(x) de la fonction de lissage (lien 59)
- La sortie d’un clignotant 30 secondes est reliée à l’entrée de Enable de la fonction de filtrage (lien 57). Ce même clignotant est utilisé par les deux filtrages.
- La formule est :
Pour la sonde nappe phréatique
En utilisant le ratio de 100, la valeur Résult ne sera obtenue qu’à l’issue de 100 cadence du clignotant de 30 secondes. Lors de l’initialisation, pour ne pas partir de la valeur 0 mais de la valeur de l’input x, et réduire le temps de convergence, il est possible de faire un copier/coller de la valeur de l’input(x) dans la variable Result.
Mesures
On note l’efficacité du filtrage, très visible sur le niveau de la nappe phréatique et le comportement en cas de variation rapide sur le niveau de la cuve, liée au déclenchement de la pompe : des paliers de 30s liées à la cadence du clignotant et délai de réaction.
Compléments suite aux doutes de @gftoul
La fonction se comporte comme un réseau capacitaire RC placé aux bornes de la variable input :
Le niveau 95% du signal d’entrée est obtenu après environ un nombre de cadences du clignotant égal au ratio.
Ces deux courbes permettent de comprendre pourquoi, après une montée très progressive du niveau dans la cuve, le filtrage ne gomme pas la descente.
L’option de resynchronisation via l’objet preset, que j’avais envisagé, ne me semble pas pertinent, voire contre productif puisque le niveau moyen, dans le cas d’un ratio important, prendra du temps à être rétabli ; alors qu’il n’y a pas lieu de le perturber.
Dans le cas de la cuve, il est à noter que le lissage ne minimise pas le niveau réel, il se contente d’afficher la valeur moyenne. Grace au filtre il est possible, lors de la montée et en regardant la valeur filtrée, de vérifier que le niveau monte alors qu’en regardant la valeur réelle, il est impossible de savoir si le niveau monte ou descend.
Il est vrai que le lissage génère une inertie puisque c’est le principe même de son fonctionnement. On ne peut pas avoir de l’inertie et de la réactivité. Tout est dans le dosage et dans la bonne évaluation du besoin que l’on veut traiter.
Pour la sonde de la nappe phréatique, il est nécessaire d’avoir un lissage important qui est un peu exceptionnel : fluctuation quasi hors norme avec inertie de quelques heures, où l’appréciation de la tendance est aussi importante que la valeur en elle-même. Pour les besoins courant, un ratio de 10 à 20 semble plus adapté.
Bonne journée