Pages: [1]   Go Down
Author Topic: courbe de calibrage pour arduino UNO  (Read 444 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Sr. Member
****
Karma: 5
Posts: 398
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

// 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
Logged

Offline Offline
Sr. Member
****
Karma: 5
Posts: 398
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

France
Offline Offline
Faraday Member
**
Karma: 40
Posts: 3634
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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:
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:
rr = mm;
j'écrirais plutôt
Code:
rr = (int) mm;
« Last Edit: October 24, 2013, 07:53:34 am by fdufnews » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour 3Sigma,

Comment je fais le debuggeur ????

Merci
Logged

Offline Offline
Sr. Member
****
Karma: 5
Posts: 398
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 114
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, merci pour votre aide les experts  smiley
Logged

Pages: [1]   Go Up
Jump to: