Moyenne glissante du pauvre ou Oversampling ?

Rédigé par guiguid Aucun commentaire
Classé dans : Electronique Mots clés : aucun

La valeur brute de capteur est rarement utilisée telle quelle.
Souvent, elle doit être filtrée, afin d'enlever les perturbations
Mais on peut aussi vouloir mesurer la variation de cette valeur au cours du temps
Voir améliorer la précision de la valeur du capteur.

Traitement des valeurs Brutes des capteurs

Souvent la valeur brute d'un capteur doit être traitée avant utilisation.

Le traitement le plus utilisé est le lissage de type moyenne glissante. Le principe est de réaliser une moyenne des n dernières valeurs.

Dans l'embarqué, nous ne disposons pas de grande quantité de RAM, ni d'une puissance de calcul illimité. Il est donc hors de question de calculer la moyenne des n dernières valeurs lors d'interruption ou a une fréquence élevée.

Du coup on utilise la moyenne mobile exponentielle bien moins gourmande en ressource. Il ne faut pas perdre de vue qu'il ne s'agit pas ici de réaliser une moyenne mathématique, mais de filtrer un signal.

Méthodologie :

  • définition du nombre n = le nombre des dernières valeurs à prendre en compte.
  • calcul du alpha = 2 / (n+1)

Le calcul se résume maintenant à Moyenne actuelle = Dernière Moyenne + ((nouvelle valeur - Dernière Moyenne) * alpha)

C'est super rapide, car cela ne nécessite que 3 calculs et aucune variables autre que la valeur de la Moyenne et alpha !

Bonus

Si votre capteur est assez stable, vous vous demandez à quoi cela pourra bien vous servir tout cela ?

Oversampling

Imaginons que votre process prenne la valeur d'un capteur de température toutes les minutes pour prendre des décisions comme une régulation de température. Ce capteur a une résolution de 0.5°C. Hors pour votre process c'est une peut juste, idéalement vous aimeriez réagir dès 0.1°C.

La technique utilisée est de réaliser 10 acquisitions de la température de votre capteur durant cette minute et d'en faire une moyenne. Oui, mais une moyenne exponentielle serait mieux (les dernières valeurs ont surement plus significatives !)

Donc, en réalisant une acquisition toutes les 6 secondes, et en faisant une EMA sur les 10 dernières valeurs, on augmente (artificiellement) la précision de notre mesure de x10 [1]!

Détection de variation

Imaginons un process qui doit réagir à une variation. En utilisant une seconde EMA avec une durée bien plus grande, on est capable de détecter des variations (plus rapide que la durée de la plus grande EMA) Exemple :

  • Mon capteur donne une valeur brute toutes les 10 secondes
  • J'ai une première EMA @ 6 valeurs afin d'avoir une valeur utilisable toutes les minutes
  • J'ai une deuxième EMA @ 60 valeurs afin d'avoir une valeur avec un retard (et la moyenne (expo) de la dernière heure).
  • La variation est l'EMA@6 - EMA@60.

Exemple d'utilisations

Oversampling (ESPHome pour HomeAssistant)

J'ai utilisé cette technique dans mon Upgrade de radiateur Wifi

- platform: template
    name: "Temp SdJ"
    id: tempsdjf5m
    lambda: |- 
      return id(tempsdj).state; 
    update_interval: 10s
    unit_of_measurement: "°C"
    accuracy_decimals: 2
    filters:
    - exponential_moving_average:
        # a = 2/ (5+1) = 0.33
        alpha: 0.33
        send_every: 1
La résolution passe artificiellement de 0.0625°C à 0.0125°C

Variations (ESPHome pour HomeAssistant)

- platform: dht
    pin: D3
    model: AM2302
    temperature:
      name: "VMC Temperature Interieure"
      id: tempint
    humidity:
      name: "VMC Humidite Interieure"
      id: vmc_humint
    update_interval: 60s
   
  - platform: template
    name: "VMC humidite Filtree"
    unit_of_measurement: "%"
    id: vmc_filtred_hr
    icon: "mdi:water-percent"
    accuracy_decimals: 1
    lambda: |-
      return id(vmc_humint).state;
    update_interval: 60s
    filters:
    - sliding_window_moving_average:
        window_size: 60
        send_every: 1
    on_raw_value:
      - then:
          lambda: |-
            if ((x - id(vmc_filtred_hr).state) > 5) {
              id(vmc_gv).publish_state(true);  
            }
            if (x < id(vmc_filtred_hr).state) {
               id(vmc_gv).publish_state(false);

On a une valeur brute du capteur d'humidité toutes les 60 secondes : vmc_humint
Celle-ci est la valeur qui entre dans le template "VMC humidite Filtree".
Une moyenne sur 60 valeurs est réalisée. Et toutes les minutes, on compare la valeur "x" (valeur brute) à l'ancienne moyenne contenue dans la template "VMC humidite Filtree", puis on agit en fonction.

 

[1] (pour les puristes je vous laisse calculer exactement)

Écrire un commentaire

Quelle est la première lettre du mot jfnhb ?

Fil RSS des commentaires de cet article