Capteur d'humidité

Bonjour,
Je suis en Terminale SSI. Concernant mon projet SI, je travaille sur la partie de capteurs : le calcul d’humidité et temperature.
J’ai besoin de votre aide pour calculer la moyenne de valeurs calculées à partir du programme Arduino/

Problèmatique: Quel est le code pour calculer la moyenne à partir de valeurs calculées ?

Merci d’avance

/* Le circuit

  • Un capteur analogique branché sur AO

*/

#include <math.h>

#include <Wire.h> // inclut les bibliothèques nécessaires

int a; //définir la variable a

int delta=2000 ; // temps de rafraichissement entre 2 mesures en milisecondes
float humidite; // variable pour la résistance R2
const int R1 = 30; // R1 = 30 Ohm
const float U = 5.0; // valeur de la tension constante
float UR2; // Valeur de la tension mesurée UR2
float resist;

// …réglage du temps entre deux mesures…
void setup()
{
Serial.begin(9600); // initialisation de la liaison série
Serial. println( “Mesure de humidite”); // on écrit Mesure de humidite sur la liaison série
Serial. print( "temps (ms)entre deux mesures : ");// on écrit … sur la liaison série
Serial. println(delta); // on écrit la valeur du temps de rafraichissement et on saute la ligne
}
void loop()
{

UR2 =analogRead(1); // lire la valeur de l’entrée analogique A0 ( UR2)
// Serial.println(UR2); // On écrit la résistance sur la liaison série
UR2=(UR2U)/1024.0;
humidite = (R1
UR2)/(U - UR2);
// Serial.println(UR2); // On écrit la résistance sur la liaison série
Serial.println("Valeur de la résistance du sol mesurant l’humidité : "); // On écrit la résistance sur la liaison série
Serial.println(humidite); // On écrit la résistance sur la liaison série( R2)
// Calcul de la résistivité du terrain
resist = 3.1416 * 2 * 1 * humidite;
Serial.println("Valeur de la résistivité du terrain en ohm-mètre : "); // On écrit la résistance sur la liaison série
Serial.println(resist); // On écrit la résistance sur la liaison série( R2)
delay(1500); //attendre 0.5 seconde (500 ms)

}

Merci d’avance.

Bonjour,
Il faut mettre ton code entre balises codes
http://forum.arduino.cc/index.php?topic=315372.msg2196181#msg2196181

la moyenne est égale à Somme_des_valeurs_mesurées / nombre_de_mesures.

biggil:
la moyenne est égale à Somme_des_valeurs_mesurées / nombre_de_mesures.

Il faut donc connaitre la somme et le nombre de mesures : tu prends deux variables ‘somme’ et ‘nbmesures’ que tu initialises à 0 dans le setup ou à la déclaration. Il faut aussi une variable ‘moyenne’
Dans la loop, tu incrémentes nbmesures et tu ajoutes la mesure courante à la somme. Le calcul de la moyenne se fait selon la formule hautement scientifique de Biggil puis tu affiches le résultat (Serial.print).

C’est pas sorcier…

Bonjour,

j’ai fait un programme

/* Le circuit
* Un capteur analogique branché sur AO

*/

#include <math.h>

#include <Wire.h>  // inclut les bibliothèques nécessaires


int a;       //définir la variable a

 int delta=2000 ;       // temps de rafraichissement entre 2 mesures en milisecondes
 float humidite; // variable pour la résistance R2
 const int R1 = 30; // R1 = 30 Ohm
 const float U = 5.0; // valeur de la tension constante
 float UR2; // Valeur de la tension mesurée UR2
 float resist;
 int mesure;
 int nombre_mesure=200; // nombre de mesure à réaliser pour le moyennage
 int somme=0; // variable pour cumul des mesures
 float moyenne; // variable calcul de la moyenne
 int i; // variable i
 int somme1;
// .....................réglage du temps entre deux mesures.......................................
 void setup()
{
  Serial.begin(9600);    // initialisation de la liaison série
  Serial. println( "Mesure de humidite");    // on écrit Mesure de humidite sur la liaison série
  Serial. print( "temps (ms)entre deux mesures : ");// on écrit ....... sur la liaison série
  Serial. println(delta);    // on écrit la valeur du temps de rafraichissement et on saute la ligne
}
void loop()
{Serial.print("somme=");
 Serial.println(somme);
  for (int i=0; i<nombre_mesure; i++) // répète la mesure
 { 
  UR2 =analogRead(1);    // lire la valeur de l'entrée analogique A0 ( UR2)
  UR2=(UR2*U)/1024.0;
 humidite = (R1*UR2)/(U - UR2); 
 
 // Calcul de la résistivité du terrain
 resist = 3.1416 * 2 * 1 * humidite;
 
  somme=somme+resist;
 }
  Serial.print("somme=");
  Serial.println(somme);
  
// calcul moyenne 
 moyenne=somme/nombre_mesure; 
  Serial.print("moyenne="); 
  Serial.println(moyenne); // VALEUR MOYENNE
 
  somme=0;
  delay(2000);
  }

J’ai obtenu des valeurs positifs et negatifs, je trouve que ce n’est pas normal. En general la valeur de la resistivité est entre 0 à 19492.

Il se peut qu’il y ait débordement si la somme de vos 200 mesures dépasse 215.

Pour pallier ce problème, changez le type de la variable “somme” à uint32_t ; vous aurez une dynamique de 232. Ce qui cette fois devrait suffire.

Cordialement.

Pierre

ChPr:
Pour pallier ce problème, changez le type de la variable “somme” à uint32_t ; vous aurez une dynamique de 232.

je dirais même plus : somme doit être de type float

Bonjour, la solution de Biggil fonctionne ! Il fallait changer int somme à float somme.

Maintenant, je cherche comment stocker les données sous forme de tableau excel. Comment faire ?? :frowning:

En faisant comme ça...

Oui, avant de poster, je suis allée sur Internet. Mais cela m'aide pas beaucoup car j'ai testé des logiciels qui ne veulent pas être installés dans l'ordinateur du lycée.

J'ai essayé de stoker les données sur Excel avec .csv. Cela fonctionne mais le graphique ne veut pas prendre en charge la résistivité reçue comme l'ordonnée.

C'est bizarre, peux-tu poster ton fichier csv ?

Le voici.

Je suis allée aux paramètres pour inverser l'axe d’abscisse à l'axe ordonnée. Mais rien ne fonctionne.

Je sais que Excel n'est pas le bienvenu dans le forum :roll_eyes:

Avez-vous d'autres solutions pour stocker des données sur Excel et faire un tableau direct ?

Mets en pièce jointe, là on n'a rien.
Autrement ? Tu pourrais envoyer les données sur la liaison série, les capter sur le PC grâce à un script Python qui afficherait la courbe correspondante.