comment ignorer les mesures erronées du capteur ultrason HC-SR04

Bonjour avec un code simple qui allume 3 leds suivant les distances mesurées avec un capteur ultrason HC-SR04 j'ai occasionnellement des mesures complètement erronées et donc les leds s'allument ou pas. Pourriez-vous m'aider à modifier le code afin d'ignorer ces mesures quand elles sont hors normes?
Le code est en fichier attaché.
Merci pour votre aide

ArduinoUltraSonenclenchLEDs.ino (2.36 KB)

Bonsoir
Il y a plusieurs solutions pour éliminer les mesures hors norme.
La premiere sans trop se casser la tête est de faire un nombre élevé de mesures et de faire sa moyenne.

Une plus elegant, est aussi de faire un certain nombre de mesures, les stoker en mémoire, les trier par ordre croissant ou décroissant et utiliser la mesure au centre du lot.

Je ne sais pas si c'est clair.

Bonsoir,

Il faudrait définir ce que tu considère comme hors norme.

Sinon pour continuer dans ce qui est proposé juste avant, un échantillonnage de mesure, tu élimines la plus grande valeur, la plus petite et tu moyennes sur le reste

Merci pour votre aide, lescarros pourrais-tu me donner un exemple de code en stockant un certains nombre de valeurs svp?
Jambe exemple d'une valeur hors norme un objet est à 50cm pendant plusieurs mesures puis une seule valeur apparait dans la console série qui est de 150cm puis les mesures suivantes on revient à 50cm???
Merci pour votre aide

Plus complexe mais plus efficace est l'utilisation des écarts types.

Si tu es intéressé :
Tu stockes les mesures dans un tableau de taille X
A chaque nouvelle mesure il faut libérer de la place dans le tableau, pour ce faire tu décales toutes les anciennes mesures ce qui éliminera la plus ancienne.
Tu calcules dans l'ordre la moyenne et l'écart type.
Tu élimines les mesures éloignées de plus de +/- 3 écarts type de la moyenne --> ce sont les mesures erronnées.
Tu recalcules la moyenne avec les mesures conservées et c'est fini.

Je ne peux pas expliquer ici ce qu'est un écart type. Il existe de la bonne litérature dessus.
Ce n'est pas bien compliqué pour exploiter la notion d'écart type, il faut simplement avoir du temps à consacrer à l'apprentissage. Une fois que la notion est acquise elle peut être simplement réutilisée avec profit.

Félicitations 68tjs la formule de l'écart type est en attaché et effectivement c'est nettement plus complexe. Certainement plus juste aussi.
Mais pour mettre cette formule en œuvre avec arduino je ne suis pas encore assez for ;). :frowning:

FormuleEcartTyp.jpg

Edit jfs : ajout de l'image dans le message

Si ça peut aider :

https://forum.arduino.cc/index.php?topic=50134.0

Tu as trouvé la présentation la plus horrible de la formule.

Je fais une autre présentation de la marche à suivre :

On a par exemple 10 mesures, chaque mesure est identifiée par mesure(i), i variant de 1 à 10.

  1. on calcule la valeur moyenne M = (somme de toute les mesure) / (nombre de mesures)
  2. pour chaque point de mesure on calcule "la distance" à la valeur moyenne: d(i) = mesure(i) - moyenne.
    Comme les points sont soit supérieurs soit inférieurs à la valeur moyenne on prend le carré de d(i).
  3. on fait la somme de tous les carrés des distances
  4. on divise cette somme par le nombre de mesure et on prend la racine carrée du résultat.

Exemple
M(1) = 4,5
M(2) = 4,4
M(3) = 4,8
M(4) = 4,6
M(5) = 30
Moyenne M = (4,5 + 4,4 + 4,8 + 4,6 + 30)/5 =9,66

Calcul des carrés des distances :
M(1) -> (4,5 - 9,66)2 = 26,62
M(2) -> (4,4 - 9,66)2 = 27,66
M(3) -> (4,8 - 9,66)2 = 23,61
M(4) -> (4,6 - 9,66)2 = 25,60
M(5) -> (30 - 9,66)2 = 413,7
Somme = 517,2

Écart type = Racine (517,2 / 5) = 10,17

Travail du développeur : adaptation à l'application réelle.
La règle des 3 écarts type n'est pas une règle absolue, le chiffre de 3 est à adapter par le développeur car c'est lui seul qui connaît comment réagi sa création.
Avec les chiffres de l'exemple choisi il est clair que 3 n'est le bon chiffre et qu'il faut éliminer les mesures supérieures à 2 écarts type.
Face à des phénomènes aléatoires comme ceux que tu relates un bon moyen de procéder est d'accumuler des mesures soit par l’intermédiaire de serialPrint soit par accumulation sur une carte SD.
Tous les calculs que j'ai fait à la main sont faisables automatiquement dans un tableur qui sait calculer moyenne, médiane, écart-type etc.

Une fois cette analyse effectuée le développeur doit choisir la façon de parvenir à ses fins.
La méthode que j'ai indiqué est capable de s'adapter à n'importe quelle situation et si je l'ai développé c'est que je pense qu'il est utile de la connaître, mais il faut toujours se poser la question :
N'y a-t-il pas un moyen plus simple ?
N'est-ce pas utiliser un marteau-pilon pour enfoncer une punaise ?
Tu a reçu plusieurs propositions, à toi de choisir celle qui est le mieux adaptées à ton besoin.

Astuce :
J'ai parlé de moyenne et de médiane. La médiane c'est le nombre tel qu'il y a autant de mesures inférieures que de mesure supérieures.
Si la médiane est égale ou très proche de la moyenne c'est le signe qu'il n'y a pas de mesures "débiles".
Dans le cas contraire c'est la preuve de l’existence de mesures manifestement fausses.

Important :
Masquer des mauvais fonctionnements matériels pour du traitement logiciel est une solution, l'autre solution est de chercher à comprendre l'origine des mauvais fonctionnement matériel et d'y remédier.