[Résolu] Recherche de Min/Max ...glissante !

Salut tout le monde,

Dans le cadre de mon futur projet aquaponique, j’effectue des relevés de température de l’eau.

Comme je ne serais pas devant en permanence, j’effectue une moyenne glissante sur les X dernières heures ainsi qu’une recherche de minimum/maximum .

Jusqu’à maintenant je remettais “à zéro” mon min et mon max dès que l’index de mon tableau gérant l’ajout des valeurs de ma moyenne glissante revenait à zéro .

Sauf que cela ne me convient pas car je n’ai pas réellement (même pas du tout) les minimum/maximum des dernières X heures …

Et là je bloque, je ne trouve pas la logique pour le faire … j’imagine qu’il faut jongler avec les indices de tableau mais je sèche … :-*

Le code de la moyenne glissante (copié/collé de l’exemple Smoothing d’Arduino) :
Je l’ai un peu modifié pour commencer le calcul de moyenne avant d’avoir obtenu les valeurs nécessaires pour faire la moyenne glissante sur X heures d’où le flag TOP_AVERAGE)

// Acquisition de la température temp1
// Recherche min max
// Faites juste avant 

  if (AVERAGE == true) {  
    
    total = total - readings[readIndex];
    readings[readIndex] = temp1;
    total = total + readings[readIndex];
    readIndex = readIndex + 1;

    if ((TOPAVERAGE == true)) {average = total / readIndex;    }
    
    if (readIndex >= numReadings) {
      readIndex = 0; TOPAVERAGE = false;
      minT= 99;
      maxT = -9;
    }

    if (TOPAVERAGE == false) {average = total / numReadings;    }

    AVERAGE = false;
    top_Average = t1;

        if (SERIE == true) {
      Serial.print(temp1);
      Serial.print(" ");
      Serial.print(readIndex);
      Serial.print(" ");
      Serial.print(total, 4);
      Serial.print(" ");
      Serial.println(average,4);

    }
 }

Le code de ma fonction de recherche Min/Max :

void minmax(float t)
{
  if (t >= maxT) {
    maxT = t;
    max_h = heureRTC;
    max_m = minuteRTC;
  }
  if (t <= minT) {
    minT = t;
    min_h = heureRTC;
    min_m = minuteRTC;
  }
}

Sachant que je ne recherche pas de code mais plutôt la logique à avoir :smiley: !

J’utilise aussi un module RTC si ça peut aider …

D’avance , merci :wink:

Je crois avoir trouver ... plutôt simplement .. il suffit que je fasse ma recherche de min/max sur mon tableau de ma moyenne glissante en fait .. Qqun confirme ?

Je confirme, c'est justement ce que j'étais en train d'écrire lorsque tu as posté

Merci !

Je suis entrain de tester ça.

Parcontre je complète la moyenne toutes les minutes , et je veux un recul sur 18h , tout ça avec des float ..le tableau prend pas mal de place niveau mémoire , je vais voir pour passer par un tableau d' integer (en multipliant par 100).

Bonjour,

Afin de limiter la taille du tableau des enregistrements, il peut être intéressant de limiter les nouvelles entrées aux changements de température si celles-ci sont limitées.

En horodatant chaque changement de température (uint_32 contenant le temps epoch) , vous pourrez garder une trace de l'évolution de celle-ci pour les calculs des valeurs maxi et mini.

Attention néanmoins de prévoir la suppression des transitions par toujours nettes entre 2 températures (hystérésis, validation de la nouvelle température après n mesures consécutives identiques,...).

La taille du tableau de données dépendra donc de l'évolution de la température durant la période des 18 heures.

Bon c’est réglé !

Quelques soucis entre le passage à la moyenne normale et celui à la glissante , mais c’est bon .
J’ai rajouté l’heure du dernier max/min donc ajout d’un autre tableau… j’aurai peut être pu faire un tableau à 2 entrées !?

Je mets le bout de code à adapter si ça peut servir à d’autres …

void minmax()
{

  if(TOPAVERAGE == true)
  {
  if (temp1 >= maxT) {
    maxT = temp1;
    max_h = heureRTC;
    max_m = minuteRTC;
  }
  if (temp1 <= minT) {
    minT = temp1;
    min_h = heureRTC;
    min_m = minuteRTC;
  }
  }

  if(TOPAVERAGE == false)
  {
    maxT = -90;
    minT = 99;

    
    for(int i=0;i<numReadings;i++)
    {
      readings[i] = readings[i]/100;
      
     if (readings[i] >= maxT) {
    maxT = readings[i];
    MINI = false;
    test = i;
    formatheure(minmaxHeure[i]);
  }
  if (readings[i] <= minT) {
    minT = readings[i];
    MINI = true;
    formatheure(minmaxHeure[i]);
     }
    }
  }
}

Zlika:
Bonjour,

Afin de limiter la taille du tableau des enregistrements, il peut être intéressant de limiter les nouvelles entrées aux changements de température si celles-ci sont limitées.

En horodatant chaque changement de température (uint_32 contenant le temps epoch) , vous pourrez garder une trace de l'évolution de celle-ci pour les calculs des valeurs maxi et mini.

Attention néanmoins de prévoir la suppression des transitions par toujours nettes entre 2 températures (hystérésis, validation de la nouvelle température après n mesures consécutives identiques,...).

La taille du tableau de données dépendra donc de l'évolution de la température durant la période des 18 heures.

Slt,

Merci, je vois la méthode, je la testerais à l'occasion.

Là j'ai triché en fabriquant un int en multipliant x100 un float , ça me fait gagner déja beaucoup de place.

J'effectue un pseudo filtrage qui n'en ai pas vraiment un en prenant une valeur (elle même déja filtrée) toutes les 2 minutes et je fais mes calculs de moyenne, min et max dessus . Ce n'est pas trés rigoureux mais ce que j'observe ne vas pas varier rapidement (près d'1m d'eau) . J'utilise des DS18B20 avec une résolution de 0.125°C et c'est déja du luxe pour ce que je veux (en tenant compte de leur précision de 0.5°C) .

A contrôler et vérifier quand ça sera en place :wink: