Omet navegació

16.1 Sensor 0159 (MG811) + Exemple amb dades

El sensor 0159 disposa d'una electroquímica al seu interior que és sensible a la variació del CO2.

L'electróde del sensor de CO2 té la següent estructura.

Electróde de CO2 MG811

 

Té una capa d'electròlit sòlid (1) , elèctrodes d'or (2) , fils de platí (3), Escalfador (4), tubs de porcellana (5),100m d'una doble capa d'acer inoxidable (6), anell platejat de coure i niquel (7), baquelita  aïllant (8), pin (pota) de coure i niquel (9).

Aquest sensor és una cel·la electroquímica sòlida composada de les següents cel·les:

Aire , Au|NASICON || carbonat|Au , aire, CO2

El NASICON (Na3Zr2Si2PO12) és conductor super iònic sòlid ceràmic.

Quan el sensor s'exposa al CO2, les següents reaccions ocorren:

Reacció catòdica:  reacció catòdica
Reacció anòdica:  reacció anòdica

La reacció química resultant és: reacció resultant 

La força electromotriu (FEM) resultant de la reacció de l' elèctrode d'acord amb l'equació de Nerst  és:

 potencial corregit electrode

on P(CO2)és la pressió parcial del CO2 mesurada en Pascals.
on Eo és el potencial de reducció estàndard tabulat en taules químiques..
on R val 8,3144 J/K i és la constant dels gasos.
on T és la Temperatura absoluta en ºK

on F val 96486 Coulombs/mol és la Constant de Faraday.

on FEM és la força electromotriu mesura en mV una vegada amplificada amb un amplificador operacional.

 La tensió del sensor cal que siga 6V per escalfar la resistència suficient i llavors es comporta con una cel·la d'acord amb la llei de Nerst, això és veu en la figura següent.

Tensió alimentació MG811

 

El valor de la FEM es compara amb la lectura d'un espectrofotòmetre d'infraroig que mesura la concentració de CO2 en ppm. Calibrant el sensor mitjançant la lectura de dos concentracions i el seu estudi logarítmic  ens permet agafar les mesures de CO2.

Sensitivity SEN0159

 

2. Esquema elèctric.

Anem a veure l'esquema elèctric que connectarem a la targeta Arduino.

Esquema elèctric mesura de CO2
C.Ferrando (CC BY-NC-SA)



El programa per mesurar els V i provar el sensor degudament calibrat és aquest:

// TiH-File_DFRobot.ino Programa per enregistrar Temperatura en ºC ,Humitat en % , CO2 en ppm i la data en format (day,month,yr,hr,min,sec) a una tergeta SD o microSDHC
// Per fer aquest programa s'han gastat les fonts 1 , 2 i 3 que segueixen
// Font1: http://playground.arduino.cc/Main/DHTLib
// Font2: https://www.arduino.cc/en/Tutorial/Files
// Font3 = https://www.dfrobot.com/wiki/index.php/CO2_Sensor_SKU:SEN0159
// 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
// Modificat per Carles Ferrando el 18 de març de 2017
// Llicència: GNU GPL v3: https://www.gnu.org/licenses/gpl.html

#include <SD.h>
File myFile;
#include <dht.h>
dht DHT;
#define DHT22_PIN 7 // Port sensor temperatura i humitat
#include <Time.h>  

//Definim temperatura i humitat relativa reals mesurades pel sensor DHT11 de DFRobot
float temperatura; // T en ºC
float humitat; // Humitat relativa %

//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.894976231; // log785.1926605505 = 2.894976231, el punt inicial a l'eix X de la corba 
float ZERO_POINT_VOLTAGE = 0.2370642202; //defineix la eixida del sensor en Volts quan la concentració de CO2 es 785,1926605505 PPM
float MAX_POINT_VOLTAGE = 0.0525 ; //defineix la eixida del sensor en volts quan la concentració de CO2 és 9731,75 PPM
float MAX_POINT_X = 3.9881909438 ; //log(9731.75)=3.9881909438 el punt final de la corba logaritmica 


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

void setup()
{
 // Obre el port serie de comunicacions i espera per connectar al port
  Serial.begin(9600);
   while (!Serial) {
    ; // espera per connectar al port. Necessari sols per  Leonardo
  }

  //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(11,07 ,00,6,2,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);
  
 File dataFile  = SD.open("dades.txt", FILE_WRITE);

// Llegeix les dades
   int chk = DHT.read22(DHT22_PIN);
   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);
   
   
 // Mostra les dades pel terminal serie
 humitat=DHT.humidity ;  
 temperatura= DHT.temperature;
 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(humitat);
 Serial.print(" ");
 Serial.print(";");
 Serial.print(" ");
 Serial.print(temperatura);
 Serial.print(" ");
 Serial.print(";");
 Serial.print(" ");
 Serial.println(ConcentracioCO2 );
   
//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(humitat);
 dataFile.print(" ");
 dataFile.print(";");
 dataFile.print(" ");
 dataFile.print(temperatura);
 dataFile.print(" ");
 dataFile.print(";");
 dataFile.print(" ");
 dataFile.println(ConcentracioCO2);
 
 dataFile.close();
} 
else {
  Serial.println("Error en obrir el fitxer");
  // if the file didn't open, do something here
}

delay (60000); // Espera 60 segons entre cada mesura

}


/*****************************  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 el tens també ací en  un zip: TiHCO2_File.zip (zip - 2788 B)                           

Exemple amb dades reals:

Hem tancat una kalamchoe en un recipient tancat amb sensors de temperatura , humitat i CO2 durant tres dies i hem mesurat les dades de l'atmosfera per monitoritzar la respiració i la fotosíntesi amb el programa anterior.

Ací tens un diagrama amb la temperatura en º Centigrads durant els 2 dies que va durar l'experiment.

Temperatura vs temps
C. Ferrando (CC BY-NC-SA)



Ací tens un diagrama amb la humitat relativa en % durant els 2 dies que va durar l'experiment.

Humitat vs temps
C. Ferrando (CC BY-NC-SA)



Ací tens un diagrama amb la concentració de CO2 en ppm durant els 2 dies que va durar l'experiment.

CO2 vs temps
C. Ferrando (CC BY-NC-SA)



Ací tens un diagrama amb la concentració de O2 (calculada) en ppm durant els 2 dies que va durar l'experiment.

O2 vs temps
C. Ferrando (CC BY-NC-SA)

1) Cerca informació sobre la fotosíntesis CAM i es plantes crassulàcies.

2) Sabries dir si els estomes de la kalamchoe estan tancats completament durant tot el dia ? Respon argumentant amb dades d'alguna gràfica.

3) Sabries explicar que fa la kalamchoe durant la nit ? Respon argumentant amb dades d'alguna gràfica.