PitMQSensor - MQ135 e MQ9

L'utilizzo dei sensori della serie MQ.

 

 

Di seguito alcuni esempi relativi all'utilizzo dei Sensori della Serie MQ.

Di fondamentale importanza l'articolo di Davide Gironi pubblicato su Elettronica IN n. 213 di marzo 2017.

Una parte dell'articolo si occupa di determinare la curva che meglio approssima la legge di comportamento del sensore e graficata nel datasheet.

Un'altra parte dell'articolo esplicita le relazioni che consentono, qualora sia nota la concentrazione del gas ricercato, di invertire le stesse al fine di determinare il parametro R0. Una volta noto e calibrato il sensore è possibile inserire il parametro nelle formule e determinare la variazione della concentrazione del gas ricercato.

Negli allegati sono state inserite le formule e la loro pratica applicazione in un caso particolare.

Fonti:

Appunti:

ozio_gallery_jgallery

Utlizzo e calibrazione del sensore:

Utilizzo del sensore e misura della CO2:

Cosa serve:

  • MQ135
  • MQ9
  • cavetti

Codice sorgente:


/*
	MQ    --> Sensore MQ del Pit by Zappoco
            Calibrazione e lettura dati
	per spiegazioni e applicazioni pratiche
	http://airqualityproject.altervista.org
	per alcune spiegazioni su come utilizzare i sensori
	https://www.inquinamento-italia.com/come-costruire-un-misuratore-di-gas-stand-alone-faidate-per-inquinanti-indoor-outdoor/
	per le funzioni 
	http://wiki.seeedstudio.com/Grove-Gas_Sensor-MQ9/
	for  MQ gas sensor correlation function estimation by datasheet 
	http://davidegironi.blogspot.com/2017/05/mq-gas-sensor-correlation-function.html#.W7j2z_Z9jBQ
	librerie:
	libreria iniziale: https://github.com/GeorgK/MQ135
	approfondimenti: https://github.com/zesteros/ArduinoAirQualityMonitor
	esempi funzioni calibrazione di molti sensori:
	https://github.com/empierre/arduino/blob/master/AirQuality-Multiple_Gas_Sensor1_4.ino
    Collegamenti 
    VCC --> 5V
    GND --> GND
    AOUT --> A5
*/
#define MQ135             //aggiungere/togliere il commento per MQ135/MQ9
//#define Calibrazione    //togliere il commento per calibrazione commentare per misurazione
					      //la stampa seriale è impostata per il plottaggio sul plotter seriale
#ifdef MQ135
  int MQ_sensorPin=A5;
  double MQ_coeff_a = 116.6020682;            // 109.1175
  double MQ_coeff_b = -2.769034857;           // -2.7927
  //double MQ_R0 = 19894.03/1000;
  //double MQ_R0 = 25894.03/1000;
  double MQ_R0 = 23632.59/1000;               //riportare il valore ottenuto con la calibrazione
#else
  int MQ_sensorPin=A3;
  double MQ_coeff_a = 581.5001;
  double MQ_coeff_b = -2.2053 ;
  double MQ_R0 = 145.74/1000;                 //riportare il valore ottenuto con la calibrazione
#endif
#ifdef Calibrazione
  int numCicli = 1000; 
  int intDelay = 20;
#else
  int numCicli = 1000; 
  int intDelay = 2;
