Door David Peaslee

Het bouwen van een CO (koolmonoxide) detector die je kan waarschuwen voor gevaarlijke niveaus van CO kan gedaan worden met zo weinig als een gassensor, een Arduino (of andere microcontroller) en wat weerstanden. Het toevoegen van een paar op-amps kan de gevoeligheid verhogen om de hoeveelheid CO aanwezig in de omgeving te meten. Uitbreiding van deze kennis, kunt u uw eigen luchtkwaliteit meetstation te bouwen, en vergelijk je eigen achtertuin met niveaus gemeld door de lokale weerstations.

benodigde materialen

  • 1 Arduino Uno
  • 1 multimeter (DMM)
  • 1 breadboard met diverse jumperdraden
  • 2 Weerstanden 10 kΩ
  • 1 Weerstand 100 kΩ
  • 1 SPEC CO-gassensor (Digi-Key onderdeelnummer: 1684-1000-ND)

Projectverhaal

Toen ik bij een gassensorbedrijf werkte, werkte ik met veel startups die veel geweldige ideeën hadden voor het meten van de luchtkwaliteit. Hoewel ik echt hoop dat iedereen op een dag gassensoren in hun telefoons en computers zal hebben, wil ik voor nu de alledaagse Maker helpen hun eigen luchtmonitoringsystemen te bouwen.

Voor dit project wil ik beginnen met de basis: Hoe werkt een elektrochemische sensor?

  • Er zijn twee basistypen elektrochemische gassensoren, 2-elektrode en 3-elektrode. Ze werken beide volgens dezelfde basisprincipes. Een gas diffundeert in de sensor en baant zich een weg naar de werkelektrode. Daar reageert het met een katalysator en creëert ionen (geladen moleculen). Die ionen bewegen door de elektrolyt (soms vergelijkbaar met accuzuur) en reageren opnieuw aan de tegenelektrode waar de elektronen worden vrijgemaakt (of verzameld) om door het circuit te gaan. Afhankelijk van het gas dat reageert en de katalysator, kunnen de elektronen in of uit beide elektroden stromen. Door deze elektronenstroom (stroom) te meten, krijgen we een idee van het aantal deeltjes dat per seconde reageert, wat ons een idee geeft van het aantal deeltjes dat er überhaupt is.
  • Met de toevoeging van een derde elektrode, de referentie, kunnen we een constant spanningsverschil creëren tussen de referentie- en de werkspanning. Dit noemen we het biaspotentiaal. Als bijvoorbeeld de referentiespanning 1,25 V is en de werkspanning 1,35 V, zeggen wij dat de bias +100 mV is. De chemie heeft niets te maken met de 1,25 en 1,35 Volt, zij geeft er alleen om dat er een potentiaal van +100 mV op de werkende elektrode staat. Er komt nog veel meer kijken bij deze elektrochemische cel, maar dit is alles wat we moeten weten om aan de slag te kunnen. In dit project nemen we een 3-elektrode sensor en gebruiken deze in een 2-elektrode configuratie zoals in figuur 1.

  • Een laatste beetje informatie, PPM, of parts per million, is een standaard om de concentratie aan te geven. Zo is 1 ppm één deeltje van een bepaald gas per miljoen totaal aanwezige gasdeeltjes.

SPEC Sensor - Koolmonoxide

Figuur 1. Een 3-elektrode gassensor aangesloten in een 2-elektrode configuratie. (Afbeelding met dank aan SPEC Sensors)

Disclaimer 1: Let op: Ik ga u enkele resultaten laten zien van tests die ik heb gedaan met koolmonoxidegas onder druk. Een kleine cilinder CO is online verkrijgbaar, maar het is dodelijk. Lees je hierover in voordat je besluit om CO in een project te gebruiken.1 Disclaimer 2: Als je een alternatieve bron van CO moet vinden, een sigaret produceert ongeveer 300 ppm CO in de ingeademde stroom.

How-to

Basische gassensor prototype setup.

Figuur 2. Basisopstelling van het gassensorprototype. (Afbeelding met dank aan SPEC Sensors)

Deel 1 – Basissensoropstelling

Ik begin met de meest elementaire schakeling en laat u zien hoe u de sensor kunt meten met alleen een sensor, een weerstand van 10 kΩ en een multimeter.

