/home/luck/ixg/Proyectos/SensorCO2/Software/Arduino/MQ-135/MQ-135.
ino
Página 1 de 7 mié 17 ago 2022 22:31:08
1 /*
2 Sensor de CO2 con MQ135
3 =======================
4
5 Se utiliza un sensor MQ135 para medir el dióxido de
carbono y un sensor
6 DHT11 para medir la temperatura ambiente y la humedad
relativa, datos
7 necesarios para corregir la lectura del sensor de CO2
8 */
9 #include <math.h>
10 #include <Adafruit_Sensor.h>
11 #include <DHT.h>
12 #include <DHT_U.h>
13
14 #define VCC 4.38 // Volts
15 #define ADRES 1023 // cuentas
16 #define RL 220 // KOhms
17
18 // Se usa el sensor DHT11
19 #define DHTTYPE DHT11
20 // El DHT11 se alimenta con un pin digital porque tiene
muy poco consumo
21 #define DHT11VCC 11
22 // El pin de datos del DHT11 se conecta al pin 11
23 #define DHT11DATOS 12
24
25 // Pin 4 del DTH11 es N/C
26 #define DTH11NC 13
27
28
29
30 DHT_Unified dht(DHT11DATOS, DHTTYPE);
- 1 -
/home/luck/ixg/Proyectos/SensorCO2/Software/Arduino/MQ-135/[Link]
Página 2 de 7 mié 17 ago 2022 22:31:08
31 uint32_t delayMS;
32
33
34
35 struct tyh{
36 float t, h;
37 };
38 struct tyh dht11(void), a;
39 float concentracionMQ135(float temp, float hr);
40
41 float correctorHT(float temp, float hr);
42
43 float f33(float temp);
44 float f85(float temp);
45
46 float R0; // Resistencia a la consentración de referencia
47 void setup() {
48 // Puerto serie a 9600 bits por segundo
49 [Link](9600);
50
51 // Inicializo el DHT11
52
53 // Pin de alimentación
54 pinMode(DHT11VCC, OUTPUT);
55 digitalWrite(DHT11VCC,HIGH);
56
57 // Pongo a masa el pin 3 (N/C) del DHT11
58 pinMode(DTH11NC, OUTPUT);
59 digitalWrite(DTH11NC,LOW);
60
61 delay(100);
62 [Link]();
63
- 2 -
/home/luck/ixg/Proyectos/SensorCO2/Software/Arduino/MQ-135/[Link]
Página 3 de 7 mié 17 ago 2022 22:31:08
64 R0 = calibrar();
65
66 }
67
68
69 void loop() {
70 float ppmCO2;
71 a = dht11();
72 ppmCO2 = concentracionMQ135(a.t, a.h);
73 for (;ppmCO2 < 390;){
74 [Link]("Error de calibración.");
75 R0 = calibrar();
76 delay(100);
77 ppmCO2 = concentracionMQ135(a.t, a.h);
78 }
79 [Link]("Temperatura [C]: "); [Link](a.t);
80 [Link]("Humedad [%]: "); [Link](a.h);
81 [Link]("CO2 [ppm]: "); [Link](ppmCO2);
82 [Link]("Corrector:
");[Link](correctorHT(a.t,a.h));
83 delay(1000);
84 [Link]("--------------");
85
86
87 }
88
89 float concentracionMQ135(float temp, float hr){
90 float C = 0, C1; // C: Concentración corregida
91 float avr = 0, avr1 =0; // avr: c. promedio corregido,
avr1: c. prom. s/corregir
92 int n = 0;
93 float Vo, maximo=0;
94 float cuenta =0;
- 3 -
/home/luck/ixg/Proyectos/SensorCO2/Software/Arduino/MQ-135/[Link]
Página 4 de 7 mié 17 ago 2022 22:31:08
95 float RS =0, RSP = 0;
96 for(n=0; n<10; n++){
97 // EL MQ135 debe tener conectada su salida A0 al pin
A0 del arduino
98 cuenta = analogRead(A0); // cuentas del conversor
99 Vo = cuenta * (VCC / ADRES);
100 RS = VCC/Vo*RL - RL;
101 RSP = RSP + RS;
102 }
103 RSP = RSP / n;
104 //[Link]("\n RS:: "); [Link](RS,5);
105 // Determino el valor de la concentración
106 C = pow(10,((log10((RSP/R0)*correctorHT(temp, hr)) -
0.714)/(-0.345)));
107 C1 = pow(10,((log10((RSP/R0)) - 0.714)/(-0.345)));
108 delay(1);
109 //avr = C + avr;
110 //avr1 = C1 + avr1;
111
112 //[Link] ("\nVo:: "); [Link](Vo, 5);
113 //[Link] ("C:: "); [Link](avr1/n, 5);
114 // [Link]("\n RS:: "); [Link](RSP,5);
115 return C;
116
117
118 }
119 struct tyh dht11(void){
120 struct tyh a;
121
122 // Instancia de sensor_t
123 sensor_t sensor;
124 delayMS = sensor.min_delay / 1000;
125 // Delay between measurements.
- 4 -
/home/luck/ixg/Proyectos/SensorCO2/Software/Arduino/MQ-135/[Link]
Página 5 de 7 mié 17 ago 2022 22:31:08
126 //delay(delayMS);
127 // Leer temperatura
128 sensors_event_t event;
129 [Link]().getEvent(&event);
130 if (isnan([Link])) {
131 [Link](F("Error al leer la temperatura"));
132 }
133 else {
134 a.t = [Link];
135 }
136 // Leer humedad
137 [Link]().getEvent(&event);
138 if (isnan(event.relative_humidity)) {
139 [Link](F("Error al leer la humedad"));
140 }
141 else {
142 a.h = event.relative_humidity;
143 }
144 return a;
145 }
146
147 float correctorHT(float temp, float hr){
148 /*
149 * Toma la temperatura, la humedad relativa y la
concentración en crudo
150 * y devuelve el valor corregido teniendo en cuenta la
temperatura y la
151 * humedad.
152 */
153 float factor;
154 float m, b;
155 m = (f33(temp) - f85(temp))/(33 - 85);
156 b = f33(temp) - m*33;
- 5 -
/home/luck/ixg/Proyectos/SensorCO2/Software/Arduino/MQ-135/[Link]
Página 6 de 7 mié 17 ago 2022 22:31:08
157 return m*hr + b;
158 }
159
160 float f33(float temp){
161 /*
162 * calculo la correccion para RS/R0 con HR = 33%
163 */
164 return 1.351603187519847 + temp*-0.02842390441409971 +
pow(temp,2) * 6.468087587329311e-4 +
pow(temp,3)*-5.231075341378215e-6;
165 //return 1.351 + temp*-0.028 + pow(temp,2) * 6.4681e-4
+ pow(temp,2)*-5.231e-6;
166 }
167
168 float f85(float temp){
169 /*
170 * calculo la correccion para RS/R0 con HR = 85%
171 */
172 return 1.222043128771038 + temp*-0.02391683867894569
+ pow(temp,2) * 3.894454092569069e-4 + pow(temp,
3)*-1.560564861860908e-6;
173 }
174
175 float calibrar(){
176 /*
177 * Esta función calcula el valor de R0 necesario para
calcular la concentración. Se supone
178 * que el sensor ya se encuentra adecuadamente
calentado (quizá con 24 horas de encendido)
179 * y que está inmerso en una atmósfera con una
concentración de CO2 de 400 ppm (valor
180 * estandard de la atmósfera al aire libre y sin polución
181 */
- 6 -
/home/luck/ixg/Proyectos/SensorCO2/Software/Arduino/MQ-135/[Link]
Página 7 de 7 mié 17 ago 2022 22:31:08
182
183 int n = 0, cuenta;
184 float Vo, RS, RSP, __R0;
185 struct tyh a;
186
187 a = dht11(); //leo temperatura y humedad
188 [Link]("Calibrando...");
189 // Leo el valor de RS y saco el valor promedio RSP
190 for(n=0; n<100; n++){
191 // EL MQ135 debe tener conectada su salida A0 al pin
A0 del arduino
192 cuenta = analogRead(A0); // cuentas del conversor
193 Vo = cuenta * (VCC / ADRES);
194 RS = VCC/Vo*RL - RL;
195 RSP = RSP + RS;
196 }
197 RSP = RSP / n;
198 __R0 = (RSP * 1.526); // * correctorHT(a.t, a.h);
199
200 return __R0;
201
202 }
203
- 7 -