Omet navegació

16.3 Calibració sensor 0159 (MG811).

Calibratge del sensor SEN0159 amb el sensor SEN0220 (NDIR)

El sensor SEN0159 ja hem vist que mesura CO2 en l'interval 0 - 10000 ppm CO2 de forma logarítmica mentre el SEN0220 mesura CO2 en l'interval 0 - 50000 ppm CO2.

Sensibilitat del sensor SEN0159

Per calibrar el sensor SEN0159 amb el sensor SEN0220 farem el muntatge següent:

Esquema elèctric calibrat SEN0159 amb SEN0220
C. Ferrando (CC BY-NC-SA)

Introduirem els dos sensors dins d'un dessecador de vidre fent passar els cables pel tap de plàstic perforat, d'aquesta forma l'aire que anem a mesurar estarà aïllat del ambient /aula on estem nosaltres.

Per obtindre el punt de calibrat baix ventilem l'aula 60 minuts amb el programa engegat i agafem les mesures com bones a partir de l'hora, en eixe moment posem la tapa al dessecador i mirem l'hora per cercar les mesures a la targeta MicroSD.

Mira el muntatge per al calibratge del punt baix.

Muntatge calibració punt baix
C. Ferrando (CC BY-NC-SA)

Els punt de calibratge una vegada convertits del format *.txt al *.csv, una vegada cambiades les cometes americanes per cometes europees ens permet importar el fitxer *csv al libreoffice calc i obtenim els valors següents:

Punts calibrat baix

Per obtindre el punt de calibrat alt ventilem l'aula 60 minuts amb el programa engegat i agafem les mesures com bones a partir de l'hora, en eixe moment  introduïm l'erlenmeyer on posem 150 ml d'aigua , 40 ml d'àcid acètic pur i un guix/clarió de pissarra per generar CO2, posem la tapa al dessecador i mirem l'hora per cercar les mesures a la targeta MicroSD. Agafem les lectures més properes a 10000 ppm de CO2 mesurades amb el sensor SEN0220.

Mira el nostres esquema de muntatge per al punt de calibrat alt.

Muntatge calibració punt alt
C. Ferrando (CC BY-NC-SA)

Mira les que hem obtès nosaltres:

Punts de calibrat alts

Fem ús de la relació Relació FEM (CO2)

Suposem que FEM1= 0.2371 V que per a aquest valor correspon una concentració de CO2 mesurada amb el espectrofotòmetre d'IR SEN0220 de 785.19266 ppmCO2 i que FEM2=0.0525 V que per a aquest valor correspon una concentració de CO2 de 9731.75 ppmCO2 , llavors calcularem el valors de la recta de regressió logarítmica següent:

 

Recta de calibració
C. Ferrando (CC BY-NC-SA)



El programa amb el qual hem fet aquesta calibració és:

// Calibrat del sensor SEN0159 amb el sensor 0220
// Per fer aquest programa s'han gastat les fonts que segueixen
// Font1: http://playground.arduino.cc/Main/DHT11Lib
// Font2: https://www.arduino.cc/en/Tutorial/Files
// Font3 = https://www.dfrobot.com/wiki/index.php/CO2_Sensor_SKU:SEN0159
// Font3= https://www.dfrobot.com/wiki/index.php/Infrared_CO2_Sensor_0-50000ppm_SKU:_SEN0220
// created   Nov 2010 by David A. Mellis
// modified 9 Apr 2012 by Tom Igoe
// Created Tiequan Shao: tiequan.shao@sandboxelectronics.com
// Created  Peng Wei:     peng.wei@sandboxelectronics.com
// Modified by Leff from DFRobot, leff.wei@dfrobot.com, 2016-4-21, make the algorithm clearer to user
// Created at  2016-6-6 by lg.gang(lg.gang@qq.com)
// Modificat el 1 de març de 2017 per Carles Ferrando

#include <SD.h>
File myFile;

#include <Time.h>  

//Definim la data i hora per configurar el rellotge
int hora;
int minut;
int segon;
int dia;
int mes;
int any;

/************************Constants del programa*********|***************************/

int MG_PIN = 0 ; //Defineix el port analogic per mesurar la lectura de voltatge (CO2)
int DC_GAIN = 8.5 ; // Defineix el guany del amplificador operacional
int READ_SAMPLE_TIMES = 5 ; //Defineix el nombre de mostres que es prendran en funcionament normal
int READ_SAMPLE_INTERVAL  = 50 ; //defineix l'interval de temps (en milisegons) entre cada mostra

/**********************Valors que cal calibrar**********************************/
//Aquests valors difereixen de sensor a sensor. L'usuari ha de determinar aquest valor.
float ZERO_POINT_X = 2.608; // lg405.91=2.608, el punt inicial a l'eix X de la corba
float ZERO_POINT_VOLTAGE = 0.14; //defineix la eixida del sensor en Volts quan la concentració de CO2 es 405.91 PPM
float MAX_POINT_VOLTAGE = 0.265 ; //defineix la eixida del sensor en volts quan la concentració de CO2 és 10.000 PPM
float MAX_POINT_X = 4 ; //Log10000 = 4 el punt final de la corba logaritmica