#endif
void setup() {
    Serial.begin(9600);
}
void loop() {
  #ifdef Calibrazione
  	// 
  	// Calibrazione del sensore
  	// 
  	delay (3000);
  	#ifdef MQ135
  	  Serial.println ("|          MQ135-sensor         |");
  	#else
  	  Serial.println ("|           MQ9-sensor          |");
  	#endif
    Serial.println ("|             reading           |");
    Serial.println ("|                               |");
    double MQ_sensorVolt;
    double MQ_RS;      
    double MQ_R0;          
    double MQ_sensorValue;
  	#ifdef MQ135
  	  double MQ_ppm = 405.44 ;  // https://www.co2.earth/ ottobre 2018
  	#else
  	  double MQ_ppm = 0.1 ;     // CO concentration
  	#endif
    double MQ_ratio;
  	MQ_sensorValue = MQreading ();
  	#ifdef MQ135
  	  Serial.println ("|          MQ135-sensor         |");
  	#else
  	  Serial.println ("|           MQ9-sensor          |");
  	#endif
    Serial.println ("|           calibrating         |");
    Serial.println ("|              result           |");
    Serial.println ("|                               |");
    Serial.print ("MQ_meanSensorValue   = ");Serial.println (MQ_sensorValue);
    Serial.print ("numero di cicli      = ");Serial.println (numCicli);
    MQ_sensorVolt = MQ_sensorValue/1024*5.0;
    Serial.print ("MQ_sensorVolt        = ");Serial.println (MQ_sensorVolt);
    MQ_RS = (5.0-MQ_sensorVolt)/MQ_sensorVolt;
    Serial.print ("MQ_RS                = ");Serial.println (MQ_RS);
    Serial.print ("MQ_ppm               = ");Serial.println (MQ_ppm);
    Serial.print ("MQ_coeff_a           = ");Serial.println (MQ_coeff_a);
    Serial.print ("MQ_coeff_b           = ");Serial.println (MQ_coeff_b);
    MQ_ratio = powf( MQ_ppm / MQ_coeff_a  , 1 / MQ_coeff_b);
    Serial.print ("MQ_ratio             = ");Serial.println (MQ_ratio);
    MQ_R0 = MQ_RS / MQ_ratio;
    Serial.print ("MQ_R0                = ");Serial.println (MQ_R0);
    Serial.println("------------------------------------");
    Serial.print ("MQ_RS                = "); Serial.print(MQ_RS);    Serial.println(" kOhm");
    Serial.print ("MQ_ratio             = "); Serial.println(MQ_ratio);
    Serial.print ("MQ_R0 x 1000         = "); Serial.println(MQ_R0*1000);
    Serial.println("------------------------------------");
    delay (1000);
  #else
  	delay(3000);
  	double MQ_RS;
  	double MQ_sensorValue;
  	double MQ_sensorVolt;
  	double MQ_ratio;
    double MQ_ppm;
    MQ_sensorValue = MQreading ();
  	// Serial.print ("MQ_sensorValue = ");
  	Serial.print (MQ_sensorValue);
  	Serial.print (" , ");
  	//-----------------------------------------------//
  	MQ_sensorVolt = (float)MQ_sensorValue / 1024 * 5.0;
  	//Serial.print ("MQ_sensorVolt =");Serial.println (MQ_sensorVolt);
    MQ_RS = (5.0-MQ_sensorVolt)/MQ_sensorVolt;
  	//Serial.print ("MQ_RS   =");Serial.println (MQ_RS);
  	MQ_ratio = MQ_RS / MQ_R0;
  	//Serial.print ("MQ_ratio=");Serial.println (MQ_ratio);
    MQ_ppm = MQ_coeff_a * powf( MQ_ratio , MQ_coeff_b);
  	//Serial.print ("MQ_ppm = ");
  	Serial.println (MQ_ppm );
  #endif
}
double MQreading ()
{
    double MQ_value;
    for(int x = 0 ; x < numCicli  ; x++)
    {
      MQ_value = MQ_value + analogRead(MQ_sensorPin);
      delay(intDelay );
      #ifdef Calibrazione
        Serial.print (".");
        if (((x+1) % 100) == 0)
        {
          Serial.println ("");
        }
      #endif
    }
    MQ_value = MQ_value/numCicli;
    // MQ_sensorValue = 74.83;  //valore di test per controllo per MQ135
    // MQ_sensorValue = 121.56; //valore di test per controllo per MQ9
    return MQ_value;
}
// 0000 - 0400 elevata // 0401 - 0600 media // 0601 - 1000 moderata // 1001 - 2000 bassa // 2001 - pessima

 

Scarica tutto quello che serve: