Afficher les valeurs de 2 capteurs

Bonjour,

J’ai un Arduino Duelmilanove et 2 capteurs : un thermistor 503 et un baromètre MPX4115A.
J’arrive à avoir les valeurs des 2 capteurs dans 2 sketches différents.
Le but est d’avoir les valeurs des deux capteurs qui s’affichent avec OpenDaqCalc via le même sketch mais j’ai des messages d’erreur …

Pour la pression, j’ai ceci (qui fonctionne avec le moniteur série natif):

void setup() {
    Serial.begin(9600);
}
 
void loop(){
    float pressure = readPressure(A1);
    float millibars = pressure/100;
 
    Serial.println();
    Serial.print("Pressure = ");
    Serial.print(pressure);
    Serial.println(" pascals");
    Serial.print("Pressure = ");
    Serial.print(millibars);
    Serial.println(" millibars");
    delay(1000);
}
 
/* Reads pressure from the given pin.
* Returns a value in Pascals
*/
float readPressure(int pin){
    int pressureValue = analogRead(pin);
    float pressure=((pressureValue/1024.0)+0.095)/0.000009;
    return pressure;
}

Pour la temprérature via le thermistor 503, j’ai ceci (qui fonctionne et visible avec OpenDaqCalc):

// which analog pin to connect
#define THERMISTORPIN A0         
// resistance at 25 degrees C
#define THERMISTORNOMINAL 10000      
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25   
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 10
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3950
// the value of the 'other' resistor
#define SERIESRESISTOR 10000    
 
int samples[NUMSAMPLES];

// Initialisation pour OpenDaqCalc
int x = 0;
int row = 0;
// Fin Initialisation pour OpenDaqCalc

void setup(void) {
  Serial.begin(9600);
  // analogReference(EXTERNAL);
  Serial.println("CLEARDATA");
  Serial.println("LABEL,Time,x,Temp");
}
 
void loop(void) {
  uint8_t i;
  float average;
 
  // take N samples in a row, with a slight delay
  for (i=0; i< NUMSAMPLES; i++) {
   samples[i] = analogRead(THERMISTORPIN);
   delay(10);
  }
 
  // average all the samples out
  average = 0;
  for (i=0; i< NUMSAMPLES; i++) {
     average += samples[i];
  }
  average /= NUMSAMPLES;
 
 // Serial.print("Average analog reading "); 
 // Serial.println(average);
 
  // convert the value to resistance
  average = 1023 / average - 1;
  average = SERIESRESISTOR / average;
//  Serial.print("Thermistor resistance "); 
//  Serial.println(average);
 
  float steinhart;
  steinhart = average / THERMISTORNOMINAL;     // (R/Ro)
  steinhart = log(steinhart);                  // ln(R/Ro)
  steinhart /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
  steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  steinhart = 1.0 / steinhart;                 // Invert
  steinhart -= 273.15;                         // convert to C
 
//  Serial.print("Temperature "); 
//  Serial.print(steinhart);
//  Serial.println(" *C");
//  Serial.println("################");
//  Serial.println(" ");
//  delay(3000);


// Affichage graphique sous OpenOffiche avec OpenDaqCalc
Serial.print("DATA,TIME,"); Serial.print(x); Serial.print(","); Serial.println(steinhart);
  row+=2;
  x+=2;
  if (row > 3600) 
   {
    row=0;
    Serial.println("ROW,SET,2");
   }
  delay(500);

}

J’ai essayé ensuite d’afficher la pression sur le même graphique que celui de la température mais cela ne va pas …

Dans le loop, j’ai simplement ajouté ceci :

{
    float pressure = readPressure(A1);
    float millibars = pressure/100;
 
    Serial.println();
    Serial.print("Pressure = ");
    Serial.print(pressure);
    Serial.println(" pascals");
    Serial.print("Pressure = ");
    Serial.print(millibars);
    Serial.println(" millibars");
    delay(1000);
}
 
/* Reads pressure from the given pin.
* Returns a value in Pascals
*/
float readPressure(int pin){
    int pressureValue = analogRead(pin);
    float pressure=((pressureValue/1024.0)+0.095)/0.000009;
    return pressure;
}

et pour l’affichage dans OpenDaqCalc, j’ai modifié comme ceci :

Serial.print("DATA,TIME,"); Serial.print(x); Serial.print(","); Serial.println(steinhart); Serial.print(","); Serial.println(pressure);

Le message d’erreur :

Thermistor_503_Graph23015_OpenDaqCalc.ino: In function ‘void loop()’:
Thermistor_503_Graph23015_OpenDaqCalc:73: error: ‘readPressure’ was not declared in this scope
Thermistor_503_Graph23015_OpenDaqCalc:89: error: a function-definition is not allowed here before ‘{’ token
Thermistor_503_Graph23015_OpenDaqCalc:96: error: ‘pressure’ was not declared in this scope

Pourriez-vous me dire où se situe l’erreur car j’ai essayé de mettre le dernier morceau de code à différents endroit dans le loop mais cela ne fonctionne pas…
Un grand merci d’avance de votre attention.

Dominique,

J'ai l'impression que tu as mis la fonction "float readPressure(int pin)" dans le loop(). Tu dois la sortir de loop(), elle doit être au même niveau que loop(). Sinon, mets du code complet, ce sera plus clair....

Bonjour et merci tahitibob35,
J’ai mis la fonction “float readPressure(int pin)” en dehors du loop()
Mais j’obtiens toujours un message d’erreur que voici :

PressureMPX4115A_Thermistor_503_Graph23015_OpenDaqCalc:77: error: expected declaration before ‘}’ token

Voici, comme demandé, le code complet :

// which analog pin to connect
#define THERMISTORPIN A0         
// resistance at 25 degrees C
#define THERMISTORNOMINAL 10000      
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25   
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 10
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3950
// the value of the 'other' resistor
#define SERIESRESISTOR 10000    
 
int samples[NUMSAMPLES];

// Initialisation pour OpenDaqCalc
int x = 0;
int row = 0;
// Fin Initialisation pour OpenDaqCalc

void setup(void) {
  Serial.begin(9600);
  // analogReference(EXTERNAL);
  Serial.println("CLEARDATA");
  Serial.println("LABEL,Time,x,Temp");
}
 
void loop(void) {
  uint8_t i;
  float average;
 
  // take N samples in a row, with a slight delay
  for (i=0; i< NUMSAMPLES; i++) {
   samples[i] = analogRead(THERMISTORPIN);
   delay(10);
  }
 
  // average all the samples out
  average = 0;
  for (i=0; i< NUMSAMPLES; i++) {
     average += samples[i];
  }
  average /= NUMSAMPLES;
 
 // Serial.print("Average analog reading "); 
 // Serial.println(average);
 
  // convert the value to resistance
  average = 1023 / average - 1;
  average = SERIESRESISTOR / average;
//  Serial.print("Thermistor resistance "); 
//  Serial.println(average);
 
  float steinhart;
  steinhart = average / THERMISTORNOMINAL;     // (R/Ro)
  steinhart = log(steinhart);                  // ln(R/Ro)
  steinhart /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
  steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  steinhart = 1.0 / steinhart;                 // Invert
  steinhart -= 273.15;                         // convert to C
 
 //Calcul Pression MPX4115A
 float pressure = readPressure(A1);
    float millibars = pressure/100;
 
    Serial.println();
    Serial.print("Pressure = ");
    Serial.print(pressure);
    Serial.println(" pascals");
    Serial.print("Pressure = ");
    Serial.print(millibars);
    Serial.println(" millibars");
    delay(1000);
}}
 
/* Reads pressure from the given pin.
* Returns a value in Pascals
*/
float readPressure(int pin){
    int pressureValue = analogRead(pin);
    float pressure=((pressureValue/1024.0)+0.095)/0.000009;
    return pressure;
}
 
// Affichage graphique sous OpenOffice avec OpenDaqCalc
Serial.print("DATA,TIME,"); Serial.print(x); Serial.print(","); Serial.print(steinhart); Serial.print(","); Serial.print(pressure);
  row+=2;
  x+=2;
  if (row > 3600) 
   {
    row=0;
    Serial.println("ROW,SET,2");
   }
  delay(500);

}

Cela doit être une bêtise mais je suis perdu ;-(
Merci d’avance.
Dominique,

Oui, la derniere partie n’a rien à faire là…

La suite compile, mais je ne sais pas si elle fait le boulot…

// which analog pin to connect
#define THERMISTORPIN A0         
// resistance at 25 degrees C
#define THERMISTORNOMINAL 10000      
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25   
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 10
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3950
// the value of the 'other' resistor
#define SERIESRESISTOR 10000    
 
int samples[NUMSAMPLES];

// Initialisation pour OpenDaqCalc
int x = 0;
int row = 0;
// Fin Initialisation pour OpenDaqCalc

void setup(void) {
  Serial.begin(9600);
  // analogReference(EXTERNAL);
  Serial.println("CLEARDATA");
  Serial.println("LABEL,Time,x,Temp");
}
 
void loop(void) {
  uint8_t i;
  float average;
 
  // take N samples in a row, with a slight delay
  for (i=0; i< NUMSAMPLES; i++) {
   samples[i] = analogRead(THERMISTORPIN);
   delay(10);
  }
 
  // average all the samples out
  average = 0;
  for (i=0; i< NUMSAMPLES; i++) {
     average += samples[i];
  }
  average /= NUMSAMPLES;
 
 // Serial.print("Average analog reading "); 
 // Serial.println(average);
 
  // convert the value to resistance
  average = 1023 / average - 1;
  average = SERIESRESISTOR / average;
//  Serial.print("Thermistor resistance "); 
//  Serial.println(average);
 
  float steinhart;
  steinhart = average / THERMISTORNOMINAL;     // (R/Ro)
  steinhart = log(steinhart);                  // ln(R/Ro)
  steinhart /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
  steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  steinhart = 1.0 / steinhart;                 // Invert
  steinhart -= 273.15;                         // convert to C
 
 //Calcul Pression MPX4115A
 float pressure = readPressure(A1);
    float millibars = pressure/100;
 
    Serial.println();
    Serial.print("Pressure = ");
    Serial.print(pressure);
    Serial.println(" pascals");
    Serial.print("Pressure = ");
    Serial.print(millibars);
    Serial.println(" millibars");
    delay(1000);
    
    // Affichage graphique sous OpenOffice avec OpenDaqCalc
Serial.print("DATA,TIME,"); Serial.print(x); Serial.print(","); Serial.print(steinhart); Serial.print(","); Serial.print(pressure);
  row+=2;
  x+=2;
  if (row > 3600) 
   {
    row=0;
    Serial.println("ROW,SET,2");
   }
  delay(500);
  
  
}
 
/* Reads pressure from the given pin.
* Returns a value in Pascals
*/
float readPressure(int pin){
    int pressureValue = analogRead(pin);
    float pressure=((pressureValue/1024.0)+0.095)/0.000009;
    return pressure;
}

ton code à partir du commentaire "// Affichage graphique sous OpenOffice avec OpenDaqCalc" n'a rien à faire là.

A quoi doit-il servir ?

Bonsoir et merci bigben99 et tahitibob35,

En effet, je ne devais pas mettre l'affichage graphique à la fin ...

Pour répondre à bigben99, cela sert à afficher graphiquement (grâce à la macro OpenDaqCalc de OpenOffice) les données (T° et Pression) des 2 capteurs. Je me suis dit qu'une succession de chiffres n'était pas la meilleure solution... Voir le printscreen ci-dessous.

Ce n'est pas terrible car comme la température avoisine les 15°C et la pression 975 hPa, les petites différences de T°/pression ne seront pas visibles sur le même graphe à cause de l'échelle ... Il faudrait donc que je fasse deux graphes distincts.

Mais cela dépasse certainement le sujet. Donc merci de m'avoir aidé !! Bonne soirée à vous. Dominique,

bonsoir attention néanmoins à une chose importante : Si le MPX4115 est intrinsèquement un excellent capteur, son utilisation "directe" avec les ADC "arduino basique" ne permet pas d'en tirer toute la "substantifique moelle" :grin: , surtout pour la portion "amplitude meteo"