i. Knip de twee pinnen door die niet gelabeld zijn (zie figuur 2), centreer vervolgens de sensor op het breadboard.

ii. Gebruik een korte jumper om de R- en C-pennen (teller en referentie) kort te sluiten. Gebruik een andere korte jumper om de pennen W1 en W2 kort te sluiten (dit geeft alleen een extra route voor de stroom aangezien de pennen al kortgesloten zijn op de PCB).

iii. Sluit de positieve pool van de multimeter aan op de R/C-zijde van de sensor. Sluit de negatieve kant van de meter aan op de W1/W2-zijde van de sensor.

iv. Gebruik tenslotte een weerstand van 10 kΩ (R1) om de R/C-pennen met de W1/W2-pennen te verbinden.

Op dit punt bent u klaar om de sensor te testen. U kunt een lucifer of rook gebruiken, maar het werkt beter als hij in een afgesloten bakje zit. Een Pyrex/glas schaaltje met een luchtdichte bovenkant werkt prima. Steek een lucifer aan, blaas hem uit en leg hem in het schaaltje met de sensor. Misschien moet je gaten knippen om de elektrische leidingen door te voeren. In mijn opstelling liet ik 200 ppm CO lopen bij ongeveer 100 kubieke centimeter per minuut, wat vrij langzaam is. Zoals te zien is in figuur 3, is alleen de multimeter aangesloten op de sensor.

CO-sensor opstelling met alleen een multimeter aangesloten

Figuur 3. CO-sensoropstelling met alleen een multimeter aangesloten om de uitgang te tonen. (Afbeelding met dank aan SPEC Sensors)

Enige benodigde wiskunde:

De meting die u kunt verwachten is afhankelijk van uw opstelling en de gevoeligheid van de sensor. In deze 2-elektrodenmodus kunt u ongeveer de helft van de gevoeligheid verwachten, dus als uw sensor 4,0 nA/ppm aangeeft, kunt u ongeveer 2 nA/ppm verwachten. Om mV om te zetten in ppm gebruikt u de wet van Ohm: Spanning (V) = Stroom (A) x Weerstand (Ω). Bijvoorbeeld:

In de opstelling van figuur 3 begin ik met 0,2 mV zonder gas en eindig ik met 4,8 mV met ongeveer 200 ppm die in de doos stromen en er door een ontluchtingsopening naar buiten. Het spanningsverschil is 4,6 mV. De weerstand R1 is 10 kΩ, dus de stroom is 0,0046 V/ 10.000 Ω, of 460 nA. Om ppm te krijgen, deel je de gemeten stroom door de gevoeligheid; 460 nA / ~2 nA/ppm, of 230 ppm. Dit komt aardig in de buurt van wat ik in de doos heb gezet; 200 ppm. Om de nieuwe gevoeligheid te berekenen, gebruik je mV en ppm. Mijn nieuwe gevoeligheid is 4,6 mV/200 ppm of 0,23 mV/ppm.

Figuur 4 toont de richting waarin de stroom door het circuit gaat. Aansluitpunt A is de positieve pool van de DMM en B is de negatieve (gemeenschappelijke) pool. U kunt zich voorstellen dat elektronen worden verbruikt aan de werkelektrode en worden geproduceerd aan de tegen-/referentie-elektrode. Als de draden van de sensor tegengesteld zijn aangesloten, meet u in plaats daarvan een negatieve spanning.

Richting van de stroom in de sensoropstelling

Figuur 4. Richting van de stroom in de sensoropstelling. (Afbeelding met dank aan SPEC Sensors)

Deel 2 – Geavanceerde sensoropstelling

Nu gaan we de Arduino Uno in dit project integreren. Er zijn een paar veranderingen die we zullen maken om zijn beperkingen te overwinnen, maar in werkelijkheid kun je hem op dezelfde manier aansluiten als je deed met de multimeter. De positieve kant verbindt analoge pin A0 met de R/C pinnen van de sensor, en de negatieve kant verbindt de GND met de W1/W2 pinnen van de sensor. Gebruik hiermee analogRead() om de spanning over de sensor en weerstand R1 te meten. De uiteindelijke Arduino-code is te vinden aan het eind van dit artikel, en bevat de sampling-verbeteringen die ik hieronder heb geschetst.

