Go Down

Topic: courbe de calibrage pour arduino UNO (Read 501 times) previous topic - next topic

turw

Bonjour,

j'utilise un capteur connecté à un arduino, je veux utiliser la réponse du capteur pour faire une courbe de calibrage automatique et ensuite utiliser les valeurs du capteur pour calculer mes concentrations.
Voilà comment j'a procédé :

j'ai déclaré un tableau de type float Tab [5][2] et j'ai introduit la réponse du capteur pour des solutions dont la concentration est connue. Ensuite j'ai utilisé une fonction qui lit la valeur du capteur, la compare dans mon tableau et applique une formule pour calculer la valeur rechercher ci-joint la fonction:

tableau de valeur

float Tab[5][2]= {
{
0,1078.02}
,{
1,836.81 }
, {
2,752.39 }
, {
3,683.31 }
,{
4,625.75 }

};


fonction

float calib(float pts[10][2], float input) {
int rr;
float mm;

for (int nn=0; nn < 5; nn++) {

if (input >= pts[nn][0] && input <= pts[nn+1][0]) {

mm = (log(pts[nn][1])-log(pts[nn+1][1]))/(log(pts[nn][0])-log(pts[nn+1][0]));
mm = (log((input/pts[nn][1])))/mm;
mm = mm + log(pts[nn][0]);
mm = pow(10,mm);
rr= mm;

}
}
return(rr);

}

Sachons que la droite que j'obtiens est une droite décroissante, quand je fais appelle à ma fonction elle ne fonctionne pas correctement . j'obtient des valeurs erronées.

la formule utilisée est simplement une formule qui calcule les pentes d'une droite. le log est appliqué pour rendre la réponse du capteur linéaire.
Je n'arrive à décelé le problème je soupçonne le test au début de la fonction ?

Merci de m'aider à résoudre mon problème.

Bonjour,

As-tu essayé ta fonction "offline", c'est-à-dire dans un environnement de développement qui te permet de la tester (et surtout de la débugger) sur ton ordinateur ?
Il te resterait à créer artificiellement des données (ou bien à réinjecter celles que tu peux acquérir avec l'Arduino) mais ça t'aiderait à savoir d'où vient le problème.

turw

Bonjour 3Sigma,

Merci pour ta réponse.

Quand j'utilise le code "offline" je remarque qu'il n y'a pas de continuité dans les mesures et que même pour des valeurs comprises dans l'intervalle choisi la réponse est un nombre très grand qui sort de la limite.  Par contre si j'utilise des valeurs croissante et un compteur de 0 à 60 par exemple la réponse est bonne ci-joint le code complet avec lequel j'ai trvaillé :

Code: [Select]


// curve mapping with n interpolation points

// KHM 2010 Lab3

// nodes for linear equations / nodepoits are concatening  lines
float nodepoints[5][2]= {
  {
    0,10  }
  , {
    10,50  }
  , {
    20,150  }
  , {
    40,200  }
  ,{
    60,200  }
};

void setup() {
  Serial.begin(115200);
}
void loop() {

// test
// a given linear input leads to remapped output
  for ( int ii = 0; ii <= 60; ii++) {
    Serial.print(ii);
    Serial.print("  ");
    int result= reMap(nodepoints,ii);

    Serial.print(result);
    Serial.println("  ");
  }
  while(1);
}

//***************************************************************************
//
int reMap(float pts[10][2], int input) {
  int rr;
  float bb,mm;

  for (int nn=0; nn < 4; nn++) {

    if (input >= pts[nn][0] && input <= pts[nn+1][0]) {
      mm= ( pts[nn][1] - pts[nn+1][1] ) / ( pts[nn][0] - pts[nn+1][0] );
      mm= mm * (input-pts[nn][0]);
      mm = mm +  pts[nn][1];
      rr = mm;
    }
  }
  return(rr);
}


j'ai remplacé le input par la réponse du capteur

Merci

L'idéal serait qu'en offline tu fasses un petit coup de débuggeur pour comprendre précisément ce qui ne va pas dans les calculs.
C'est une méthode radicale quand l'erreur ne saute pas aux yeux.

fdufnews

#4
Oct 24, 2013, 02:49 pm Last Edit: Oct 24, 2013, 02:53 pm by fdufnews Reason: 1
Code: [Select]
int reMap(float pts[10][2], int input) {

Tableau [10][2] alors qu'il est déclaré [5][2]. Tu ne sais pas à priori comment le tableau est implémenté en mémoire donc tu prends un risque. Tu peux le vérifier avec quelques print.

Code: [Select]
int reMap(float pts[10][2], int input) {
 for (int nn=0; nn < 4; nn++) {

   if (input >= pts[nn][0] && input <= pts[nn+1][0]) {


Lorsque nn=4 tu as nn+1 qui n'est pas défini puisque tu n'as que 5 éléments dans ton tableau d'entré.

Code: [Select]
rr = mm;
j'écrirais plutôt
Code: [Select]
rr = (int) mm;

turw

Bonjour 3Sigma,

Comment je fais le debuggeur ????

Merci

Oublie l'Arduino et écris le programme pour qu'il s'exécute sur ton ordi tout seul (Visual C++, Xcode,...). Tu pourras alors débugguer et voir s'il n'y a pas un problème de base, décorrélé de l'Arduino avant d'aller plus loin.

turw

ok, merci pour votre aide les experts  :)

Go Up