Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arduino, Blynk et moyenne glissante

Arduino, Blynk et moyenne glissante sur 10 valeurs

Sujet résolu
    11 novembre 2019 à 23:15:43

    Bonjour à tous,

    Avec une ESP 32 et blynk je récupère les valeurs d'un capteur de température.

    Les valeurs récupérées sont en analogique, je les transforme en degré celsius. Grâce à blynk je peux visualiser la courbe de température diretement sur mon smartphone. 

    Je constate que les valeurs oscillent. Je souhaiterai donc afficher la valeur moyenne de la température sur 10 valeurs. 

    Voici mon code : 

    #define BLYNK_PRINT Serial
    
    
    #include <WiFi.h>
    #include <WiFiClient.h>
    #include <BlynkSimpleEsp32.h>
    
    char auth[] = "********";  //authentification serveur blynk
    
    
    char ssid[] = "*******"; // authentification wifi
    char pass[] = "******"; //authentification wifi
    
    
    BlynkTimer timer;
    
    const int Pin = 34;
    const int ValueNumber = 10; //nombre de valeur sur lesquelles je veux établir une moyenne
    
    int tempPin = 0; //initialisation de la lecture du Pin
    float tempValue = 0; //initialisation de la valeur de la température
    float ValueNumberRatio = 1 / ValueNumber;
    float AverageBeginning = 0; //initialisation de la moyenne
    float Average = (tempValue)+((1-ValueNumberRatio)*AverageBeginning); //moyenne glissante sur 10 valeurs
    
    
    //création d'une fonction permettant de traiter les données du capteur. En effet si on traite les données dans void loop(), les serveurs de blynk saturent et déconnecte l'ESP32
    
    void myTimerEvent() {
    
      tempPin = analogRead(Pin);
      tempValue = (tempPin / 2048.0 )* 3300.0 * 0.1;
      Average; //calcul de la moyenne
      Average = AverageBeginning; //itération
    
      Serial.println(Average);
    
      delay(500);
      
      Blynk.virtualWrite(V5, Average); //affichage de la valeur moyenne sur l'application
    }
    
    void setup() {
    
      Serial.begin(9600);
      delay(1000);
      
      Blynk.begin(auth, ssid, pass);
    
      timer.setInterval(1000L, myTimerEvent);
    
    }
    
    void loop() {
    
      Blynk.run();
      timer.run();
    
    }

    Ce code me renvoie une valeur moyenne de 0. En revanche j'ai testé qu'il me renvoyait bien des valeurs de température et ça fonctionnait.

    Je pense que le calcul de la moyenne ne s'itère pas dans ma fonction myTimerEvent(). 

    Comment pallier ce problème ? 

    Merci !

    • Partager sur Facebook
    • Partager sur Twitter
      Staff 12 novembre 2019 à 13:13:24

      Dans tes variables globales, tu crées une variable AverageBeginning que tu initialise à 0 (ligne 23).

      Ensuite, à aucun autre endroit du code tu ne viens modifier cette variable, donc celle-ci vaut toujours 0.

      Ce n'est donc pas étonnant que tu te retrouves avec un température à 0 lorsque tu fais Average = AverageBeginning; ligne 34.

      -----

      Pour faire une moyenne sur 10 éléments, il te faudrait faire un tableau de 10 éléments que tu écris les uns après les autres.

      Une fois le tableau rempli, il te suffit de recommencer au début du tableau.

      Cela peut se faire très facilement avec un index glissant.

      Exemple :

      #define  TEMP_AVG_SIZE  10
      
      
      float tempArray[TEMP_AVG_SIZE] = { 0 };		// Tableau contenant les 10 éléments
      int tempIdx = 0;							// Index d'écriture dans le tableau
      
      
      void myTimerEvent() {
      
      	float tempValue;
      	
      	tempValue = ...; // <= ICI: ton code permettant de lire la température actuelle
      	
      	// Insertion de la température dans le tableau
      	tempArray[tempIdx] = tempValue;
      	
      	// Incrémentation de l'index
      	// (pour que la prochaine mesure écrive la témpérature dans la prochaine case du tableau)
      	tempIdx++;
      	// Si dépassement de la taille du tableau, retour à la première case (la plus ancienne)
      	if ( tempIdx >= TEMP_AVG_SIZE ) {
      		tempIdx = 0;
      	}
      
      	// Calcul moyenne du tableau
      	// (somme de tous les éléments puis division par le nombre d'éléments)
      	float tempAvg = 0;
      	for ( int i = 0 ; i < TEMP_AVG_SIZE ; i++ ) {
      		tempAvg += tempArray[i];
      	}
      	tempAvg /= TEMP_AVG_SIZE;
      	
      	// Et voila, 
      	Serial.println(tempAvg);
      	
      }
      



      -
      Edité par lorrio 12 novembre 2019 à 13:14:13

      • Partager sur Facebook
      • Partager sur Twitter
        14 novembre 2019 à 8:52:15

        Effectivement AverageBeginning n'est jamais modifiée ensuite.

        Merci pour l'astuce du tableau, j'ai compris le principe et ça fonctionne pour moi !

        • Partager sur Facebook
        • Partager sur Twitter

        Arduino, Blynk et moyenne glissante

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        • Editeur
        • Markdown