105 lines
4.3 KiB
Arduino
Raw Normal View History

2020-03-29 22:03:45 -05:00
/*
MQUnifiedsensor Library - reading an MQ3
Demonstrates the use a MQ3 sensor.
Library originally added 01 may 2019
by Miguel A Califa, Yersson Carrillo, Ghiordy Contreras, Mario Rodriguez
Added example
modified 23 May 2019
by Miguel Califa
Updated library usage
2020-03-29 22:08:16 -05:00
modified 29 March 2020
2020-03-29 22:03:45 -05:00
by Miguel Califa
Wiring:
https://github.com/miguel5612/MQSensorsLib_Docs/blob/master/static/img/MQ_Arduino.PNG
2022-03-20 12:53:36 -05:00
Please make sure arduino A0 pin represents the analog input configured on #define pin - For this example this doesn't matter
2020-03-29 22:08:16 -05:00
You will connect your sensor to your external A2D Sensor
2020-03-30 19:17:25 -05:00
This example code is in the public domain.
2020-03-29 22:08:16 -05:00
Important:
1. Although it doesn't matter what pin you put in when initializing your MQ sensor function it is important that you don't
for any reason invoke the MQ.init() method because that method configures the selected pin as input and you may need it for
other use in the program.
2. You must ensure that your analog/digital converter will perform the conversion taking into account the output voltage
levels of the MQ sensor module.
3. You must ensure that when invoking the setADC(value) method the value you are passing is within the expected parameters,
for example if it is a 10-bit ADC converter, we expect a value between 0 and 2^10 = 1024
2020-03-29 22:03:45 -05:00
*/
//Include the library
#include <MQUnifiedsensor.h>
//Definitions
#define placa "Arduino UNO"
#define Voltage_Resolution 5
#define pin A0 //Analog input 0 -> This value can have any number, we recomend use A0
#define type "MQ-3 With A2D External connected" //MQ3
#define ADC_Bit_Resolution 10 // Resolution of your external A2D
#define RatioMQ3CleanAir 60 //RS / R0 = 60 ppm
//#define calibration_button 13 //Pin to calibrate your sensor
//Declare Sensor
MQUnifiedsensor MQ3(placa, Voltage_Resolution, ADC_Bit_Resolution, pin, type);
void setup() {
//Init the serial port communication - to debug the library
Serial.begin(9600); //Init serial port
//Set math model to calculate the PPM concentration and the value of constants
MQ3.setRegressionMethod(1); //_PPM = a*ratio^b
2022-03-20 12:53:36 -05:00
MQ3.setA(4.8387); MQ3.setB(-2.68); // Configure the equation to to calculate Benzene concentration
2020-03-29 22:03:45 -05:00
/*
Exponential regression:
Gas | a | b
LPG | 44771 | -3.245
CH4 | 2*10^31| 19.01
CO | 521853 | -3.821
Alcohol| 0.3934 | -1.504
Benzene| 4.8387 | -2.68
Hexane | 7585.3 | -2.849
*/
2020-03-30 19:17:25 -05:00
/*
//If the RL value is different from 10K please assign your RL value with the following method:
MQ3.setRL(10);
*/
2020-03-29 22:03:45 -05:00
/***************************** MQ CAlibration ********************************************/
// Explanation:
2022-03-20 12:53:36 -05:00
// In this routine the sensor will measure the resistance of the sensor supposedly before being pre-heated
// and on clean air (Calibration conditions), setting up R0 value.
// We recomend executing this routine only on setup in laboratory conditions.
// This routine does not need to be executed on each restart, you can load your R0 value from eeprom.
2020-03-29 22:03:45 -05:00
// Acknowledgements: https://jayconsystems.com/blog/understanding-a-gas-sensor
Serial.print("Calibrating please wait.");
float calcR0 = 0;
for(int i = 1; i<=10; i ++)
{
int yourA2DValue = random(0, 1024); // 10-bit emulation
2022-03-20 12:53:36 -05:00
MQ3.setADC(yourA2DValue);// Update data, the arduino will read the voltage from the analog pin
2020-03-29 22:03:45 -05:00
calcR0 += MQ3.calibrate(RatioMQ3CleanAir);
Serial.print(".");
}
MQ3.setR0(calcR0/10);
Serial.println(" done!.");
2022-03-20 12:53:36 -05:00
if(isinf(calcR0)) {Serial.println("Warning: Conection issue, R0 is infinite (Open circuit detected) please check your wiring and supply"); while(1);}
if(calcR0 == 0){Serial.println("Warning: Conection issue found, R0 is zero (Analog pin shorts to ground) please check your wiring and supply"); while(1);}
2020-03-29 22:03:45 -05:00
/***************************** MQ CAlibration ********************************************/
MQ3.serialDebug(true);
}
void loop() {
int yourA2DValue = random(0, 1024); // 10-bit emulation
2022-03-20 12:53:36 -05:00
MQ3.setADC(yourA2DValue); // Update data, the arduino will read the voltage from the analog pin
MQ3.readSensor(); // Sensor will read PPM concentration using the model, a and b values set previously or from the setup
2020-03-29 22:03:45 -05:00
MQ3.serialDebug(); // Will print the table on the serial port
delay(500); //Sampling frequency
}