Di David Peaslee

Costruire un rivelatore di CO (monossido di carbonio) che possa avvisarti di livelli pericolosi di CO può essere fatto con poco quanto un sensore di gas, un Arduino (o altro microcontrollore) e alcune resistenze. L’aggiunta di alcuni op-amp può aumentare la sensibilità per misurare la quantità di CO presente nell’ambiente. Ampliando queste conoscenze, si può costruire la propria stazione di monitoraggio della qualità dell’aria, e confrontare il proprio cortile con i livelli riportati dalle stazioni meteo locali.

Materiali necessari

  • 1 Arduino Uno
  • 1 multimetro (DMM)
  • 1 breadboard con vari fili di collegamento
  • 2 resistenze 10 kΩ
  • 1 resistenza 100 kΩ
  • 1 sensore di gas CO SPEC (Digi-Key Part Number: 1684-1000-ND)

Storia del progetto

Mentre lavoravo in una società di sensori di gas, ho lavorato con molte startup che avevano molte grandi idee per misurare la qualità dell’aria. Mentre spero davvero che un giorno tutti avranno sensori di gas nei loro telefoni e computer, per ora, mi piacerebbe aiutare il Maker di tutti i giorni a costruire i propri sistemi di monitoraggio dell’aria.

Per questo progetto, vorrei iniziare con le basi: Cosa fa funzionare un sensore elettrochimico?

  • Ci sono due tipi fondamentali di sensori di gas elettrochimici, a 2 elettrodi e a 3 elettrodi. Entrambi funzionano con gli stessi principi di base. Un gas si diffonde nel sensore e si fa strada verso l’elettrodo di lavoro. Lì reagisce con un catalizzatore e crea ioni (molecole cariche). Questi ioni si muovono attraverso l’elettrolita (a volte simile all’acido della batteria) e reagiscono di nuovo al controelettrodo dove gli elettroni sono liberati (o raccolti) per muoversi attraverso il circuito. A seconda del gas che viene fatto reagire e del catalizzatore, questi elettroni possono entrare o uscire da uno dei due elettrodi. Misurando questo flusso di elettroni (corrente) otteniamo un’idea di quante particelle stanno reagendo al secondo, il che ci dà un’idea di quante particelle ci sono in primo luogo.
  • Con l’aggiunta di un terzo elettrodo, il riferimento, possiamo creare un differenziale di tensione costante tra il riferimento e la tensione di lavoro. Questo è ciò che chiamiamo potenziale di polarizzazione. Per esempio, se la tensione di riferimento è di 1,25 V e quella di lavoro è di 1,35 V, diciamo che il bias è di +100 mV. La chimica non ha nulla a che fare con gli 1,25 e 1,35 Volt, si preoccupa solo che ci sia un potenziale di +100 mV sull’elettrodo di lavoro. C’è molto di più in questa cella elettrochimica, ma questo è tutto quello che dobbiamo sapere per iniziare. In questo progetto, prenderemo un sensore a 3 elettrodi e lo useremo in una configurazione a 2 elettrodi come in Figura 1.

  • Un’ultima informazione, PPM, o parti per milione, è uno standard per indicare la concentrazione. Per esempio, 1 ppm è una particella di un particolare gas su un milione di particelle totali di gas presenti.

Sensore SPEC - Monossido di carbonio

Figura 1. Un sensore di gas a 3 elettrodi collegato in una configurazione a 2 elettrodi. (Immagine per gentile concessione di SPEC Sensors)

Disclaimer 1: Attenzione: Sto per mostrarvi alcuni risultati di test che ho fatto con gas di monossido di carbonio pressurizzato. Una piccola bombola di CO è disponibile online, ma è letale. Dovresti informarti su questo prima di decidere di usare il CO in un progetto.1 Disclaimer 2: Se hai bisogno di trovare una fonte alternativa di CO, una sigaretta produce circa 300 ppm di CO nel flusso inalato.

Come fare

Sistemazione di base del prototipo del sensore di gas.

Figura 2. Impostazione di base del prototipo del sensore di gas. (Immagine per gentile concessione di SPEC Sensors)

Parte 1 – Impostazione di base del sensore

Inizierò con il circuito più elementare e vi mostrerò come misurare il sensore con solo un sensore, una resistenza da 10 kΩ e un multimetro.

i. Tagliate i due pin che non sono etichettati (vedi figura 2), poi centrate il sensore sulla breadboard.

ii. Usare un ponticello corto per cortocircuitare i pin R e C (contatore e riferimento). Usare un altro ponticello corto per cortocircuitare i pin W1 e W2 (questo è solo per dare un percorso extra per la corrente dato che i pin sono già cortocircuitati sul PCB).

iii. Collegare il cavo positivo del multimetro al lato R/C del sensore. Collegare il lato negativo del multimetro al lato W1/W2 del sensore.

iv. Infine usa una resistenza da 10 kΩ (R1) per collegare i pin R/C ai pin W1/W2.

A questo punto sei pronto per testare il sensore. Potete usare un fiammifero o del fumo, ma funzionerà meglio se è in un contenitore sigillato. Un piatto di Pyrex/vetro con un coperchio ermetico funzionerà benissimo. Prova ad accendere un fiammifero e poi soffialo fuori e mettilo nel piatto con il sensore. Potrebbe essere necessario tagliare dei buchi per far passare le linee elettriche. Nella mia configurazione, ho fatto funzionare 200 ppm di CO a circa 100 centimetri cubici al minuto, che è piuttosto lento. Come mostrato nella Figura 3, solo il multimetro è collegato al sensore.

Sistemazione del sensore CO con solo un multimetro collegato

Figura 3. Configurazione del sensore di CO con solo un multimetro collegato per mostrare l’uscita. (Immagine per gentile concessione di SPEC Sensors)

Alcuni calcoli necessari:

La misura che puoi aspettarti dipende dalla tua configurazione e dalla sensibilità del sensore. In questa modalità a 2 elettrodi ci si può aspettare circa la metà della sensibilità, quindi se il sensore dice 4.0 nA/ppm, ci si può aspettare circa 2 nA/ppm. Per convertire mV in ppm usa la legge di Ohm: Tensione (V) = Corrente (A) x Resistenza (Ω). Per esempio:

Nella configurazione della figura 3, inizio con 0,2 mV senza gas e finisco con 4,8 mV con circa 200 ppm che fluiscono nella scatola e fuori attraverso uno sfiato all’esterno. La differenza di tensione è di 4,6 mV. Il resistore R1 è 10 kΩ quindi la corrente è 0,0046 V/ 10.000 Ω, o 460 nA. Per ottenere ppm, dividere la corrente misurata per la sensibilità; 460 nA / ~2 nA/ppm, o 230 ppm. Questo è abbastanza vicino a quello che ho messo nella scatola; 200 ppm. Per calcolare la nuova sensibilità, usate mV e ppm. La mia nuova sensibilità è 4,6 mV/200 ppm o 0,23 mV/ppm.

La figura 4 mostra la direzione della corrente attraverso il circuito. Il terminale A è il cavo positivo del DMM e B è il cavo negativo (comune). Si può immaginare che gli elettroni siano consumati all’elettrodo di lavoro e prodotti all’elettrodo di contro/riferimento. Se i cavi del sensore sono al contrario, si misurerà invece una tensione negativa.

Direzione del flusso di corrente nella configurazione del sensore

Figura 4. Direzione del flusso di corrente nella configurazione del sensore. (Immagine per gentile concessione di SPEC Sensors)

Parte 2 – Configurazione avanzata del sensore

Ora incorporeremo Arduino Uno in questo progetto. Ci sono alcune modifiche che faremo per superare le sue limitazioni, ma in realtà, puoi collegarlo nello stesso modo in cui hai fatto con il multimetro. Il lato positivo collegherà il pin analogico A0 ai pin R/C del sensore, e il lato negativo collegherà il GND ai pin W1/W2 del sensore. Con questo, usate analogRead() per misurare la tensione attraverso il sensore e il resistore R1. Il codice finale di Arduino può essere trovato alla fine di questo articolo, e include i miglioramenti di campionamento che ho delineato qui sotto.

Note sull’ADC di un Arduino:

Dal calcolo di cui sopra, si può vedere che 1 ppm genererà una tensione di 0,23 mV. Questo è un problema per l’ADC a 10 bit di Arduino, poiché la risoluzione minima per l’Uno è di 4,88 mV (5 V/1024 livelli). Ciò significa che il minimo che Arduino può rilevare è 21 ppm, che è ancora troppo alto.

Il primo miglioramento è quello di cambiare il riferimento analogico al riferimento interno di 1,1 V . Questo cambia la risoluzione minima a 4,7 ppm, che è meglio. Leggete le istruzioni per questo a https://www.arduino.cc/en/Reference/AnalogReference. La prossima correzione consiste nell’implementare la media. La velocità massima di lettura di analogRead() è di 10.000 volte al secondo. Se fai la media di un mucchio di queste letture in un secondo, diciamo 256, questo migliorerà la risoluzione in modo significativo.2

UH-OH MOMENT

Infine, dato che hai aumentato la risoluzione, potresti scoprire che lo zero non è più 0 V sull’ADC di Arduino. Per risolvere questo problema, abbiamo bisogno di portare quella tensione zero (che significa corrente zero) a un valore più alto che può essere letto dall’ADC. Qui implementeremo una scala di tensione con l’aggiunta di una resistenza da 100 kΩ e una da 10 kΩ. Quando c’è zero corrente generata dal sensore, misureremo la tensione tra i due nuovi resistori. La corrente attraverso i resistori è 3,3 V/(100.000 +10.000 Ω), o 30 microAmpere. Quindi, tra le due nuove resistenze misureremo 10.000 Ω * 30 microAmpere o 0,3 Volt. Questa scala di tensione userà 30 microAmpere, quindi se avete bisogno di risparmiare energia, per la durata della batteria, provate ad aumentare il valore della resistenza da 100 kΩ. Ora la nostra nuova tensione zero è vicina a 0,3 Volt, e qualsiasi cosa al di sopra di questa è dovuta al gas CO che genera una tensione attraverso il resistore R1.

Prototipo di sensore CO con una scheda Arduino

Figura 5. Prototipo di sensore di CO con una scheda Arduino. (Immagine per gentile concessione di SPEC Sensors)

Così, come esempio finale, con questa configurazione stiamo misurando 0,355 Volt. Prima sottrarre la tensione zero di 0,3 V, dando 0,055 V o 55 mV. Ora dividiamo per la nostra nuova sensibilità di 0,23 mV/ppm e stiamo misurando 240 ppm di CO, che è un livello pericoloso da respirare per lunghi periodi di tempo.

Sommario e prossimi passi:

Utilizzando il terminale seriale, sono riuscito a catturare circa 2 ore di registrazione a circa 1 campione ogni 1,5 secondi. La figura 6 mostra cosa è possibile fare con Arduino, alcune resistenze, il sensore e qualche media. I prossimi passi sarebbero quelli di utilizzare il sensore in una configurazione a 3 elettrodi, che fornisce una maggiore stabilità, e l’amplificazione del segnale. Le parti per questo includono un amplificatore operazionale doppio, o due amplificatori operazionali doppi, e alcune resistenze. In realtà, l’uscita del sensore può dipendere da altri fattori come la temperatura e le variazioni di umidità, ma una buona stazione meteorologica registrerà anche queste cose.

Output della configurazione del sensore Arduino con media dei dati

Figura 6. Uscita della configurazione del sensore Arduino con media dei dati. (Immagine per gentile concessione di SPEC Sensors)

Nei prossimi articoli, presenterò altri progetti, tra cui il circuito a 3 elettrodi e l’utilizzo di versioni digitali di questi sensori. Se sei pronto a costruire il tuo circuito puoi controllare le note di applicazione presso SPEC Sensors.

Codice Arduino utilizzato per questo progetto:

Copia codice

/*
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
}

Per ulteriori librerie Spec Sensor per lavorare con vari sensori ULP, vai a questo link su GitHub: https://github.com/SPEC-Sensors/ULPSM

Articles

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.