Af David Peaslee

Byg en CO-detektor (kulilte), der kan advare dig om farlige CO-niveauer, kan bygges med så lidt som en gassensor, en Arduino (eller en anden mikrocontroller) og nogle modstande. Ved at tilføje et par op-ampere kan man øge følsomheden for at måle den mængde CO, der er til stede i omgivelserne. Hvis du udvider denne viden, kan du bygge din egen station til overvågning af luftkvaliteten og sammenligne din egen baghave med de niveauer, der rapporteres af lokale vejrstationer.

Nødvendige materialer

  • 1 Arduino Uno
  • 1 multimeter (DMM)
  • 1 breadboard med forskellige jumperkabler
  • 2 modstande 10 kΩ
  • 1 modstand 100 kΩ
  • 1 SPEC CO-gassensor (Digi-Key Part Number: 1684-1000-ND)

Projekthistorie

Mens jeg arbejdede i en gassensorvirksomhed, arbejdede jeg med mange nystartede virksomheder, der havde mange gode idéer til måling af luftkvalitet. Selv om jeg virkelig håber, at alle en dag vil have gassensorer i deres telefoner og computere, vil jeg indtil videre gerne hjælpe den almindelige Maker med at bygge deres egne luftovervågningssystemer.

I dette projekt vil jeg gerne starte med det grundlæggende: Hvad får en elektrokemisk sensor til at fungere?

  • Der findes to grundlæggende typer af elektrokemiske gassensorer, 2-elektrode- og 3-elektrode-sensorer. De fungerer begge efter de samme grundprincipper. En gas diffunderer ind i sensoren og finder vej til arbejdselektroden. Der reagerer den med en katalysator og danner ioner (ladede molekyler). Disse ioner bevæger sig gennem elektrolytten (nogle gange svarende til batterisyre) og reagerer igen ved modelektroden, hvor elektronerne frigøres (eller opsamles) og bevæger sig gennem kredsløbet. Afhængigt af den gas, der reageres, og katalysatoren kan disse elektroner strømme ind i eller ud af begge elektroder. Ved at måle denne strøm af elektroner (strøm) får vi en idé om, hvor mange partikler der reagerer pr. sekund, hvilket giver os en idé om, hvor mange partikler der overhovedet er.
  • Med tilføjelsen af en tredje elektrode, referenceelektroden, kan vi skabe et konstant spændingsdifferentiale mellem reference- og arbejdsspændingen. Dette er det, vi kalder biaspotentialet. Hvis referencespændingen f.eks. er 1,25 V, og arbejdsspændingen er på 1,35 V, siger vi, at bias-potentialet er +100 mV. Kemien har intet at gøre med 1,25 og 1,35 volt, den bekymrer sig kun om, at der er et potentiale på +100 mV på arbejdselektroden. Der er meget mere, der går ind i denne elektrokemiske celle, men dette er alt, hvad vi virkelig behøver at vide for at komme i gang. I dette projekt vil vi tage en 3-elektrodesensor og bruge den i en 2-elektrodekonfiguration som i figur 1.

  • En sidste oplysning, PPM, eller parts per million, er en standard for angivelse af koncentrationen. For eksempel er 1 ppm én partikel af en bestemt gas pr. million samlede partikler af den tilstedeværende gas.

SPEC-sensor - kulilte

Figur 1. En gassensor med 3 elektroder, der er forbundet i en 2-elektrodekonfiguration. (Billedet er venligst udlånt af SPEC Sensors)

Disclaimer 1: Forsigtighed: Jeg vil vise dig nogle resultater fra test, jeg har udført med kuliltegas under tryk. En lille cylinder med CO er tilgængelig online, men den er dødelig. Du bør læse om dette, før du beslutter dig for at bruge CO i et projekt. 1 Disclaimer 2: Hvis du har brug for at finde en alternativ kilde til CO, vil en cigaret producere omkring 300 ppm CO i den indåndede strøm.

How-to

Basisk prototypeopsætning af gassensor.

Figur 2. Grundlæggende prototypeopsætning af gassensor. (Billede venligst udlånt af SPEC Sensors)

Del 1 – Grundlæggende sensoropsætning

