Détecter une température en hausse puis en baisse ???

Bonjour a tous,

Je suis débutant en programmation arduino.
Je travaille avec une UNO.

Voici mon probleme :
Je voudrais détecter une température qui serait croissante, atteindrait un maximum puis redescendrait (et donnerait une alarme à ce moment la).

J'avais pensé à un "tableau" ou seraient stockées les température sur un laps de temps. On fait ensuite la moyenne des valeurs de ce tableau.
Ensuite, sur un même laps de temps, on crée un second tableau avec le même nombre d'échantillons.
On compare ensuite la moyenne des 2 tableaux.
Si la moyenne du second tableau est supérieure au premier tableau, nous sommes en augmentation de température.
On efface le premier tableau et c'est le second qui devient le tableau de référence.
On peuple à nouveau le second tableau (au pas précédent, les second tableau est devenu le premier, celui de référence)
Si la moyenne du second tableau est inférieure à la moyenne du second, nous sommes en chutte de température.

Est-ce une bonne méthode ou y a t'il plus simple ?

J'ai choisis ce systeme afin d'éviter des erreurs sur des "courant d'air" qui feraient baisser la sonde de température et donnerait une fausse alarme (dans le cas d'une variable style t°min, t°moyenne et t°max qui seraient comparée entre 2 boucles).

Si vous avez des avis ou suggestions ou des bouts de code, je suis preneur.

Merci à vous.

Tu peux faire deux tableaux, un comme tu l’as dis avec les différentes mesures et l’autre avec la moyenne de du tableau prise toute les quarte mesures par exemple

float temperatures[20] = {0};
float moy[5] = {0};
int i = 0;

void loop()
{
  float temp = //Recupère la température
  
  temperatures[i] = temp;

  float total = 0;
  bool possible = true;
  for(int j = 0 ; j < 20 && possible ; j++) {
    if(temperatures[j] == 0)
      possible = false;
    else
      total += temperatures[j];
  }

  if(possible && i%4 == 0)
    moy [j - (j/4)*3] = total / 20.0; //Pour garder un float et ne pas le transformer en int (plus de virgule) il faut mettre un .0 aux chiffres

  //Il ne reste plus qu'a détecter si c'est croissant ou décroissant

  possible = true;
  for(int j = 0 ; j < 5 ; j++)
    if(moy[j] == 0)
      possible = false; //Si pas assez de données on abandonne

  if(possible) {
    if(moy[0] > moy[1] && moy[1] > moy[2]......)
      //croissant
    else if(moy[0] < moy[1] && moy[1] < moy[2]......)
      //décroissant
    else
      //constant
  }
  
  i = (i+1)%20 //On incrémente i en le remettant à zero si égal à 20
  delay(100)
}

bonjour,
encore une histoire de moyenne, héhéhé.
pourquoi ne pas faire un relevé de la temp, une comparaison, un stockage?

par exemple :
tempmax est à zéro au début
nombremaxvoulu = 10 par exemple
tempreel est prise en compte
si tempreel > tempmax => tempmax = tempreel
si tempreel < tempmax => incrémentation d’un compteur
si compteur > nombremaxvoulu => alerte => compteur = 0 => tempmax = tempreel
et on re boucle pour recalculer
tu peux même mettre en stock la tempmax et la tempmini

Artouste avait évoqué un problème possible de débordement dans un autre post pour les moyennes :wink:

Merci pour vos réponses et votre partie de code.

Si d'autres passent par ici et qu'il y a d'autres suggestions, je suis preneur.

Bonne journée.

bonjour
Comme dit Infobarquee "encore une histoire de moyenne hé, hé ,hé, hé " (j'en ai rajouté un).
Chacun a sa théorie et sa solution. Voici la mienne (pas forcément la meilleure).

  • on crée un tableau de 20 éléments (ex: float Mesures [20])
  • les éléments de ce tableau sont adressés par un index i .
  • à chaque mesure on inscrit cette mesure dans le tableau à l'adresse i
  • on incrémente i si il arrive à 20 on le remet à 0
  • on fait la somme des éléments du tableau et on divise cette somme par 20. On a ainsi la valeur moyenne des 20 dernières mesures.
  • On compare cette moyenne avec la précédente si cette dernière moyenne est plus petite que la précédente on a une baisse de t°.
    Mais ! et c'est ici que ça se complique cette baisse peut être due à un coup de vent. il faut donc tenir compte de celui-ci en fonction de sa durée max et de son influence.
  • on fait une mesure toutes les x secondes.
  • on fait une comparaison sur trois moyennes : on a une moyenne M1, x secondes plus tard on a une moyenne M2, si M2 est plus petite que M1 on peut supposer que l'on a une baisse de t°, après x s on a M3 si M3 est de nouveau plus petite que M2 on vraiment une baisse de température.
    A+

sauf que là, c'est moins une histoire de moyenne, mais plus une détection de baisse de température avec une alerte.
hé, hé ,hé, hé, hé :wink:

C'est ce que j'ai inscrit à l'ouverture du post pour éviter une mesure style "courant d'air" ou variation de tension instantannée au niveau du capteur.

Donc, prendre des échantillons tout les X temps, en faire une moyenne, les stocker dans un tableau et vérifier dans quel sens la moyenne évolue est pour moi la meilleure solution pour éviter les fausses alarmes.

N'y a t'il pas une commande qui vide le tableau ?

Quand vous parlez de probleme de débordement, cela veut dire quoi ?

Merci pour vos bonnes réponses.

N'y a t'il pas une commande qui vide le tableau ?

On ne vide jamais le tableau. Il contient les 20 dernières mesures sur lesquelles on va faire la moyenne glissante.
Une nouvelle valeur écrase la plus ancienne. C'est ce qu'explique Ive123 avec son index i qui pointe dans le tableau l'endroit où tu places la dernière mesure.