Probleme Capteur MG811

Bonjour à tous :slight_smile:

En fait j’ai un problème avec mon capteur MG811(la doc est ici http://www.zartronic.fr/capteur-de-gaz-co2-mg811-p-394.html) , le truc c’est que je n’ai pas le taux de ppm exacte avec le code proposé.

Voici le code en question :

/*******************Demo for MG-811 Gas Sensor Module V1.1*****************************
Author:  Tiequan Shao: tiequan.shao@sandboxelectronics.com
         Peng Wei:     peng.wei@sandboxelectronics.com

Lisence: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)

Note:    This piece of source code is supposed to be used as a demostration ONLY. More
         sophisticated calibration is required for industrial field application.

                                                    Sandbox Electronics    2012-05-31
************************************************************************************/

/************************Hardware Related Macros************************************/
#define         MG_PIN                       (0)     //define which analog input channel you are going to use
#define         BOOL_PIN                     (2)
#define         DC_GAIN                      (8.5)   //define the DC gain of amplifier

/***********************Software Related Macros************************************/
#define         READ_SAMPLE_INTERVAL         (50)    //define how many samples you are going to take in normal operation
#define         READ_SAMPLE_TIMES            (5)     //define the time interval(in milisecond) between each samples in
                                                     //normal operation

/**********************Application Related Macros**********************************/
//These two values differ from sensor to sensor. user should derermine this value.
#define         ZERO_POINT_VOLTAGE           (0.220) //define the output of the sensor in volts when the concentration of CO2 is 400PPM
#define         REACTION_VOLTGAE             (0.020) //define the voltage drop of the sensor when move the sensor from air into 1000ppm CO2

/*****************************Globals***********************************************/
float           CO2Curve[3]  =  {2.602,ZERO_POINT_VOLTAGE,(REACTION_VOLTGAE/(2.602-3))};   
                                                     //two points are taken from the curve.
                                                     //with these two points, a line is formed which is
                                                     //"approximately equivalent" to the original curve.
                                                     //data format:{ x, y, slope}; point1: (lg400, 0.324), point2: (lg4000, 0.280)
                                                     //slope = ( reaction voltage ) / (log400 -log1000)

void setup()
{
    Serial.begin(9600);                              //UART setup, baudrate = 9600bps
    pinMode(BOOL_PIN, INPUT);                        //set pin to input
    digitalWrite(BOOL_PIN, HIGH);                    //turn on pullup resistors

   Serial.print("MG-811 Demostration\n");               
}

void loop()
{
    int percentage;
    float volts;

    volts = MGRead(MG_PIN);
    Serial.print( "SEN-00007:" );
    Serial.print(volts);
    Serial.print( "V           " );

    percentage = MGGetPercentage(volts,CO2Curve);
    Serial.print("CO2:");
    if (percentage == -1) {
        Serial.print( "<400" );
    } else {
        Serial.print(percentage);
    }

    Serial.print( "ppm" ); 
    Serial.print("\n");

    if (digitalRead(BOOL_PIN) ){
        Serial.print( "=====BOOL is HIGH======" );
    } else {
        Serial.print( "=====BOOL is LOW======" );
    }

    Serial.print("\n");

    delay(200);
}

/*****************************  MGRead *********************************************
Input:   mg_pin - analog channel
Output:  output of SEN-000007
Remarks: This function reads the output of SEN-000007
************************************************************************************/
float MGRead(int mg_pin)
{
    int i;
    float v=0;

    for (i=0;i<READ_SAMPLE_TIMES;i++) {
        v += analogRead(mg_pin);
        delay(READ_SAMPLE_INTERVAL);
    }
    v = (v/READ_SAMPLE_TIMES) *5/1024 ;
    return v; 
}

/*****************************  MQGetPercentage **********************************
Input:   volts   - SEN-000007 output measured in volts
         pcurve  - pointer to the curve of the target gas
Output:  ppm of the target gas
Remarks: By using the slope and a point of the line. The x(logarithmic value of ppm)
         of the line could be derived if y(MG-811 output) is provided. As it is a
         logarithmic coordinate, power of 10 is used to convert the result to non-logarithmic
         value.
************************************************************************************/
int  MGGetPercentage(float volts, float *pcurve)
{
   if ((volts/DC_GAIN )>=ZERO_POINT_VOLTAGE) {
      return -1;
   } else {
      return pow(10, ((volts/DC_GAIN)-pcurve[1])/pcurve[2]+pcurve[0]);
   }
}

J’aimerai bien quelques conseils pour les lignes à changer pour que ça affiche les ppm !

Merci d’avance :slight_smile:

Personne? :frowning:

Salut,

Faudrait être moins évasif : comment sais-tu que ce n'est pas le bon taux ? calibration ? Quel montage (gaz+elec) ?

Le problème c’est que je ne vois même pas le taux exacte , le programme n’affiche que CO2<400 ppm , meme quand je souffle par exemple. La tension varie (puisqu’elle est aussi affiché) , mais cela affiche toujours “CO2<400 ppm”. Ce que j’ai cru comprendre c’est que le taux de ppm est inversement proportionnel à la tension, mais je ne trouves pas de relation …

Je n’ai pas fait de calibration … Et pour le montage c’est juste un montage comme ici https://digitalmeans.co.uk/shop/image/cache/data/dfrobot/environment/co2_gas_sensor-analog-mg811-007-500x500.png

Le capteur est donnée pour 400-10000 ppm donc bon … Après il y a en début de programme ZERO_POINT_VOLTAGE qui est modifiable. Après rien ne t’empêche de faire ta propre conversion à partir d’un analogRead()

Faut il forcement le calibrer? Car j'ai trouvé un tuto sur internet mais ça à l'air un peu complexe

Pas forcement, mais tout dépend ce que tu en attend en terme de précision. Mais s'il est donné pour 400 ppm mini, faut pas s'attendre à des miracles en dessous.

Dans quel cas le calibrage serait oubligatoire ? je suis entrain de suivre ce tuto http://www.veetech.org.uk/Prototype_CO2_Monitor.htm

Ouais c'est surtout 400mini jusqu'a beaucoup c'est surtout pour des grandes valeurs de ppm

Bin la ils s'embête pas : il mesure la tension généré dans un espace aéré => 400 ppm
puis il prend un sac plastique, fait un trou, place le montage dans le sac, souffle dans le sac, pendant 30 sec en pinçant le trou pendant qu'il reprend son souffle. Puis ferme le sac et attend 5MIn. Tension générée = 40000 ppm. T'as ta courbe de calibration

Ok merci c'est ce que j'ai cru comprendre

mais j'ai une autre question , je viens de voir dans le datasheet la valeur max du capteur est 10000ppm ça changes tout non?

Visiblement il est donnée pour 10 000 max mais c'est ce qui est dit dans ton lien : visiblement à 40 000 il est pas aberrant