Capteur analogique non lineaire

Si un jour, j’aurais cru que mes cours de math pouvaient servir à l’IPX…

1 « J'aime »

application à un capteur 20 à 150 cm :

@Lbveao : je pense que vous avez ce type de courbe (ci-dessous) ?

courbe du fabricant (Tension de sortie en fonction de la distance):
image
on pourrait déterminer une parabole se superposant à la courbe pour D compris dans l’intervalle [20 ; 150]
image

Relevé de 3 points sur la courbe du fabricant (comme je cherche D en fonction de T, j’inverse abcisse et ordonnée. Je note les points sous la forme Q(Tension ; Distance) :
M ( 2.5 ; 20)
N ( 1.5 ; 40)
P ( 0.5 ; 140)

L’outil de détermination d’équation renvoie
D = 40 T ² -180 T + 220

Il ne reste plus qu’à écrire le javascript d’un Widget qui va appliquer cette formule à une entrée analogique de type « Volt » sur laquelle sera connecté le détecteur IR.
Vu qu’on ne dépasse pas 3.3V dans notre exemple, pas besoin de pont diviseur.

Il est à noter que si l'objet se rapproche à moins de 20 cm du capteur,
il y aura calcul d'une distance erronée. 
Exemple, si nous approchons l'objet à 10 cm, la formule renvoie
D=(40 * 2.3²) - (180 * 2.3) + 220
D=17.6 cm

D’autre part, étant donné que la distance se calcule en fonction du carré de la tension, la moindre imprécision dans le relevé des 3 points prend vite des proportions conséquentes.
Je vous conseille d’agrandir les graphiques constructeurs et de travailler sur du papier millimétré. La règle de 3 sera utilisée pour déterminer des valeurs entre 2 graduations d’axe.

cdt

4 « J'aime »

A l’usage, il n’est pas vraiment aisé de faire superposer une parabole à une courbe quelconque.
Il faut faire plusieurs relevés de points, déterminer l’équation correspondante et tracer la fonction afin de vérifier le résultat, et recommencer avec 3 autres points si non satisfaisant. Ça reste une démarche faisable mais assez longue.
Il faudra forcément accepter des marges d’erreurs.

l’équation donnée ci-dessus donne de mauvais résultats au delà de 110 cm.

Il reste pour plus de fiabilité, la solution du tableau de valeurs, avec un script comme évoqué dans les messages plus haut

Merci a tous pour ces réponses très fournies.
Effectivement c’est le capteur en ma possession. Je voudrait l’utiliser pour mesurer le niveau d’eau dans des cuves, La précision n’est pas primordiale.
Je reviendrais vers vous pour les resultats.

Encore merci

Laurent

Bonjour,

si c’est pour une utilisation dans une cuve, je crains que les rebonds des rayons infrarouges sur les parois ne perturbent la lecture. Ces capteurs ont en général un faisceau assez large, et des contraintes de pose (hauteur, angle).
Il existe peut-être des solutions plus adaptées pour cette fonction, avez-vous parcouru ce sujet ?

les formules de votre capteur sont
image

image

j’ai fait un tuto ici.

2 « J'aime »

Bonjour,

j’ai rédigé le WIKI qui reprend ce tuto.

Ultérieurement, je le complèterai avec le paramétrage de l’IPX800 V4 pour ce capteur SHARP.

http://gce-electronics.com/wiki/index.php?title=Déterminer_l'équation_d'un_Capteur_analogique

cdt

EDIT : Nouveau lien
https://gce.ovh/wiki/index.php?title=Déterminer_l'équation_d'un_Capteur_analogique

3 « J'aime »

@Fred60 : Plus qu’à trouver à quoi pourrait bien servir … un compas !
La flûte aussi me parait bien inutile mais c’est un autre sujet :smile:

2 « J'aime »

bonjour,
J’ai ajouté l’utilisation du capteur Sharp vu plus haut dans le WIKI. Vous y trouverez également le code javascript.

http://gce-electronics.com/wiki/index.php?title=Le_capteur_de_distance_Sharp_GP2Y0A

SharpGP2Y0A

Nouveau lien suite à la panne OVH :
Le capteur de distance Sharp GP2Y0A — GCE Electronics
cdt

3 « J'aime »

Merci beaucoup pour ce travail impeccable.

Pour prolonger la durée de vie du capteur, on pourrait faire passer son fil d’alimentation par une sortie de l’IPX.
Ainsi, le capteur ne serait alimenté que sur demande, pour faire une mesure. Il est également possible d’ajouter un petit poussoir au plus près, pour une commande locale, et une EV, pour une commande distante (dashboard).

Super boulot ! Y a plus de limite avec cette machine. Hormis l’imagination et de la matière grise…

Tuto terminé avec l’ajout de la possibilité d’activation permanente/temporaire ou désactivation du capteur.

image

2 « J'aime »

Bonjour,

très intéressante l’animation du cercle.
Je vois une autre application avec les détecteurs de présence Enocean qui fonctionne en entrée analogique enocean.
Exemple: sur la variable enoA7 , le cercle est vert si enoA7 <10 (non détection) , le cercle est rouge si enoA7 >200 (détection).
Le pb sur détection la valeur >200 est furtive.
Il faudrait peux être passer par une sortie virtuelle dans un scénario (ta/tb)
Exemple: le cercle est vert si SV = 0 (non détection) , le cercle est rouge si SV =1 (détection).
Merci et cordialement

1 « J'aime »

Bonjour,

oui, c’est faisable.
Mais le widget fonctionnant sur datasource, le temps de rafraichissement est bien plus long que pour une jauge analogique. Il faudra régler le Tb de la sortie virtuelle tel qu’il soit supérieur au refresh.

bonne idée.

cdt

Bonjour,

j’ai réglé le Tb à 1 mn pour ne pas être pollué par chaque passage devant le capteur.
En utilisant une Sortie virtuelle cela simplifie beaucoup le script initial.
La SV est activée, dans un scénario, par les seuils haut et bas du capteur de présence Enocean.

SV=1 cercle rouge
SV=0 cercle vert

Merci et cdlt

peux tu partager ton code ?

je suis désolé, je ne sais pas programmer.

je pensais que tu avais écrit le code pour avoir un cercle rouge.

voilà le code :wink:
il est basé sur Status.xml

function bruteToDistance(brute) {
  d = Math.floor(63.37 * Math.pow(brute * 0.000050354,-1.143));
    
    if (d < 20 || d > 150) {
        return "";
    }else{
        return d + " cm";
    }
}

var distance = bruteToDistance(datasources["STATUS"]["response"]["analog0"]);
//modifiez Vout5 par la sortie virtuelle utilisée pour mémoriser un passage
var passage = datasources["STATUS"]["response"]["vout5"];
// l'activité du capteur est récupérée avec l'état de relais 1
//en fonction de l'état, l'animation sera rendue non visible (active mais couleur du fond), sinon verte
var SharpCouleur = (datasources["STATUS"]["response"]["led0"]==0) ? "#333" : (passage==1) ? "#f00" : "#3C14";

return `
<style>
.content {
  position: absolute;
  bottom: 0;
  left: 0;
  height: 100%;
  width: 100%;
  background-color: #333;
  overflow: hidden;
}

.circle {
  width: 5px;
  height: 5px;
  background-color: transparent;
  position: absolute;
  left: 50%;
  margin-left: -2px;
  top: 50%;
  margin-top: -2.0px;
  border-radius: 50%;
border: 2px solid ${SharpCouleur};
  animation: radar 0.6s infinite;
  -webkit-animation: radar 0.6s infinite;
  -webkit-transition: all ease-in-out;
  transition: all ease-in;
}
@keyframes radar {
  1% {
    width: 5px;
    height: 5px;
    margin-left: 0;
    margin-top: 0px;
border: 2px solid ${SharpCouleur};
    opcity:0.9
  }
  100% {
    width: 300px;
    height: 300px;
    margin-left: -150px;
    margin-top: -150px;
border: 12px solid ${SharpCouleur};
    opacity:0.0;
    
  }
}

</style>

<center>
  <div class="content" height=100%> <div valign=middle style="color:#fff;font-size: 20px;"> ${distance}</div> <div class="circle">
  </div>

</div>
</center>
`;
2 « J'aime »