Inhoudsopgave:

Arduino CO-monitor met MQ-7-sensor - Ajarnpa
Arduino CO-monitor met MQ-7-sensor - Ajarnpa

Video: Arduino CO-monitor met MQ-7-sensor - Ajarnpa

Video: Arduino CO-monitor met MQ-7-sensor - Ajarnpa
Video: how to make CO Detector with mq-7 and Arduino (mq-7 sensor Arduino) 2024, Juli-
Anonim
Arduino CO-monitor met MQ-7-sensor
Arduino CO-monitor met MQ-7-sensor
Arduino CO-monitor met MQ-7-sensor
Arduino CO-monitor met MQ-7-sensor

Een paar woorden waarom dit instructable is gemaakt: op een dag belde de moeder van mijn vriendin ons midden in de nacht omdat ze zich erg ziek voelde - ze had duizeligheid, tachycardie, misselijkheid, hoge bloeddruk, ze viel zelfs flauw voor onbekende tijd (waarschijnlijk ~ 5 minuten, maar er is geen manier om te zeggen), allemaal zonder duidelijke reden. Ze woont in een klein dorp ver weg van ziekenhuizen (60 km van ons huis, 30 km naar het dichtstbijzijnde ziekenhuis, 10 km zonder enige normale weg ertussen), dus we haastten ons naar haar toe en kwamen daar snel na de ambulance. Ze werd opgenomen in het ziekenhuis en 's morgens voelde ze zich bijna goed, maar de artsen konden de oorzaak ervan niet vinden. De volgende dag hadden we een idee: het zou een CO-vergiftiging kunnen zijn, aangezien ze een gasboiler heeft (op de foto), en er de hele avond bij in de buurt zat toen het gebeurde. Onlangs kochten we MQ-7 CO-sensor, maar had nooit tijd om er een schema voor te maken, dus dit was het perfecte moment om dat te doen. Na een uur zoeken op internet naar instructies, realiseerde ik me dat ik geen handleiding kan vinden die tegelijkertijd de instructies van de sensorfabrikant in de datasheet volgt en ook maar iets uitlegt (een voorbeeld leek een vrij goede code te hebben, maar het was niet duidelijk hoe het toe te passen, anderen waren te eenvoudig en zouden niet goed werken). Dus we hebben ongeveer 12 uur besteed aan het ontwikkelen van schema's, het maken en afdrukken van een 3D-behuizing, het testen en kalibreren van de sensor, en de volgende dag gingen we naar de verdachte ketel. Het bleek dat de CO-niveaus daar extreem hoog waren en dodelijk konden zijn als de CO-blootstellingstijd langer was. Dus ik geloof dat iedereen die een vergelijkbare situatie heeft (zoals een gasboiler of andere verbranding in een woonruimte) zo'n sensor moet krijgen om te voorkomen dat er iets ergs gebeurt.

Dat is allemaal twee weken geleden gebeurd, sindsdien heb ik schema's en programma's behoorlijk verbeterd, en nu lijkt het redelijk goed en relatief eenvoudig te zijn (niet eenvoudig met 3 regels code, maar toch). Hoewel ik hoop dat iemand met een nauwkeurige CO-meter me wat feedback zal geven over de standaardkalibratie die ik in de schets heb gezet, vermoed ik dat het verre van goed is. Hier is een complete gids met enkele experimentele gegevens.

Stap 1: Stuklijst

Stuklijst
Stuklijst

Je hebt nodig: 0. Arduino-bord. Ik geef de voorkeur aan een Chinese kloon van Arduino Nano vanwege de uitstekende prijs van $ 3, maar elke 8-bits arduino zal hier werken. Sketch gebruikt een aantal geavanceerde timers en is alleen getest op de atmega328 microcontroller - hoewel het waarschijnlijk ook goed zal werken op andere.1. MQ-7 CO-sensor. Meestal verkrijgbaar bij deze Flying Fish-sensormodule, moet deze een kleine wijziging ondergaan, details in de volgende stap, of u kunt een aparte MQ-7sensor gebruiken.

2. NPN bipolaire transistor. Vrijwel elke NPN-transistor die 300 mA of meer aankan, zal hier werken. PNP-transistor werkt niet met een genoemde Flying Fish-module (omdat er een verwarmingspen op de uitgang van de sensor is gesoldeerd), maar kan worden gebruikt met een discrete MQ-7-sensor.

3. Weerstanden: 2 x 1k (van 0,5k tot 1,2k werkt prima), en 1 x 10k (die kun je het beste nauwkeurig houden - maar als je absoluut een andere waarde moet gebruiken, pas dan de variabele reference_resistor_kOhm in de schets dienovereenkomstig aan).

4. Condensatoren: 2 x 10uF of meer. Tantaal of keramische zijn vereist, elektrolytische zal niet goed werken vanwege de hoge ESR (ze kunnen niet genoeg stroom leveren om hoge stroomrimpels af te vlakken).5. Groene en rode LED's om het huidige CO-niveau aan te geven (u kunt ook een enkele tweekleurige LED met 3 aansluitingen gebruiken, zoals we gebruikten in ons prototype met gele doos).6. Piezo-zoemer om een hoog CO-niveau aan te geven.7. Breadboard en draden (je kunt ook alles op Nano-pinnen solderen of in Uno-sockets knijpen, maar het is gemakkelijk om op deze manier een fout te maken).

Stap 2: Modulemodificatie of discrete sensorbedrading

Modulemodificatie of discrete sensorbedrading
Modulemodificatie of discrete sensorbedrading

Voor module moet u weerstand en condensator desolderen, zoals weergegeven op de foto. Je kunt in principe alles desolderen als je wilt - module-elektronica is totaal nutteloos, we gebruiken het alleen als houder voor de sensor zelf, maar deze twee componenten zullen voorkomen dat je de juiste metingen krijgt, Als u een discrete sensor gebruikt, bevestigt u de verwarmingspennen (H1 en H2) op 5V en de collector van de transistor dienovereenkomstig. Bevestig een detectiezijde (een van de A-pinnen) aan 5V, een andere detectiezijde (een van de B-pinnen) aan een 10k-weerstand, net als de analoge pin van de module in schema's.

Stap 3: Werkingsprincipe

Werkingsprincipe
Werkingsprincipe
Werkingsprincipe
Werkingsprincipe

Waarom hebben we al deze complicaties nodig, waarom niet 5V aansluiten, aarden en gewoon metingen krijgen? Op deze manier krijg je helaas niets bruikbaars. Volgens de MQ-7-datasheet moet de sensor door hoge- en lage verwarmingscycli om de juiste metingen te krijgen. Tijdens de lage temperatuurfase wordt CO geabsorbeerd op de plaat, wat zinvolle gegevens oplevert. Tijdens de hoge temperatuurfase verdampen geabsorbeerde CO en andere verbindingen van de sensorplaat en reinigen deze voor de volgende meting.

Dus in het algemeen is de bediening eenvoudig:

1. Pas gedurende 60 seconden 5V toe, gebruik deze metingen niet voor CO-metingen.

2. Breng gedurende 90 seconden 1.4V aan, gebruik deze metingen voor CO-meting.

3. Ga naar stap 1.

Maar hier is het probleem: Arduino kan niet genoeg stroom leveren om deze sensor van zijn pinnen te laten werken - de verwarming van de sensor vereist 150 mA, terwijl de Arduino-pin niet meer dan 40 mA kan leveren, dus als deze rechtstreeks wordt aangesloten, zal de Arduino-pin branden en de sensor wint nog steeds niet werken. We moeten dus een soort stroomversterker gebruiken die een kleine ingangsstroom nodig heeft om een grote uitgangsstroom te regelen. Een ander probleem is het verkrijgen van 1,4 V. De enige manier om deze waarde betrouwbaar te krijgen zonder veel analoge componenten te introduceren, is door PWM (Pulse Width Modulation) -benadering te gebruiken met feedback die de uitgangsspanning regelt.

NPN-transistor lost beide problemen op: wanneer deze constant is ingeschakeld, is de spanning over de sensor 5V en wordt deze verwarmd voor een hoge temperatuurfase. Wanneer we PWM toepassen op de ingang, pulseert de stroom, wordt deze afgevlakt door de condensator en wordt de gemiddelde spanning constant gehouden. Als we hoogfrequente PWM gebruiken (in de schets heeft deze een frequentie van 62,5 KHz) en veel analoge metingen gemiddeld (in de schets gemiddeld meer dan ~ 1000 metingen), dan is het resultaat redelijk betrouwbaar.

Het is van cruciaal belang om condensatoren toe te voegen volgens schema's. Afbeeldingen hier illustreren het verschil in signaal met en zonder C2-condensator: zonder deze is de PWM-rimpel duidelijk zichtbaar en vervormt deze de meetwaarden aanzienlijk.

Stap 4: Schema's en Breadboard

Schema's en Breadboard
Schema's en Breadboard
Schema's en Breadboard
Schema's en Breadboard
Schema's en Breadboard
Schema's en Breadboard

Hier is het schema en de breadboard-assemblage.

WAARSCHUWING! Aanpassing van een standaard breakout-module is vereist! Zonder modificatie module is nutteloos. Wijziging wordt beschreven in de tweede stap

Het is belangrijk om pinnen D9 en D10 voor LED's te gebruiken, omdat we daar uitgangen van hardware Timer1 hebben, waardoor ze soepel van kleur kunnen veranderen. Pinnen D5 en D6 worden gebruikt voor zoemer, omdat D5 en D6 uitgangen zijn van hardware Timer0. We zullen ze zo configureren dat ze omgekeerd zijn, zodat ze schakelen tussen de toestanden (5V, 0V) en (0V, 5V), en zo geluid produceren op de zoemer. Waarschuwing: dit heeft invloed op de belangrijkste timing-interrupt van Arduino, dus alle tijdafhankelijke functies (zoals millis()) zullen in deze schets geen correcte resultaten opleveren (hierover later meer). Op pin D3 is hardware Timer2-uitgang aangesloten (evenals D11 - maar het is minder handig om draad op D11 te plaatsen dan op D3) - dus we gebruiken het om PWM te leveren voor spanningsregelende transistor. Weerstand R1 wordt gebruikt om de helderheid van LED's te regelen. Het kan overal van 300 tot 3000 Ohm zijn, 1k is vrij optimaal in helderheid/stroomverbruik. Weerstand R2 wordt gebruikt om de basisstroom van de transistor te beperken. Het mag niet lager zijn dan 300 Ohm (om de Arduino-pin niet te overbelasten), en niet hoger dan 1500 Ohm. 1k is er een veilige keuze.

Weerstand R3 wordt in serie met de sensorplaat gebruikt om een spanningsdeler te creëren. De spanning op de uitgang van de sensor is gelijk aan R3 / (R3 + Rs) * 5V, waarbij Rs de weerstand van de huidige sensor is. De weerstand van de sensor is afhankelijk van de CO-concentratie, dus de spanning verandert dienovereenkomstig. Condensator C1 wordt gebruikt om de PWM-ingangsspanning op de MQ-7-sensor af te vlakken, hoe hoger de capaciteit, hoe beter, maar het moet ook een lage ESR hebben - dus keramiek (of tantaal) condensator heeft hier de voorkeur, elektrolytische zal niet goed presteren.

Condensator C2 wordt gebruikt om de analoge uitgang van de sensor af te vlakken (uitgangsspanning is afhankelijk van ingangsspanning - en we hebben hier een vrij hoge stroom PWM, die van invloed is op alle schema's, dus we hebben C2) nodig. De eenvoudigste oplossing is om dezelfde condensator te gebruiken als de C1. NPN-transistor die de hele tijd stroom geleidt om een hoge stroom te leveren aan de verwarming van de sensor, of in PWM-modus werkt, waardoor de verwarmingsstroom wordt verminderd.

Stap 5: Arduino-programma

Arduino-programma
Arduino-programma

WAARSCHUWING: DE SENSOR VEREIST HANDMATIGE KALIBRATIE VOOR ELK PRAKTISCH GEBRUIK. ZONDER KALIBRATIE, AFHANKELIJK VAN DE PARAMETERS VAN UW SPECIFIEKE SENSOR, KAN DEZE SCHETS HET ALARM IN SCHONE LUCHT INSCHAKELEN OF DE DODELIJKE KOOLMONOXIDECONCENTRATIE NIET DETECTEREN

Kalibratie wordt beschreven in de volgende stappen. Ruwe kalibratie is heel eenvoudig, nauwkeurig is behoorlijk complex.

Op algemeen niveau is het programma vrij eenvoudig:

Eerst kalibreren we onze PWM om stabiele 1.4V te produceren die door de sensor wordt vereist (de juiste PWM-breedte hangt af van veel parameters, zoals exacte weerstandswaarden, de weerstand van deze specifieke sensor, de VA-curve van de transistor, enz. - Dus de beste manier is om verschillende waarden te proberen en gebruik er een die het beste past). Vervolgens doorlopen we een cyclus van 60 seconden verwarmen en 90 seconden meten. Bij de implementatie wordt het enigszins gecompliceerd. We moeten hardwaretimers gebruiken omdat alles wat we hier hebben hoogfrequente stabiele PWM nodig heeft om goed te kunnen functioneren. De code is hier bijgevoegd en kan worden gedownload van onze github, evenals de schemabron in Fritzing. In het programma zijn er 3 functies die timers afhandelen: setTimer0PWM, setTimer1PWM, setTimer2PWM. Elk van hen stelt de timer in PWM-modus in met bepaalde parameters (commentaar in de code), en stelt de pulsbreedte in volgens de invoerwaarden. Meetfasen worden geschakeld met behulp van de functies startMeasurementPhase en startHeatingPhase, ze regel alles binnen. en stel de juiste timerwaarden in voor het schakelen tussen 5V en 1,4V verwarming. De status van de leds wordt ingesteld door de functie setLEDs die groene en rode helderheid op de ingang accepteert (in lineaire schaal van 1-100) en deze omzet in de overeenkomstige timerinstelling.

De zoemerstatus wordt geregeld met de functies buzz_on, buzz_off, buzz_beep. Aan/uit-functies zetten het geluid aan en uit, de piepfunctie produceert een specifieke piepreeks met een periode van 1,5 seconde als deze periodiek wordt aangeroepen (deze functie keert onmiddellijk terug zodat het hoofdprogramma niet wordt onderbroken - maar u moet hem steeds opnieuw oproepen pieppatroon te produceren).

Programma voert eerst de functie pwm_adjust uit die de juiste PWM-cyclusbreedte ontdekt om 1,4 V te bereiken tijdens de meetfase. Daarna piept het een paar keer om aan te geven dat de sensor gereed is, overschakelt naar de meetfase en de hoofdlus start.

In de hoofdlus controleert het programma of we voldoende tijd in de huidige fase hebben doorgebracht (90 seconden voor de meetfase, 60 seconden voor de verwarmingsfase) en zo ja, dan verandert de huidige fase. Het werkt ook constant sensormetingen bij met behulp van exponentiële afvlakking: nieuwe_waarde = 0,999*oude_waarde + 0,001*nieuwe_waarde. Met dergelijke parameters en meetcyclus wordt het signaal gemiddeld over de laatste 300 milliseconden. WAARSCHUWING: DE SENSOR VEREIST HANDMATIGE KALIBRATIE VOOR ELK PRAKTISCH GEBRUIK. ZONDER KALIBRATIE, AFHANKELIJK VAN DE PARAMETERS VAN UW SPECIFIEKE SENSOR, KAN DEZE SCHETS ALARM IN SCHONE LUCHT WORDEN INGESCHAKELD OF DE DODELIJKE KOOLMONOXIDECONCENTRATIE NIET DETECTEERT.

Stap 6: Eerste run: wat te verwachten?

Eerste run: wat te verwachten?
Eerste run: wat te verwachten?

Als je alles goed hebt geassembleerd, zie je na het uitvoeren van de schets zoiets als dit in Seriële monitor:

PWM aanpassen w=0, V=4.93

PWM aanpassen w=17, V=3.57PWM resultaat: breedte 17, spanning 3.57

en vervolgens een reeks getallen die de huidige sensormetingen vertegenwoordigen. Dit onderdeel past de PWM-breedte aan om de verwarmingsspanning van de sensor zo dicht mogelijk bij 1,4 V te produceren, de gemeten spanning wordt afgetrokken van 5 V, dus onze ideale gemeten waarde is 3,6 V. Als dit proces nooit eindigt of eindigt na een enkele stap (resulterend in een breedte gelijk aan 0 of 254) - dan is er iets mis. Controleer of uw transistor echt NPN is en correct is aangesloten (zorg ervoor dat u de basis-, collector-, emitterpinnen rechts hebt gebruikt - basis gaat naar D3, collector naar MQ-7 en emitter naar aarde, reken niet op Fritzing breadboard-weergave - het is fout voor sommige transistors) en zorg ervoor dat je de sensoringang hebt aangesloten op Arduino's A1-ingang. Als alles in orde is, zou je in Serial Plotter van Arduino IDE iets moeten zien dat lijkt op de afbeelding. Verwarmings- en meetcycli met een lengte van 60 en 90 seconden worden na elkaar uitgevoerd, waarbij aan het einde van elke cyclus CO ppm wordt gemeten en bijgewerkt. U kunt een open vuur dicht bij de sensor nemen wanneer de meetcyclus bijna is voltooid en zien hoe dit de metingen beïnvloedt (afhankelijk van het vlamtype kan het tot 2000 ppm CO-concentratie in open lucht produceren - dus hoewel slechts een klein deel van het gaat daadwerkelijk in de sensor, het zal nog steeds het alarm inschakelen en het gaat pas af aan het einde van de volgende cyclus). Ik liet het op de afbeelding zien, evenals de reactie op het vuur van de aansteker.

Stap 7: Sensorkalibratie

Sensorkalibratie
Sensorkalibratie
Sensorkalibratie
Sensorkalibratie

Volgens het gegevensblad van de fabrikant moet de sensor 48 uur achter elkaar verwarmen en koelen voordat hij kan worden gekalibreerd. En je zou het moeten doen als je van plan bent het voor een lange tijd te gebruiken: in mijn geval veranderde de sensormeting in schone lucht voor ongeveer 30% gedurende 10 uur. Als u hier geen rekening mee houdt, kunt u een resultaat van 0 ppm krijgen terwijl er in werkelijkheid 100 ppm CO is. Als u niet 48 uur wilt wachten, kunt u de sensoruitvoer aan het einde van de meetcyclus controleren. Als het meer dan een uur duurt, verandert het niet voor meer dan 1-2 punten - u kunt daar stoppen met verwarmen.

Ruwe kalibratie:

Nadat u de schets minimaal 10 uur in schone lucht hebt uitgevoerd, neemt u de onbewerkte sensorwaarde aan het einde van de meetcyclus, 2-3 seconden voordat de verwarmingsfase begint, en schrijft u deze in de variabele sensor_reading_clean_air (regel 100). Dat is het. Het programma zal andere sensorparameters schatten, ze zullen niet precies zijn, maar zouden voldoende moeten zijn om een onderscheid te maken tussen 10 en 100 ppm concentratie.

Nauwkeurige kalibratie:

Ik raad ten zeerste aan om een gekalibreerde CO-meter te zoeken, 100 ppm CO-monster te maken (dit kan worden gedaan door wat rookgas in de spuit te nemen - de CO-concentratie kan gemakkelijk in het bereik van enkele duizenden ppm zijn - en langzaam in een gesloten pot te doen met gekalibreerde meter en MQ-7-sensor), neem de onbewerkte sensormeting bij deze concentratie en plaats deze in de variabele sensor_reading_100_ppm_CO. Zonder deze stap kan uw ppm-meting meerdere keren in beide richtingen fout zijn (nog steeds oké als u een alarm voor gevaarlijke CO-concentratie thuis nodig hebt, waar normaal gesproken helemaal geen CO zou moeten zijn, maar niet goed voor een industriële toepassing).

Omdat ik geen CO-meter had, gebruikte ik een meer geavanceerde aanpak. Eerst bereidde ik een hoge concentratie CO met behulp van verbranding in een geïsoleerd volume (eerste foto). In dit artikel vond ik de meest bruikbare gegevens, inclusief CO-opbrengst voor verschillende vlamtypes - het staat niet op de foto, maar het laatste experiment gebruikte propaangasverbranding, met dezelfde opstelling, resulterend in ~ 5000 ppm CO-concentratie. Vervolgens werd het 1:50 verdund om 100 ppm te bereiken, zoals geïllustreerd in de tweede foto, en gebruikt om het referentiepunt van de sensor te bepalen.

Stap 8: enkele experimentele gegevens

Enkele experimentele gegevens
Enkele experimentele gegevens

In mijn geval werkte de sensor redelijk goed - hij is niet erg gevoelig voor echt lage concentraties, maar goed genoeg om iets hoger dan 50 ppm te detecteren. Ik probeerde de concentratie geleidelijk te verhogen, metingen te doen en een reeks grafieken te maken. Er zijn twee sets 0ppm-lijnen: puur groen voor blootstelling aan CO en geelgroen daarna. De sensor lijkt zijn luchtweerstand enigszins te veranderen na blootstelling, maar dit effect is klein. Het lijkt geen duidelijk onderscheid te kunnen maken tussen 8 en 15, 15 en 26, 26 en 45 ppm-concentraties - maar de trend is heel duidelijk, dus het kan zien of de concentratie zich in het bereik van 0-20 of 40-60 ppm bevindt. Voor hogere concentraties is de afhankelijkheid veel onderscheidender - bij blootstelling aan de uitlaat van een open vlam gaat de curve vanaf het begin omhoog zonder helemaal naar beneden te gaan, en de dynamiek is totaal anders. Dus voor hoge concentraties lijdt het geen twijfel dat het betrouwbaar werkt, hoewel ik de precisie ervan niet kan bevestigen omdat ik geen nominale CO-meter heb. Deze reeks experimenten werd ook gedaan met een belastingsweerstand van 20k - en daarna besloot ik om 10k als standaardwaarde aan te bevelen, zou het op deze manier gevoeliger moeten zijn. Dat is alles. Als je een betrouwbare CO-meter hebt en dit bord hebt geassembleerd, deel dan wat feedback over sensorprecisie - het zou geweldig zijn om statistieken over verschillende sensoren te verzamelen en de standaard schetsaannames te verbeteren.

Aanbevolen: