av David Peaslee

Bygga en CO-detektor (kolmonoxid) som kan varna dig för farliga CO-nivåer kan göras med så lite som en gassensor, en Arduino (eller annan mikrokontroller) och några motstånd. Genom att lägga till några op-amps kan man öka känsligheten för att mäta mängden CO som finns i miljön. Om du utökar dina kunskaper kan du bygga din egen station för övervakning av luftkvaliteten och jämföra din egen bakgård med de nivåer som rapporteras av lokala väderstationer.

Nödvändiga material

  • 1 Arduino Uno
  • 1 multimeter (DMM)
  • 1 brödbräda med olika bryggkablar
  • 2 motstånd 10 kΩ
  • 1 motstånd 100 kΩ
  • 1 SPEC CO-gasgivare (Digi-Key Part Number: När jag arbetade på ett företag som tillverkar gassensorer arbetade jag med många nystartade företag som hade många bra idéer för att mäta luftkvaliteten. Även om jag verkligen hoppas att alla en dag kommer att ha gassensorer i sina telefoner och datorer, vill jag för tillfället hjälpa den vanliga tillverkaren att bygga sina egna luftövervakningssystem.

    För det här projektet vill jag börja med grunderna: Vad får en elektrokemisk sensor att fungera?

    • Det finns två grundläggande typer av elektrokemiska gassensorer, 2-elektroder och 3-elektroder. Båda fungerar enligt samma grundprinciper. En gas diffunderar in i sensorn och tar sig till arbetselektroden. Där reagerar den med en katalysator och skapar joner (laddade molekyler). Dessa joner rör sig genom elektrolyten (som ibland liknar batterisyra) och reagerar återigen vid motelektroden där elektronerna frigörs (eller samlas) för att röra sig genom kretsen. Beroende på vilken gas som reagerar och katalysatorn kan dessa elektroner strömma in i eller ut ur någon av elektroderna. Genom att mäta detta flöde av elektroner (strömmen) får vi en uppfattning om hur många partiklar som reagerar per sekund, vilket ger oss en uppfattning om hur många partiklar som finns där överhuvudtaget.
    • Med hjälp av en tredje elektrod, referenselektroden, kan vi skapa en konstant spänningsdifferens mellan referens- och arbetsspänningen. Detta är vad vi kallar biaspotentialen. Om referensspänningen till exempel är 1,25 V och arbetsspänningen är 1,35 V säger vi att förspänningen är +100 mV. Kemin har inget att göra med 1,25 och 1,35 volt, den bryr sig bara om att det finns en potential på +100 mV på arbetselektroden. Det finns mycket mer som ingår i denna elektrokemiska cell, men detta är allt vi egentligen behöver veta för att komma igång. I det här projektet kommer vi att ta en sensor med tre elektroder och använda den i en konfiguration med två elektroder enligt figur 1.
    • En sista upplysning: PPM, eller delar per miljon, är en standard för att ange koncentrationen. Till exempel är 1 ppm en partikel av en viss gas per miljon totala gaspartiklar.

    SPEC Sensor - Kolmonoxid

    Figur 1. En gassensor med tre elektroder som är ansluten till en konfiguration med två elektroder. (Bilden är en artighet av SPEC Sensors)

    Disclaimer 1: Varning: Jag kommer att visa dig några resultat från tester som jag gjorde med trycksatt kolmonoxidgas. En liten flaska CO finns tillgänglig på nätet, men den är dödlig. Du bör läsa på om detta innan du bestämmer dig för att använda CO i ett projekt. 1 Disclaimer 2: Om du behöver hitta en alternativ källa till CO producerar en cigarett cirka 300 ppm CO i den inandade strömmen.

    How-to

    Basisk prototypsetup för gassensorer.

    Figur 2. Grundläggande prototypuppställning av gassensor. (Bild med tillstånd av SPEC Sensors)

    Del 1 – Grundläggande sensoruppsättning

    Jag ska börja med den mest grundläggande kretsen och visa hur man mäter sensorn med bara en sensor, ett motstånd på 10 kΩ och en multimeter.

    i. Klipp av de två stiften som inte är märkta (se figur 2) och centrera sedan sensorn på brödbrädan.

    ii. Använd en kort jumper för att kortsluta R- och C-stiften (räknare och referens). Använd en annan kort jumper för att kortsluta W1- och W2-stiften (detta ger bara en extra väg för strömmen eftersom stiften redan är kortslutade på kretskortet).

    iii. Anslut multimeterets positiva ledning till sensorns R/C-sida. Anslut mätarens negativa sida till sensorns W1/W2-sida.

    iv. Använd slutligen ett motstånd på 10 kΩ (R1) för att ansluta R/C-stiften till W1/W2-stiften.

    I det här läget är du redo att testa sensorn. Du kan använda en tändsticka eller rök, men det fungerar bättre om den ligger i en förseglad behållare. En pyrex-/glasskål med en lufttät topp kommer att fungera utmärkt. Prova att tända en tändsticka och sedan blåsa ut den och lägga den i skålen med sensorn. Du kan behöva skära hål för att dra de elektriska ledningarna igenom. I min installation körde jag 200 ppm CO vid cirka 100 kubikcentimeter per minut, vilket är ganska långsamt. Som framgår av figur 3 är endast multimeteret anslutet till sensorn.

    CO-sensoruppsättning med endast ett multimeter anslutet

    Figur 3. Uppställning av CO-sensor med endast en multimeter ansluten för att visa utgången. (Bild med tillstånd av SPEC Sensors)

    En del nödvändig matematik:

    Den mätning du kan förvänta dig beror på din inställning och sensorns känslighet. I det här läget med två elektroder kan du förvänta dig ungefär halva känsligheten, så om din sensor säger 4,0 nA/ppm kan du förvänta dig ungefär 2 nA/ppm. För att konvertera mV till ppm använd Ohm’s lag: Spänning (V) = ström (A) x motstånd (Ω). Till exempel:

    I figur 3 börjar jag med 0,2 mV utan gas och slutar med 4,8 mV med cirka 200 ppm som flödar in i lådan och ut genom en ventil till utsidan. Spänningsskillnaden är 4,6 mV. Motståndet R1 är 10 kΩ så strömmen är 0,0046 V/10 000 Ω eller 460 nA. För att få fram ppm dividerar man den uppmätta strömmen med känsligheten; 460 nA / ~2 nA/ppm, eller 230 ppm. Detta är ganska nära det som jag skrev i lådan; 200 ppm. Använd mV och ppm för att beräkna den nya känsligheten. Min nya känslighet är 4,6 mV/200 ppm eller 0,23 mV/ppm.

    Figur 4 visar i vilken riktning strömmen går genom kretsen. Terminal A är DMM:s positiva ledning och B är den negativa (gemensamma) ledningen. Du kan föreställa dig att elektroner förbrukas vid arbetselektroden och produceras vid mot-/referenselektroden. Om sensorns ledningar sitter baklänges kommer du att mäta en negativ spänning i stället.

    Strömmarnas riktning i sensoruppställningen

    Figur 4. Riktning för strömflödet i sensoruppställningen. (Bild med tillstånd av SPEC Sensors)

    Del 2 – Avancerad sensoruppsättning

    Nu ska vi införliva Arduino Uno i det här projektet. Det finns några ändringar som vi kommer att göra för att övervinna dess begränsningar, men i verkligheten kan du ansluta den på samma sätt som du gjorde med multimeteretern. Den positiva sidan kommer att ansluta analogt stift A0 till sensorns R/C-stift och den negativa sidan kommer att ansluta GND till sensorns W1/W2-stift. Med detta använder du analogRead() för att mäta spänningen över sensorn och motståndet R1. Den slutliga Arduino-koden finns i den i slutet av den här artikeln, och den innehåller de samplingförbättringar som jag har beskrivit nedan.

    Notiser om ADC i en Arduino:

    Från ovanstående beräkning kan du se att 1 ppm kommer att generera en spänning på 0,23 mV. Det är ett problem för Arduinos 10-bitars ADC, eftersom den minsta upplösningen för Uno är 4,88 mV (5 V/1024 nivåer). Det betyder att det minsta värdet som Arduino kan upptäcka är 21 ppm, vilket fortfarande är för högt.

    Den första förbättringen är att ändra den analoga referensen till den interna referensen på 1,1 V . Detta ändrar den minsta upplösningen till 4,7 ppm, vilket är bättre. Läs instruktionerna för detta på https://www.arduino.cc/en/Reference/AnalogReference. Nästa förbättring är att implementera medelvärdesbildning. Den maximala läshastigheten för analogRead() är 10 000 gånger per sekund. Om du medelvärdesbildar ett gäng av dessa avläsningar under en sekund, säg 256, kommer det att förbättra upplösningen avsevärt. 2

    UH-OH MOMENT

    Slutligt, när du har ökat upplösningen, kanske du upptäcker att nollan inte längre är 0 V på ADC:n i Arduino. För att åtgärda detta måste vi föra denna nollspänning (vilket innebär nollström) till ett högre värde som kan läsas av ADC:n. Här kommer vi att implementera en spänningsstege med tillägg av ett motstånd på 100 kΩ och ett motstånd på 10 kΩ. När det genereras noll ström av sensorn kommer vi att mäta spänningen mellan de två nya motstånden. Strömmen genom motstånden är 3,3 V/(100 000 +10 000 Ω) eller 30 mikroampere. Mellan de två nya motstånden kommer vi alltså att mäta 10 000 Ω * 30 mikroampere eller 0,3 volt. Denna spänningsstege kommer att använda 30 mikroampere, så om du behöver spara ström, för batteriets livslängd, kan du försöka öka värdet på 100 kΩ-motståndet. Nu är vår nya nollspänning nära 0,3 volt, och allt över detta beror på att CO-gasen genererar en spänning över motståndet R1.

    CO-sensorprototyp med ett Arduinokort

    Figur 5. CO-sensorprototyp med ett Arduinokort. (Bild med tillstånd av SPEC Sensors)

    Så som ett sista exempel mäter vi med den här inställningen 0,355 volt. Dra först bort nollspänningen på 0,3 V, vilket ger 0,055 V eller 55 mV. Dela nu med vår nya känslighet på 0,23 mV/ppm och vi mäter 240 ppm CO, vilket är en farlig nivå att andas in under långa perioder.

    Sammanfattning och nästa steg:

    Med hjälp av den seriella terminalen kunde jag fånga upp cirka 2 timmars loggning med cirka 1 prov var 1,5 sekund. Figur 6 visar vad som är möjligt med Arduino, några motstånd, sensorn och lite medelvärdesbildning. Nästa steg skulle vara att använda sensorn i en konfiguration med tre elektroder, vilket ger ökad stabilitet och signalförstärkning. Delarna för detta inkluderar en dubbel op-förstärkare, eller två dubbla op-förstärkare, och några motstånd. I verkligheten kan sensorns utgång bero på andra faktorer som temperatur och förändringar i luftfuktigheten, men en bra väderstation registrerar även dessa saker.

    Utgång från Arduino-sensoruppsättningen med medelvärdesbildning av data

    Figur 6. Utgång från Arduino-sensoruppsättningen med medelvärdesbildning av data. (Bild med tillstånd av SPEC Sensors)

    I kommande artiklar kommer jag att presentera andra projekt, inklusive kretsen med tre elektroder och användning av digitala versioner av dessa sensorer. Om du är redo att bygga din egen krets kan du kolla in tillämpningsanvisningarna hos SPEC Sensors.

    Arduinokod som användes för det här projektet:

    Kopiera kod

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

    För ytterligare Spec Sensor Libraries för att arbeta med olika ULP-sensorer, gå till den här länken på GitHub: https://github.com/SPEC-Sensors/ULPSM

Articles

Lämna ett svar

Din e-postadress kommer inte publiceras.