Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
103 views

Code Script Arduino Sensor LCD

This document contains source code for an Arduino program that interfaces with an MQ-2 gas sensor module and Nokia 5110 LCD display to detect and display levels of LPG, CO, and smoke gases. It includes macros and functions for calibrating the sensor, reading resistance values, calculating gas concentrations from curves, and initializing and updating the LCD display.
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
103 views

Code Script Arduino Sensor LCD

This document contains source code for an Arduino program that interfaces with an MQ-2 gas sensor module and Nokia 5110 LCD display to detect and display levels of LPG, CO, and smoke gases. It includes macros and functions for calibrating the sensor, reading resistance values, calculating gas concentrations from curves, and initializing and updating the LCD display.
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 5

//E Found http://sandboxelectronics.com/?

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 : http://www.youtube.com/user/Shadow5549
Website, Forum and store are at http://mkme.org
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]sandboxelectronics.com
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
Serial.println("Running...");
display.begin();//Display code
display.setContrast(60);//Nokia 5110 works best at 50- no more flicker
delay(1000);
display.clearDisplay();
// clears the screen and buffer
display.setTextSize(1);
// set text size
display.setTextColor(BLACK);
//delay(1000);
// Splash Personal- taken from example code
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println(" Eric's");
display.println("");
display.println(" Gizmos");
display.println(" DooDad");

display.println("
Thingy");
display.display();
delay(1000);
display.clearDisplay();
// clears the screen and buffer
Serial.begin(9600); //UART setup, baudrate = 9600bps
display.setCursor(0,0);
display.println("Calibrating...");
display.display();
Ro = MQCalibration(MQ_PIN);
//Calibrating the sensor. Pl
ease make sure the sensor is in clean air
//when you perform the calib
ration
display.clearDisplay();
display.println("Calibration is done...");
display.print("Ro=");
display.println(Ro);
display.print("kohm");
//display.println("\n");
display.display();
delay(3000);
}
void loop()
{
display.clearDisplay();
// clears the screen and buffer
display.setCursor(0,0);
//display.print(" Intensity = ");
display.print("LPG:");
display.print(MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_LPG) );
display.println( "ppm" );
//display.print("
");
display.print("CO:");
display.print(MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_CO) );
display.println( "ppm" );
//display.print("
");
display.print("SMOKE:");
display.print(MQGetGasPercentage(MQRead(MQ_PIN)/Ro,GAS_SMOKE) );
display.print( "ppm" );
//display.print("\n");
display.display();
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])));
}

You might also like