/* 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 modified 29 March 2020 by Miguel Califa Wiring: https://github.com/miguel5612/MQSensorsLib_Docs/blob/master/static/img/MQ_Arduino.PNG Please take care, arduino A0 pin represent the analog input configured on #define pin - For this example this doesn't matter You will connect your sensor to your external A2D Sensor This example code is in the public domain. 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 */ //Include the library #include //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 MQ3.setA(4.8387); MQ3.setB(-2.68); // Configurate the ecuation values to get Benzene concentration /* 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 */ /* //If the RL value is different from 10K please assign your RL value with the following method: MQ3.setRL(10); */ /***************************** MQ CAlibration ********************************************/ // Explanation: // In this routine the sensor will measure the resistance of the sensor supposing before was pre-heated // and now is on clean air (Calibration conditions), and it will setup R0 value. // We recomend execute this routine only on setup or on the laboratory and save on the eeprom of your arduino // This routine not need to execute to every restart, you can load your R0 if you know the value // 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 MQ3.setADC(yourA2DValue);// Update data, the arduino will be read the voltage on the analog pin calcR0 += MQ3.calibrate(RatioMQ3CleanAir); Serial.print("."); } MQ3.setR0(calcR0/10); Serial.println(" done!."); if(isinf(calcR0)) {Serial.println("Warning: Conection issue founded, R0 is infite (Open circuit detected) please check your wiring and supply"); while(1);} if(calcR0 == 0){Serial.println("Warning: Conection issue founded, R0 is zero (Analog pin with short circuit to ground) please check your wiring and supply"); while(1);} /***************************** MQ CAlibration ********************************************/ MQ3.serialDebug(true); } void loop() { int yourA2DValue = random(0, 1024); // 10-bit emulation MQ3.setADC(yourA2DValue); // Update data, the arduino will be read the voltage on the analog pin MQ3.readSensor(); // Sensor will read PPM concentration using the model and a and b values setted before or in the setup MQ3.serialDebug(); // Will print the table on the serial port delay(500); //Sampling frequency }