//E Found [Link]
p=165
/*
This is a work in progress but hopefully it will help someone else by providing
a base to start and work from.
Please check out my Youtube videos here and consider a thumbs up if this helped
you!
Youtube : [Link]
Website, Forum and store are at [Link]
Pin
pin
pin
pin
pin
pin
*/
11 for contrast on the Nokia 5110
7 - Serial clock out (SCLK)
6 - Serial data out (DIN)
5 - Data/Command select (D/C)
4 - LCD chip select (CS)
3 - LCD reset (RST)
/*******************Demo for MQ-2 Gas Sensor Module V1.0************************
*****
Support: Tiequan Shao: support[at][Link]
Lisence: Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)
Note:
. More
This piece of source code is supposed to be used as a demostration ONLY
sophisticated calibration is required for industrial field application.
Sandbox Electronics
201104-25
********************************************************************************
****/
/************************Hardware Related Macros********************************
****/
#define
MQ_PIN
(0)
//define which analog input
channel you are going to use
#define
RL_VALUE
(5)
//define the load resistanc
e on the board, in kilo ohms
#define
RO_CLEAN_AIR_FACTOR
(9.83) //RO_CLEAR_AIR_FACTOR=(Sens
or resistance in clean air)/RO,
//which is derived from the
chart in datasheet
/***********************Software Related Macros*********************************
***/
#define
CALIBARAION_SAMPLE_TIMES
(50)
//define how many samples y
ou are going to take in the calibration phase
#define
CALIBRATION_SAMPLE_INTERVAL (500) //define the time interal(i
n milisecond) between each samples in the
//cablibration phase
#define
READ_SAMPLE_INTERVAL
(50)
//define how many samples y
ou are going to take in normal operation
#define
READ_SAMPLE_TIMES
(5)
//define the time interal(i
n milisecond) between each samples in
//normal operation
/**********************Application Related Macros*******************************
***/
#define
GAS_LPG
(0)
#define
GAS_CO
(1)
#define
GAS_SMOKE
(2)
/*****************************Globals*******************************************
****/
float
LPGCurve[3] = {2.3,0.21,-0.47}; //two points are taken from
the curve.
//with these two points, a l
ine is formed which is "approximately equivalent"
//to the original curve.
//data format:{ x, y, slope}
; point1: (lg200, 0.21), point2: (lg10000, -0.59)
float
COCurve[3] = {2.3,0.72,-0.34};
//two points are taken from
the curve.
//with these two points, a l
ine is formed which is "approximately equivalent"
//to the original curve.
//data format:{ x, y, slope}
; point1: (lg200, 0.72), point2: (lg10000, 0.15)
float
SmokeCurve[3] ={2.3,0.53,-0.44};
//two points are taken from
the curve.
//with these two points, a l
ine is formed which is "approximately equivalent"
//to the original curve.
//data format:{ x, y, slope}
; point1: (lg200, 0.53), point2: (lg10000, -0.22)
float
lo ohms
Ro
= 10;
//Ro is initialized to 10 ki
#include "Adafruit_GFX.h"
#include "Adafruit_PCD8544.h"
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);//4 and 3 are reverse
d on the cheap eBay models
void setup()
{
analogWrite(11,220);// PWM of LCD backlight but ebay unit is backwards//must go high + cycle to dim
//Very Dim=230
[Link]("Running...");
[Link]();//Display code
[Link](60);//Nokia 5110 works best at 50- no more flicker
delay(1000);
[Link]();
// clears the screen and buffer
[Link](1);
// set text size
[Link](BLACK);
//delay(1000);
// Splash Personal- taken from example code
[Link](1);
[Link](BLACK);
[Link](0,0);
[Link](" Eric's");
[Link]("");
[Link](" Gizmos");
[Link](" DooDad");
[Link]("
Thingy");
[Link]();
delay(1000);
[Link]();
// clears the screen and buffer
[Link](9600); //UART setup, baudrate = 9600bps
[Link](0,0);
[Link]("Calibrating...");
[Link]();
Ro = MQCalibration(MQ_PIN);
//Calibrating the sensor. Pl
ease make sure the sensor is in clean air
//when you perform the calib
ration
[Link]();
[Link]("Calibration is done...");
[Link]("Ro=");
[Link](Ro);
[Link]("kohm");
//[Link]("\n");
[Link]();
delay(3000);
}
void loop()
{
[Link]();
// clears the screen and buffer
[Link](0,0);
//[Link](" Intensity = ");
[Link]("LPG:");
[Link](MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_LPG) );
[Link]( "ppm" );
//[Link]("
");
[Link]("CO:");
[Link](MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_CO) );
[Link]( "ppm" );
//[Link]("
");
[Link]("SMOKE:");
[Link](MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_SMOKE) );
[Link]( "ppm" );
//[Link]("\n");
[Link]();
delay(200);
}
/****************** MQResistanceCalculation ************************************
****
Input: raw_adc - raw value read from adc, which represents the voltage
Output: the calculated sensor resistance
Remarks: The sensor and the load resistor forms a voltage divider. Given the vol
tage
across the load resistor and its resistance, the resistance of the sens
or
could be derived.
********************************************************************************
****/
float MQResistanceCalculation(int raw_adc)
{
return ( ((float)RL_VALUE*(1023-raw_adc)/raw_adc));
}
/***************************** MQCalibration ***********************************
*****
Input: mq_pin - analog channel
Output: Ro of the sensor
Remarks: This function assumes that the sensor is in clean air. It use
MQResistanceCalculation to calculates the sensor resistance in clean ai
r
and then divides it with RO_CLEAN_AIR_FACTOR. RO_CLEAN_AIR_FACTOR is ab
out
10, which differs slightly between different sensors.
********************************************************************************
****/
float MQCalibration(int mq_pin)
{
int i;
float val=0;
for (i=0;i<CALIBARAION_SAMPLE_TIMES;i++) {
//take multiple samples
val += MQResistanceCalculation(analogRead(mq_pin));
delay(CALIBRATION_SAMPLE_INTERVAL);
}
val = val/CALIBARAION_SAMPLE_TIMES;
//calculate the average
value
val = val/RO_CLEAN_AIR_FACTOR;
R_FACTOR yields the Ro
//divided by RO_CLEAN_AI
//according to the chart
in the datasheet
return val;
}
/***************************** MQRead *****************************************
****
Input: mq_pin - analog channel
Output: Rs of the sensor
Remarks: This function use MQResistanceCalculation to caculate the sensor resist
enc (Rs).
The Rs changes as the sensor is in the different consentration of the t
arget
gas. The sample times and the time interval between samples could be co
nfigured
by changing the definition of the macros.
********************************************************************************
****/
float MQRead(int mq_pin)
{
int i;
float rs=0;
for (i=0;i<READ_SAMPLE_TIMES;i++) {
rs += MQResistanceCalculation(analogRead(mq_pin));
delay(READ_SAMPLE_INTERVAL);
}
rs = rs/READ_SAMPLE_TIMES;
return rs;
}
/***************************** MQGetGasPercentage *****************************
*****
Input: rs_ro_ratio - Rs divided by Ro
gas_id
- target gas type
Output: ppm of the target gas
Remarks: This function passes different curves to the MQGetPercentage function w
hich
calculates the ppm (parts per million) of the target gas.
********************************************************************************
****/
int MQGetGasPercentage(float rs_ro_ratio, int gas_id)
{
if ( gas_id == GAS_LPG ) {
return MQGetPercentage(rs_ro_ratio,LPGCurve);
} else if ( gas_id == GAS_CO ) {
return MQGetPercentage(rs_ro_ratio,COCurve);
} else if ( gas_id == GAS_SMOKE ) {
return MQGetPercentage(rs_ro_ratio,SmokeCurve);
}
return 0;
}
/***************************** MQGetPercentage ********************************
**
Input: rs_ro_ratio - Rs divided by Ro
pcurve
- pointer to the curve of the target gas
Output: ppm of the target gas
Remarks: By using the slope and a point of the line. The x(logarithmic value of
ppm)
of the line could be derived if y(rs_ro_ratio) is provided. As it is a
logarithmic coordinate, power of 10 is used to convert the result to no
n-logarithmic
value.
********************************************************************************
****/
int MQGetPercentage(float rs_ro_ratio, float *pcurve)
{
return (pow(10,( ((log(rs_ro_ratio)-pcurve[1])/pcurve[2]) + pcurve[0])));
}