long valorRealCO2 ;
float lecturaSensorCO2;// lecturaSensorCO2 =volts/DC_GAIN  el voltatge esta amplificat DC_GAIN i ens cal el voltatge sense amplificar per fer calculs
float LConcentracioCO2; // log(CO2 en ppm) 
float ConcentracioCO2 ; // CO2 en ppm
float volts; //lectura amplificada del voltatge

#include <SoftwareSerial.h>
SoftwareSerial mySerial(5, 6); // RX, TX
unsigned char hexdata[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; //Read the gas density command /Don't change the order

void setup()
{
 
  Serial.begin(9600);
  while (!Serial) {

  }
  mySerial.begin(9600);


  //setTime(hr,min,sec,day,month,yr); // CAL POSAR L-HORA REAL I LA DATA AL COMENÇAR LA CLASSE A LA RATLLA DE SOTA
    setTime(9,23 ,00,13,3,2017); //  CAL POSAR L-HORA REAL I LA DATA AL COMENÇAR LA CLASSE

    Serial.println("IES Gabriel Ciscar Aula Tecnologia 3");

  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(10, OUTPUT);

  if (!SD.begin(10)) {
    Serial.println("Initcializacio feta!");
    return;
  }
  Serial.println("initcializacio feta.");

  if (SD.exists("dades.txt")) {
    Serial.println("dades.txt existeix.");
  }
  else {
    Serial.println("dades.txt no existeix.");
  }

  // Obre un fitxer nou i tanca'l de forma immediata:
  Serial.println("Creant dades.txt...");
  myFile = SD.open("dades.txt", FILE_WRITE);
  myFile.close();

  // Comprova si el fitxer existeix: 
  if (SD.exists("dades.txt")) {
    Serial.println("dades.txt existeix.");
  }
  else {
    Serial.println("dades.txt no existeix.");  
  }
 
}

void loop() 

{
   // Actualitza l_hora a partir de l_hora configurada al setTime
  time_t t = now(); 
  hora = hour(t);
  minut= minute(t);
  segon= second(t);
  dia = day(t);
  mes= month(t);
  any= year(t);
  


 // Llegeix les dades

   volts = MGRead(MG_PIN);
   lecturaSensorCO2 =volts/DC_GAIN ;
   //LConcentracioCO2 = (ZERO_POINT_X+((MAX_POINT_X-ZERO_POINT_X)/(MAX_POINT_VOLTAGE -ZERO_POINT_VOLTAGE))*(lecturaSensorCO2-ZERO_POINT_VOLTAGE));
  // ConcentracioCO2 = pow(10, LConcentracioCO2);
   //Serial.println("Volts llegits= ");
   //Serial.println(volts);
  // Serial.println("Volts corregits= ");
 //  Serial.println(lecturaSensorCO2);
 
   //Bloc CO2 especytrometre
   mySerial.write(hexdata,9);
   delay(500);

 for(int i=0,j=0;i<9;i++)
 {
  if (mySerial.available()>0)
  {
     long hi,lo, CO2;
     int ch=mySerial.read();

    if(i==2){     hi=ch;   }   //High concentration
    if(i==3){     lo=ch;   }   //Low concentration
    if(i==8) {
               CO2=hi*256+lo;  //CO2 concentration
               valorRealCO2 = CO2;
      Serial.print("CO2 concentration: ");
      Serial.print(CO2);
      Serial.println("ppm");      
               }

  }   
  
 } //Final bloc espectrometre
   
// Mostra les dades pel terminal serie
 File dataFile  = SD.open("dades.txt", FILE_WRITE);
 Serial.print(dia);
 Serial.print("/");
 Serial.print(mes);
 Serial.print("/");
 Serial.print(any);
 Serial.print(" ");
 Serial.print(hora);
 Serial.print(":");
 Serial.print(minut);
 Serial.print(":");
 Serial.print(segon);
 Serial.print(" ");
 Serial.print(";");
 Serial.print(" ");
 Serial.print(lecturaSensorCO2);
 Serial.print(" ");
 Serial.print(";");
 Serial.print(" ");
 Serial.println(valorRealCO2 );
   
//Guarda les dades a la targeta SD
if (dataFile) {
 dataFile.print(dia);
 dataFile.print(" ");
 dataFile.print(";");
 dataFile.print(" ");
 dataFile.print(mes);
  dataFile.print(" ");
 dataFile.print(";");
 dataFile.print(" ");
 dataFile.print(any);
  dataFile.print(" ");
 dataFile.print(";");
 dataFile.print(" ");
 dataFile.print(hora);
  dataFile.print(" ");
 dataFile.print(";");
 dataFile.print(" ");
 dataFile.print(minut);
 dataFile.print(" ");
 dataFile.print(";");
 dataFile.print(" ");
 dataFile.print(segon);
 dataFile.print(" ");
 dataFile.print(";");
 dataFile.print(" ");
 dataFile.print(lecturaSensorCO2);
 dataFile.print(" ");
 dataFile.print(";");
 dataFile.print(" ");
 dataFile.println(valorRealCO2);
 
 dataFile.close();
} 
else {
  Serial.println("Error en obrir el fitxer");
  // if the file didn't open, do something here
}


 }

 /*****************************  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;
}

El programa també el tens en dins del zip CalibracioCO2.zip (zip - 2824 B).