I am using an RL of 20k ohm, and having implemented the variable voltage for the heater using PWM, I am getting readings of sorts from the analog read (typically around 950).
How can I go about converting this into ppm, as per the datasheet? I can't figure out what it is expecting me to do.
So now you have a formula to make the reference measurement Ro.
If you make a measurement Rs then you can calculate the ratio Rs/Ro which can be looked up the diagram in the datasheet. To do this automagically you need to create a lookup table. The Rs/R0 varies from 0.05 - 1.5. As floats cannot be used as an index for a lookup table you better multiply them with 20 giving the values 1..30. The table is filled with PPM values.
This results in code something like below. (not complete, only indicative code, no guarantees, all disclaimers apply
Hi everybody, I don't fully understand why Rs/Rl = (Vc-Vrl) / Vrl
Hi Thermike,
Take figure 2 of the datasheet:
The resistance of the sensor Rs is the unknown value and need to be searched for. note that Rs and Rl make a voltage divider which converts Vc into Vrl.
We know that the current through Rl equals the current through Rs:
(1) Ampere(RL) == Ampere(Rs)
Ohms law states A = V/R:
So we can express the currents as:
(2) Ampere(RL) = Vrl/Rl
(3) Ampere(Rs) = (Vc-Vrl)/Rs // e.g. Vc = 5Volt and Vrl = 3Volt, the voltage over Rs = 5-3 = 2Volt
filling (2) and (3) into (1) gives:
(4) Vrl/Rl == (Vc-Vrl)/Rs
Multiply with Rs on both sides gives:
(5) Rs*Vrl/Rl == (Vc -Vrl)
Divide by Vrl on both sides gives:
(6) Rs/Rl == (Vc -Vrl)/Vrl
QED,
Hopes this helpes.
Rob
@Cronus & Thermike
if you succeeded in making a working sketch, please post your code / schematics
// This sensor can detect smoke, methane, carbon dioxide and other gases
//VARIABLES
float Ro = 10000.0; // this has to be tuned 10K Ohm
int sensorPin = 0; // select the input pin for the sensor
int ledPin = 13; // select the pin for the LED
int val = 0; // variable to store the value coming from the sensor
float Vrl = 0.0;
float Rs = 0.0;
float ratio = 0.0;
// SETUP
void setup() {
pinMode(ledPin, OUTPUT); // declare the ledPin as an OUTPUT
Serial.begin(9600); // initialize serial communication with computer
// analogReference(EXTERNAL);
}
val = analogRead(sensorPin); // read the value from the analog sensor
Serial.println(val); // send it to the computer (as ASCII digits)
digitalWrite(ledPin, HIGH); // turn the ledPin on
delay(100); // stop the program for some time
digitalWrite(ledPin, LOW); // turn the ledPin off
delay(100); // stop the program for some time
Vrl = val * ( 5.00 / 1024.0 ); // V
Rs = 20000 * ( 5.00 - Vrl) / Vrl ; // Ohm
ratio = Rs/Ro;
i use a mq135 air quality sensor and i have i problem how to convert the values.
this is the datasheet of the sensor. http://www.cooking-hacks.com/skin/frontend/default/cooking/pdf/MQ-135.pdf
i can't understand what is the value i receive! is it Rs?is it Rs+RL?what is it?
For sensor MQ135: Rs/RL=Vc/(Vrl-1).
Could somebody help me with the code?
the code i use , is a code from the examples:
int sensorValue;
void setup()
{
Serial.begin(9600); // sets the serial port to 9600
}
void loop()
{
sensorValue = analogRead(0); // read analog input pin 0
Serial.println(sensorValue, DEC); // prints the value read
delay(100); // wait 100ms for next reading
}
the value that you are measuring is a function of Vrl: Vrl = sensorValue * 5.0 / 1024.0. Vc is 5.0 volts, if you are connecting the sensor to a regulated power source on the Arduino. Rl is, according to the schematic, 10K.
Now, how that will help you, I don't know. The charts are all log charts, so any ppm reading will involve the log function.
i see.. i try to use the code which is posted by thermike. well i dont know exactly if its correct because i also have difficulty in interpreting the datasheet. what ive done is. every 1.4V cycle i get the value of CO and then display in LCD.im really confused
Don't know if it's of any help to you, but at the refinery I worked at they had hundreds of gas detectors, mostly for safety alarming purposes. CO2, H2S, O2, etc. These were pretty expensive industrial instruments, but the typical calibration procedure was using ambient air for the 'zero' value, and purchased 'calibration gas' bottle/regulators for setting the upper end value of the scale. That is, there was no way to calibrate just using internal voltage values, or constant values, etc, as these kinds of sensors have a finite life and age over time, so accuracy is only as good as the calibration gas you use and how frequently you performed it. We did monthly or quartily depending on the gas type and area safety ratings. The calibration gas bottles were pretty expensive also, plus they had a specified shelf life that when passed their accuracy became 'invalid' and we would have to send them back for refilling even if not empty.
Okay, now the MQ-2 seems to be working fine using the following code:
int sensorValue;
void setup()
{
Serial.begin(9600); // sets the serial port to 9600
}
void loop()
{
sensorValue = analogRead(0); // read analog input pin 0
Serial.println(sensorValue, DEC);
if (sensorValue >= 5) {
Serial.println("Someone let one rip!");
delay(10000);
}
}