/* Projeto 31 - Sensor de dióxido de carbono (MG-811)
Física na Lixa
https://fisicanalixa.blogspot.com/
https://sites.google.com/aelixa.pt/fisicaearduino
Mais informações em https://wiki.dfrobot.com/CO2_Sensor_SKU_SEN0159
*/
#define MG_PIN 0
#define DC_GAIN 8.5 // Ganho DC do amplificador
#define READ_SAMPLE_INTERVAL 50 // Número de amostras a registar
#define READ_SAMPLE_TIMES 5 // Intervalo de tempo, em milissegundos, entre cada amostra
#define ZERO_POINT_VOLTAGE 0.220 // Tensão de saída do sensor quando a concentração de CO2 é 400 ppm (depende de cada sensor)
#define REACTION_VOLTGAE 0.030 // Tensão de saída do sensor quando a concentração de CO2 é 1000 ppm (depende de cada sensor)
float CO2Curve[3] = {2.602,ZERO_POINT_VOLTAGE,(REACTION_VOLTGAE/(2.602-3))};
int PartesPorMilhao;
float volts; // Tensão de saída em V
void setup()
{
Serial.begin(9600);
}
void loop()
{
volts = MGRead(MG_PIN);
PartesPorMilhao = MGGetPercentage(volts,CO2Curve);
if (PartesPorMilhao == -1)
{
Serial.println("[CO2] < 400 ppm");
}
else
{
Serial.print("[CO2] = ");
Serial.print(PartesPorMilhao);
Serial.println(" ppm");
}
delay(500);
}
float MGRead(int mg_pin)
{
int i;
float v=0;
for (i=0;i<READ_SAMPLE_TIMES;i++)
{
v += analogRead(mg_pin);
delay(READ_SAMPLE_INTERVAL);
}
v = (v/READ_SAMPLE_TIMES)*5/1024;
return v;
}
int MGGetPercentage(float volts, float *pcurve)
{
if ((volts/DC_GAIN )>=ZERO_POINT_VOLTAGE)
{
return -1;
}
else
{
return pow(10, ((volts/DC_GAIN)-pcurve[1])/pcurve[2]+pcurve[0]);
}
}
/* Projeto 31 - Sensor de dióxido de carbono (MG-811) com ligação ao excel
Física na Lixa
https://fisicanalixa.blogspot.com/
https://sites.google.com/aelixa.pt/fisicaearduino
Mais informações em https://wiki.dfrobot.com/CO2_Sensor_SKU_SEN0159
*/
#define MG_PIN 0
#define DC_GAIN 8.5 // Ganho DC do amplificador
#define READ_SAMPLE_INTERVAL 50 // Número de amostras a registar
#define READ_SAMPLE_TIMES 5 // Intervalo de tempo, em milissegundos, entre cada amostra
#define ZERO_POINT_VOLTAGE 0.220 // Tensão de saída do sensor quando a concentração de CO2 é 400 ppm (depende de cada sensor)
#define REACTION_VOLTGAE 0.030 // Tensão de saída do sensor quando a concentração de CO2 é 1000 ppm (depende de cada sensor)
float CO2Curve[3] = {2.602,ZERO_POINT_VOLTAGE,(REACTION_VOLTGAE/(2.602-3))};
int PartesPorMilhao;
float volts; // Tensão de saída em V
unsigned long tempo;
void setup()
{
Serial.begin(9600);
Serial.println("CLEARDATA");
Serial.println("LABEL, ,Tempo,ppm");
}
void loop()
{
volts = MGRead(MG_PIN);
PartesPorMilhao = MGGetPercentage(volts,CO2Curve);
tempo = millis();
if (PartesPorMilhao != -1)
{
Serial.print("DATA, ,"); Serial.print(tempo); Serial.print(","); Serial.println(PartesPorMilhao);
}
delay(500);
}
float MGRead(int mg_pin)
{
int i;
float v=0;
for (i=0;i<READ_SAMPLE_TIMES;i++)
{
v += analogRead(mg_pin);
delay(READ_SAMPLE_INTERVAL);
}
v = (v/READ_SAMPLE_TIMES)*5/1024;
return v;
}
int MGGetPercentage(float volts, float *pcurve)
{
if ((volts/DC_GAIN )>=ZERO_POINT_VOLTAGE)
{
return -1;
}
else
{
return pow(10, ((volts/DC_GAIN)-pcurve[1])/pcurve[2]+pcurve[0]);
}
}