Noten over de ADC van een Arduino:

Uit de bovenstaande berekening kunt u zien dat 1 ppm een spanning van 0,23 mV zal genereren. Dat is een probleem voor de 10-bit ADC van de Arduino, want de minimale resolutie voor de Uno is 4,88 mV (5 V/1024 niveaus). Dat betekent dat het minimum dat de Arduino kan detecteren 21 ppm is, wat nog steeds te hoog is.

De eerste verbetering is om de analoge referentie te veranderen in de interne referentie van 1.1 V . Dit verandert de minimale resolutie naar 4.7 ppm, wat beter is. Lees de instructies hiervoor op https://www.arduino.cc/en/Reference/AnalogReference. De volgende oplossing is het implementeren van middeling. De maximale uitleessnelheid van analogRead() is 10.000 keer per seconde. Als je het gemiddelde neemt van een aantal van deze uitlezingen over een seconde, zeg 256, zal dat de resolutie aanzienlijk verbeteren.2

UH-OH MOMENT

Ten slotte, als je de resolutie hebt verhoogd, zul je misschien merken dat nul niet langer 0 V is op de ADC van de Arduino. Om dit op te lossen, moeten we die nulspanning (wat nulstroom betekent) naar een hogere waarde brengen die door de ADC kan worden gelezen. Hier zullen we een spanningsladder implementeren met de toevoeging van een 100 kΩ en een 10 kΩ weerstand. Wanneer er nul stroom door de sensor wordt gegenereerd, meten we de spanning tussen de twee nieuwe weerstanden. De stroom door de weerstanden is 3,3 V/ (100.000 + 10.000 Ω), of 30 microAmpère. Tussen de twee nieuwe weerstanden meten we dus 10.000 Ω * 30 microAmpère of 0,3 Volt. Deze spanningsladder zal 30 microAmpère gebruiken, dus als u stroom moet besparen, voor de levensduur van de batterij, probeer dan de waarde van de 100 kΩ weerstand te verhogen. Onze nieuwe nulspanning ligt nu in de buurt van 0,3 Volt, en alles daarboven is het gevolg van CO-gas dat een spanning genereert over de weerstand R1.

CO-sensor prototype met een Arduino-bord

Figuur 5. CO-sensor prototype met een Arduino-bord. (Afbeelding met dank aan SPEC Sensors)

Dus als laatste voorbeeld, met deze opstelling meten we 0,355 Volt. Trek eerst de nulspanning van 0,3 V af, wat 0,055 V of 55 mV oplevert. Deel nu door onze nieuwe gevoeligheid van 0,23 mV/ppm en we meten 240 ppm CO, wat een gevaarlijk niveau is om gedurende lange perioden in te ademen.

Samenvatting en volgende stappen:

Door de seriële terminal te gebruiken, kon ik ongeveer 2 uur loggen met ongeveer 1 monster per 1,5 seconde. Figuur 6 laat zien wat er mogelijk is met de Arduino, wat weerstanden, de sensor en wat middeling. De volgende stap zou zijn om de sensor in een 3-elektrode configuratie te gebruiken, wat extra stabiliteit geeft, en signaalversterking. De onderdelen daarvoor zijn een dubbele op versterker, of twee dubbele op versterkers, en wat weerstanden. In werkelijkheid kan de output van de sensor afhangen van andere factoren, zoals temperatuur en veranderingen in de luchtvochtigheid, maar een goed weerstation zal deze dingen ook registreren.

Output van de Arduino sensor setup met data gemiddelden

Figuur 6. Uitgang van de Arduino-sensoropstelling met datamiddeling. (Afbeelding met dank aan SPEC Sensors)

In toekomstige artikelen zal ik andere projecten presenteren, waaronder het 3-elektrodecircuit en het gebruik van digitale versies van deze sensoren. Als u klaar bent om uw eigen circuit te bouwen, kunt u de toepassingsnotities bij SPEC Sensors bekijken.

Arduino-code gebruikt voor dit project:

Kopieercode

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

Voor aanvullende Spec Sensor-bibliotheken om met verschillende ULP Sensors te werken, gaat u naar deze link op GitHub: https://github.com/SPEC-Sensors/ULPSM

Articles

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.