ostaquet / Arduino-MQ131-driver

Arduino driver for gas sensor MQ131 (Ozone / O3)
MIT License
65 stars 19 forks source link

Unusual Sensor Reading #55

Closed NXTkoji closed 2 years ago

NXTkoji commented 2 years ago

Hello. I hope you can help me out again.

I have preheated the MQ-131 high concentration for 36 hours. My wiring connections are almost same as yours, except that I have an external power supply.

Picture1

The value from the sensor is unusually high, and was wondering if I did something wrong in calibration. Can you please help out?

Following is the result on serial monitor:

--- Terminal on /dev/cu.usbserial-1130 | 9600 8-N-1 --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time --- More details at https://bit.ly/pio-monitor-filters --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H Calibration in progress... Calibration parameters R0 = 977.52 Ohms Time to heat = 17 s Sampling... Concentration O3 : 12.34 ppm Concentration O3 : 12343.99 ppb Concentration O3 : 26.09 mg/m3 Concentration O3 : 26089.09 ug/m3 Sampling... Concentration O3 : 12.34 ppm Concentration O3 : 12343.99 ppb Concentration O3 : 26.09 mg/m3 Concentration O3 : 26089.09 ug/m3 Sampling...

My code is as follows: `#include

include

int temperature=26; //degrees celcius int humidity=50; // percent

void setup() { //Serial.begin(74880); Serial.begin(9600);

// Init the sensor // - Heater control on pin 2 (D4 if MiniD1) // - Sensor analog read on pin A0 // - Model HIGH_CONCENTRATION // - Load resistance RL of 1MOhms (1000000 Ohms) MQ131.begin(2,A0, HIGH_CONCENTRATION, 1000000);

Serial.println("Calibration in progress..."); MQ131.calibrate();

Serial.println("Calibration parameters"); Serial.print("R0 = "); Serial.print(MQ131.getR0()); Serial.println(" Ohms"); Serial.print("Time to heat = "); Serial.print(MQ131.getTimeToRead()); Serial.println(" s");

MQ131.setR0(MQ131.getR0()); MQ131.setTimeToRead(MQ131.getTimeToRead()); }

void loop() { delay(60000);

MQ131.setEnv(temperature, humidity);

Serial.println("Sampling..."); MQ131.sample();

Serial.print("Concentration O3 : "); Serial.print(MQ131.getO3(PPM)); Serial.println(" ppm"); Serial.print("Concentration O3 : "); Serial.print(MQ131.getO3(PPB)); Serial.println(" ppb"); Serial.print("Concentration O3 : "); Serial.print(MQ131.getO3(MG_M3)); Serial.println(" mg/m3"); Serial.print("Concentration O3 : "); Serial.print(MQ131.getO3(UG_M3)); Serial.println(" ug/m3");

} /***

NXTkoji commented 2 years ago

I tried with another MQ-131 (high concentration), brand new, preheated sensor, but the readings were the same as the previous test. Following is the message from the serial monitor.

Calibration in progress... Calibration parameters R0 = 977.52 Ohms Time to heat = 17 s Sampling... Concentration O3 : 12.34 ppm Concentration O3 : 12343.99 ppb Concentration O3 : 26.09 mg/m3 Concentration O3 : 26089.09 ug/m3 Sampling... Concentration O3 : 12.34 ppm Concentration O3 : 12343.99 ppb Concentration O3 : 26.09 mg/m3 Concentration O3 : 26089.09 ug/m3

NXTkoji commented 2 years ago

Found out that you have specified to change code in your library for high concentration. ' case HIGH_CONCENTRATION : // Use the equation to compute the O3 concentration in ppm

  // Compute the ratio Rs/R0 and apply the environmental correction
  ratio = lastValueRs / valueR0 * getEnvCorrectRatio();
  // R^2 = 0.9900
  // Use this if you are monitoring low concentration of O3 (air quality project)
  return convert(8.1399 * pow(ratio, 2.3297), PPM, unit);

  // R^2 = 0.9985 but nearly impossible to have 0ppm
  // Use this if you are constantly monitoring high concentration of O3
  // return convert((8.37768358 * pow(ratio, 2.30375446) - 8.37768358), PPM, unit);'

Followed the instruction and now I have a better reading.

Calibration parameters R0 = 977.52 Ohms Time to heat = 17 s Sampling... Concentration O3 : 4.27 ppm Concentration O3 : 4268.12 ppb Concentration O3 : 9.02 mg/m3 Concentration O3 : 9020.70 ug/m3

ostaquet commented 2 years ago

Hi @NXTkoji,

The high concentration sensor is manufactured with a detection range from 10ppm to 1000ppm (and not ppb ;-) ).

If you are performing measurements in clean air, I doubt you will reach 10ppm in real measurements.

As an example, the ozone in Belgium is about 107 ug/m3 (https://www.irceline.be/fr/qualite-de-lair/mesures/ozone). It means around 54 ppb (about 0.055 ppm). We are far below the minimum of the sensor.

The value you got in clean air is just a mathematical interpretation.

The high concentration sensor is really designed for the, as named :-), the high concentration sensing.

I hope it helps ;-)