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:
- Fonte 1: Davide Gironi
- Fonte 2: Inquinamento Italia
- Fonte 3: GitHub - George K
- Fonte 4: GitHub - Empierre K
Appunti:
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