Jeg vil starte med det mest grundlæggende kredsløb og vise dig, hvordan du kan måle sensoren med blot en sensor, en 10 kΩ-modstand og et multimeter.

i. Klip de to stifter, der ikke er mærket (se figur 2), og centrer derefter sensoren på breadboardet.

ii. Brug en kort jumper til at kortslutte R- og C-stifterne (tæller og reference). Brug en anden kort jumper til at kortslutte W1- og W2-stifterne (dette giver blot en ekstra rute for strømmen, da stifterne allerede er kortsluttet på printpladen).

iii. Tilslut multimeterets positive ledning til sensorens R/C-side. Tilslut den negative side af måleren til W1/W2-siden af sensoren.

iv. Brug til sidst en 10 kΩ-modstand (R1) til at forbinde R/C-stifterne med W1/W2-stifterne.

På dette tidspunkt er du klar til at teste sensoren. Du kan bruge en tændstik eller røg, men det vil fungere bedre, hvis den er i en forseglet beholder. Et Pyrex/glasfad med en lufttæt top vil fungere fint. Prøv at tænde en tændstik og derefter blæse den ud og lægge den i skålen med sensoren. Det kan være nødvendigt at skære huller til at føre de elektriske ledninger igennem. I mit setup kørte jeg 200 ppm CO ved ca. 100 kubikcentimeter pr. minut, hvilket er ret langsomt. Som vist i figur 3 er kun multimeteret tilsluttet sensoren.

CO-sensoropstilling med kun et multimeter tilsluttet

Figur 3. Opsætning af CO-sensor med kun et multimeter tilsluttet for at vise udgangen. (Billede venligst udlånt af SPEC Sensors)

En del nødvendig matematik:

Den måling, du kan forvente, afhænger af din opsætning og sensorens følsomhed. I denne 2-elektrodetilstand kan du forvente ca. halvdelen af følsomheden, så hvis din sensor siger 4,0 nA/ppm, kan du forvente ca. 2 nA/ppm. For at omregne mV til ppm skal du bruge Ohm’s lov: Spænding (V) = Strøm (A) x Modstand (Ω). For eksempel:

I opsætningen i figur 3 starter jeg med 0,2 mV uden gas og slutter med 4,8 mV med ca. 200 ppm, der strømmer ind i kassen og ud gennem en udluftning til det fri. Spændingsforskellen er 4,6 mV. Modstanden R1 er 10 kΩ, så strømmen er 0,0046 V/ 10.000 Ω eller 460 nA. For at få ppm divideres den målte strøm med følsomheden; 460 nA / ~2 nA/ppm, dvs. 230 ppm. Dette er ret tæt på det, jeg satte i kassen; 200 ppm. For at beregne den nye følsomhed skal du bruge mV og ppm. Min nye følsomhed er 4,6 mV/200 ppm eller 0,23 mV/ppm.

Figur 4 viser, hvilken retning strømmen bevæger sig gennem kredsløbet. Terminal A er den positive ledning på DMM’et, og B er den negative (fælles) ledning. Man kan forestille sig, at der forbruges elektroner ved arbejdselektroden og produceres elektroner ved mod-/referenceelektroden. Hvis sensorens ledninger sidder omvendt, vil du i stedet måle en negativ spænding.

Retning af strømgennemstrømningen i sensoropstillingen

Figur 4. Retning af strømgennemstrømningen i sensoropsætningen. (Billede venligst udlånt af SPEC Sensors)

Del 2 – Avanceret sensoropsætning

Nu skal vi indarbejde Arduino Uno i dette projekt. Der er et par ændringer, som vi vil foretage for at overvinde dens begrænsninger, men i virkeligheden kan du tilslutte den på samme måde, som du gjorde med multimeteret. Den positive side vil forbinde den analoge pin A0 med sensorens R/C-stifter, og den negative side vil forbinde GND med sensorens W1/W2-stifter. Med dette skal du bruge analogRead() til at måle spændingen over sensoren og modstanden R1. Den endelige Arduino-kode kan findes i den i slutningen af denne artikel, og den indeholder de samplingforbedringer, som jeg har skitseret nedenfor.

Noter om ADC’en i en Arduino:

Fra ovenstående beregning kan du se, at 1 ppm vil generere en spænding på 0,23 mV. Det er et problem for 10-bit ADC’en i Arduino’en, da den mindste opløsning for Uno’en er 4,88 mV (5 V/1024 niveauer). Det betyder, at det minimum, som Arduino’en kan registrere, er 21 ppm, hvilket stadig er for højt.

Den første forbedring er at ændre den analoge reference til den interne reference på 1,1 V . Dette ændrer den mindste opløsning til 4,7 ppm, hvilket er bedre. Læs venligst vejledningen hertil på https://www.arduino.cc/en/Reference/AnalogReference. Den næste rettelse er at implementere middelværdiberegning. Den maksimale aflæsningshastighed for analogRead() er 10.000 gange i sekundet. Hvis du laver et gennemsnit af en masse af disse aflæsninger i løbet af et sekund, f.eks. 256, vil det forbedre opløsningen betydeligt. 2

UH-OH MOMENT

Sluttelig, efterhånden som du har øget opløsningen, vil du måske opdage, at nul ikke længere er 0 V på Arduinoens ADC. For at løse dette skal vi bringe denne nulspænding (hvilket betyder nulstrøm) til en højere værdi, som kan aflæses af ADC’en. Her vil vi implementere en spændingsstige med tilføjelse af en 100 kΩ- og en 10 kΩ-modstand. Når der er nul strøm genereret af sensoren, vil vi måle spændingen mellem de to nye modstande. Strømmen gennem modstandene er 3,3 V/(100.000 +10.000 Ω), dvs. 30 mikroAmpere. Mellem de to nye modstande vil vi altså måle 10 000 Ω * 30 mikroampere eller 0,3 volt mellem de to nye modstande. Denne spændingsstige vil bruge 30 mikroAmpere, så hvis du skal spare strøm af hensyn til batteriets levetid, kan du prøve at øge værdien af 100 kΩ-modstanden. Nu er vores nye nulspænding tæt på 0,3 volt, og alt over dette skyldes CO-gas, der genererer en spænding over modstanden R1.

CO-sensorprototype med et Arduino-kort

Figur 5. CO-sensorprototype med et Arduino-kort. (Billede venligst udlånt af SPEC Sensors)

Så som et sidste eksempel måler vi med denne opsætning 0,355 volt. Først trækkes nulspændingen på 0,3 V fra, hvilket giver 0,055 V eller 55 mV. Divider nu med vores nye følsomhed på 0,23 mV/ppm, og vi måler 240 ppm CO, hvilket er et farligt niveau at indånde i længere tid.

Resumé og næste trin:

Ved hjælp af den serielle terminal var jeg i stand til at optage ca. 2 timers logning med ca. 1 prøve hvert 1,5 sekund. Figur 6 viser, hvad der er muligt med Arduino’en, nogle modstande, sensoren og noget middelværdiberegning. De næste skridt ville være at bruge sensoren i en konfiguration med 3 elektroder, hvilket giver ekstra stabilitet og signalforstærkning. Delene til dette omfatter en dobbelt op-forstærker eller to dobbelte op-forstærkere og nogle modstande. I virkeligheden kan sensorernes output afhænge af andre faktorer såsom temperatur og ændringer i luftfugtighed, men en god vejrstation vil også registrere disse ting.

Output fra Arduino-sensoropsætningen med datamiddelværdiberegning

Figur 6. Output af Arduino-sensoropsætningen med datamiddelværdiberegning. (Billede venligst udlånt af SPEC Sensors)

I fremtidige artikler vil jeg præsentere andre projekter, herunder kredsløbet med 3 elektroder og anvendelse af digitale versioner af disse sensorer. Hvis du er klar til at bygge dit eget kredsløb, kan du tjekke anvendelsesnoterne hos SPEC Sensors.

Arduino-kode anvendt til dette projekt:

Kopier kode

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

For yderligere Spec Sensor Libraries til at arbejde med forskellige ULP-sensorer, gå til dette link på GitHub: https://github.com/SPEC-Sensors/ULPSM

Articles

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.