Por David Peaslee
Construir un detector de CO (monóxido de carbono) que pueda alertarte de niveles peligrosos de CO puede hacerse con tan solo un sensor de gas, un Arduino (u otro microcontrolador) y algunas resistencias. Añadiendo unos cuantos op-amps se puede aumentar la sensibilidad para medir la cantidad de CO presente en el ambiente. Ampliando estos conocimientos, puedes construir tu propia estación de control de la calidad del aire, y comparar tu propio patio trasero con los niveles reportados por las estaciones meteorológicas locales.
Materiales necesarios
- 1 Arduino Uno
- 1 multímetro (DMM)
- 1 protoboard con varios cables de puente
- 2 Resistencias de 10 kΩ
- 1 Resistencia de 100 kΩ
- 1 Sensor de gas CO SPEC (Número de pieza Digi-Key: 1684-1000-ND)
Historia del proyecto
Mientras trabajaba en una empresa de sensores de gas, trabajé con muchas startups que tenían muchas ideas geniales para medir la calidad del aire. Aunque realmente espero que todo el mundo tenga algún día sensores de gas en sus teléfonos y ordenadores, por ahora, me gustaría ayudar al Hacedor cotidiano a construir sus propios sistemas de monitorización del aire.
Para este proyecto, me gustaría empezar por lo básico: ¿Qué hace que un sensor electroquímico funcione?
- Hay dos tipos básicos de sensores de gas electroquímicos, de 2 electrodos y de 3 electrodos. Ambos funcionan con los mismos principios básicos. Un gas se difunde en el sensor y se dirige al electrodo de trabajo. Allí reacciona con un catalizador y crea iones (moléculas cargadas). Esos iones se mueven a través del electrolito (a veces similar al ácido de la batería) y vuelven a reaccionar en el contraelectrodo, donde los electrones se liberan (o se recogen) para moverse por el circuito. Dependiendo del gas que esté reaccionando y del catalizador, esos electrones pueden entrar o salir de cualquiera de los dos electrodos. Midiendo este flujo de electrones (corriente) obtenemos una idea de cuántas partículas están reaccionando por segundo, lo que nos da una idea de cuántas partículas hay en primer lugar.
- Con la adición de un tercer electrodo, el de referencia, podemos crear un diferencial de tensión constante entre las tensiones de referencia y de trabajo. Esto es lo que llamamos el potencial de polarización. Por ejemplo, si la tensión de referencia es de 1,25 V, y la de trabajo está a 1,35 V, decimos que el sesgo es de +100 mV. La química no tiene nada que ver con los 1,25 y 1,35 voltios, sólo le importa que haya un potencial de +100 mV en el electrodo de trabajo. Hay mucho más en esta celda electroquímica, pero esto es todo lo que realmente necesitamos saber para empezar. En este proyecto, vamos a tomar un sensor de 3 electrodos y utilizarlo en una configuración de 2 electrodos como en la Figura 1.
- Una última información, PPM, o partes por millón, es un estándar para indicar la concentración. Por ejemplo, 1 ppm es una partícula de un gas concreto por cada millón de partículas totales de gas presentes.
Figura 1. Un sensor de gas de 3 electrodos conectado en una configuración de 2 electrodos. (Imagen cortesía de SPEC Sensors)
Aviso legal 1: Precaución: Voy a mostrar algunos resultados de pruebas que hice con gas de Monóxido de Carbono presurizado. Un pequeño cilindro de CO está disponible en línea, pero es letal. Deberías leer sobre esto antes de decidirte a usar CO en un proyecto.1 Advertencia 2: Si necesitas encontrar una fuente alternativa de CO, un cigarrillo producirá alrededor de 300 ppm de CO en el flujo inhalado.
Cómo
Figura 2. Configuración del prototipo de sensor de gas básico. (Imagen por cortesía de SPEC Sensors)
Parte 1 – Configuración básica del sensor
Voy a empezar con el circuito más básico y le mostraré cómo medir el sensor con sólo un sensor, una resistencia de 10 kΩ y un multímetro.
i. Corte los dos pines que no están etiquetados (vea la Figura 2), luego centre el sensor en la protoboard.
ii. Utilice un puente corto para cortocircuitar los pines R y C (contador y referencia). Utilice otro puente corto para cortocircuitar los pines W1 y W2 (esto es sólo para dar una ruta extra para la corriente ya que los pines ya están cortocircuitados en la PCB).
iii. Conecte el cable positivo del multímetro al lado R/C del sensor. Conecte el lado negativo del medidor al lado W1/W2 del sensor.
iv. Por último, utilice una resistencia de 10 kΩ (R1) para conectar las patillas R/C a las patillas W1/W2.
En este punto está listo para probar el sensor. Puede utilizar una cerilla o humo, pero funcionará mejor si está en un recipiente sellado. Un plato de Pyrex/vidrio con una tapa hermética funcionará muy bien. Pruebe a encender una cerilla, apagarla y ponerla en el plato con el sensor. Es posible que tenga que cortar agujeros para pasar las líneas eléctricas. En mi instalación, hice funcionar 200 ppm de CO a unos 100 centímetros cúbicos por minuto, lo que es bastante lento. Como se muestra en la Figura 3, sólo el multímetro está conectado al sensor.
Figura 3. Configuración del sensor de CO con sólo un multímetro conectado para mostrar la salida. (Imagen cortesía de SPEC Sensors)
Algunas matemáticas necesarias:
La medición que puede esperar depende de su configuración y de la sensibilidad del sensor. En este modo de 2 electrodos puede esperar aproximadamente la mitad de la sensibilidad, así que si su sensor dice 4,0 nA/ppm, puede esperar unos 2 nA/ppm. Para convertir mV a ppm utilice la ley de Ohm: Tensión (V) = Corriente (A) x Resistencia (Ω). Por ejemplo:
En el montaje de la Figura 3, empiezo con 0,2 mV sin gas y termino con 4,8 mV con unas 200 ppm fluyendo hacia la caja y saliendo por un respiradero al exterior. La diferencia de tensión es de 4,6 mV. La resistencia R1 es de 10 kΩ por lo que la corriente es de 0,0046 V/ 10.000 Ω, o 460 nA. Para obtener ppm, divide la corriente medida por la sensibilidad; 460 nA / ~2 nA/ppm, o 230 ppm. Esto se acerca bastante a lo que puse en la caja; 200 ppm. Para calcular la nueva sensibilidad, utilice mV y ppm. Mi nueva sensibilidad es de 4,6 mV/200 ppm o 0,23 mV/ppm.
La figura 4 muestra la dirección en que la corriente viaja por el circuito. El terminal A es el cable positivo del DMM y el B es el cable negativo (común). Puede imaginarse que los electrones se consumen en el electrodo de trabajo y se producen en el contraelectrodo de referencia. Si los cables del sensor están al revés, medirá una tensión negativa.
Figura 4. Dirección del flujo de corriente en la configuración del sensor. (Imagen cortesía de SPEC Sensors)
Parte 2 – Configuración avanzada del sensor
Ahora vamos a incorporar el Arduino Uno a este proyecto. Hay algunos cambios que haremos para superar sus limitaciones, pero en realidad, puedes conectarlo de la misma manera que lo hiciste con el multímetro. El lado positivo conectará el pin analógico A0 a los pines R/C del sensor, y el lado negativo conectará el GND a los pines W1/W2 del sensor. Con esto, usa analogRead() para medir el voltaje a través del sensor y la resistencia R1. El código final de Arduino se puede encontrar en el al final de este artículo, e incluye las mejoras de muestreo que he esbozado a continuación.
Notas sobre el ADC de un Arduino:
Desde el cálculo anterior, se puede ver que 1 ppm generará un voltaje de 0,23 mV. Eso es un problema para el ADC de 10 bits del Arduino, ya que la resolución mínima del Uno es de 4,88 mV (5 V/1024 niveles). Eso significa que lo mínimo que puede detectar el Arduino es 21 mV, que sigue siendo demasiado alto.
La primera mejora es cambiar la referencia analógica a la referencia interna de 1,1 V . Esto cambia la resolución mínima a 4,7 ppm, que es mejor. Por favor, lea las instrucciones para esto en https://www.arduino.cc/en/Reference/AnalogReference. El siguiente arreglo es implementar el promedio. La velocidad máxima de lectura de analogRead() es de 10.000 veces por segundo. Si promedia un montón de estas lecturas durante un segundo, digamos 256, eso mejorará la resolución significativamente.2
Por último, como ha aumentado la resolución, puede encontrar que el cero ya no es 0 V en el ADC del Arduino. Para solucionar esto, necesitamos llevar ese voltaje cero (que significa corriente cero) a un valor más alto que pueda ser leído por el ADC. Aquí implementaremos una escalera de tensión con la adición de una resistencia de 100 kΩ y otra de 10 kΩ. Cuando hay corriente cero generada por el sensor, estaremos midiendo el voltaje entre las dos nuevas resistencias. La corriente a través de las resistencias es de 3,3 V/ (100.000 +10.000 Ω), es decir, 30 microamperios. Por lo tanto, entre las dos nuevas resistencias estaremos midiendo 10.000 Ω * 30 microAmps o 0,3 Voltios. Esta escalera de voltaje utilizará 30 microAmps, así que si necesitas ahorrar energía, para la vida de la batería, intenta aumentar el valor de la resistencia de 100 kΩ. Ahora nuestro nuevo voltaje cero está cerca de los 0,3 voltios, y cualquier cosa por encima de esto se debe a que el gas CO genera un voltaje a través de la resistencia R1.
Figura 5. Prototipo de sensor de CO con una placa Arduino. (Imagen cortesía de SPEC Sensors)
Así que como ejemplo final, con esta configuración estamos midiendo 0,355 voltios. Primero resta el voltaje cero de 0,3 V, dando 0,055 V o 55 mV. Ahora divida por nuestra nueva sensibilidad de 0,23 mV/ppm y estamos midiendo 240 ppm de CO, que es un nivel peligroso para respirar durante largos períodos de tiempo.
Resumen y próximos pasos:
Al utilizar el terminal de serie, pude capturar cerca de 2 horas de registro a aproximadamente 1 muestra cada 1,5 segundos. La figura 6 muestra lo que es posible con el Arduino, algunas resistencias, el sensor y algún promedio. Los próximos pasos serían utilizar el sensor en una configuración de 3 electrodos, que proporciona una mayor estabilidad, y la amplificación de la señal. Las piezas para ello incluyen un amplificador óptico dual, o dos amplificadores ópticos duales, y algunas resistencias. En realidad, la salida de los sensores puede depender de otros factores como la temperatura y los cambios en la humedad, pero una buena estación meteorológica registrará estas cosas también.
Figura 6. Salida de la configuración del sensor Arduino con promedio de datos. (Imagen cortesía de SPEC Sensors)
En futuros artículos, presentaré otros proyectos, incluyendo el circuito de 3 electrodos y utilizando versiones digitales de estos sensores. Si estás listo para construir tu propio circuito puedes consultar las notas de aplicación en SPEC Sensors.
Código de Arduino utilizado para este proyecto:
/*
Analog input, Serial output
Reads an analog gas sensor at pins A0,
Also prints the results to the serial monitor.
The circuit:
Gas sensor pin W (Working) connected to middle of resistor ladder (I used 10k and 100k).
Gas sensor C (counter) and R (reference) connected together and then jumped to analog pin A0.
10 kOhm resistor between W1/W2 and C/R.
created 01 Jul. 2017
by David Peaslee
*/
// these constants won't change. They're used to give names to the pins used:
const int analogInPin = A0; // Analog input pin that the sensor is attached to
const int resValue = 9700; // Value of 10kOhm resistor !change this to match your resistor
const float Vref = 1.1; //This is the voltage of the internal reference
const long int cOff = 68286; //286mV offset due to resistor ladder. Try taking the average of a long
//measurement of the counts without a sensor in place. This should give a good Zero.
const float Sf = 2.11; // sensitivity in nA/ppm,
//this is roughly about 1/2 the sensitivity of the barcode on the sensor. Try finding a known
//concentration of CO to measure, or just approximate.
const int extraBit = 256; //Number of samples averaged, like adding 8 bits to ADC
long int sensorValue = 0; // value read from the sensor
float currentValue = 0; // current read from the sensor
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
// !!!set analog reference to 1.1 Volts!!!
analogReference(INTERNAL);
}
void loop() {
// read the analog in value:
sensorValue = 0;
for (int i = 0; i < extraBit; i++) {
sensorValue = analogRead(analogInPin) + sensorValue;
delay(3); // needs 2 ms for the analog-to-digital converter to settle after the last reading
}
sensorValue = sensorValue - cOff; //subtract the offset of the resistor ladder * 256.
// print the results to the serial monitor:
Serial.print("PPM = ");
Serial.print( ((float) sensorValue / extraBit / 1024 * Vref / resValue * 1000000000) / Sf);
Serial.print("\tnA = ");
Serial.print( (float) (sensorValue) / extraBit / 1024 * Vref / resValue * 1000000000);
Serial.print("\tCounts = " );
Serial.println(sensorValue);
//Trying to make each loop 1 second
delay(218); //1 second – 3ms*256ms (each adc read)-14ms (for printing)= 218ms
}
Para librerías adicionales de Spec Sensor para trabajar con varios sensores ULP, ve a este enlace en GitHub: https://github.com/SPEC-Sensors/ULPSM