Indholdsfortegnelse:

Arduino CO-skærm ved hjælp af MQ-7-sensor: 8 trin (med billeder)
Arduino CO-skærm ved hjælp af MQ-7-sensor: 8 trin (med billeder)

Video: Arduino CO-skærm ved hjælp af MQ-7-sensor: 8 trin (med billeder)

Video: Arduino CO-skærm ved hjælp af MQ-7-sensor: 8 trin (med billeder)
Video: Sådan styres aktuator ved hjælp af Arduino - Robojax 2024, November
Anonim
Arduino CO-skærm ved hjælp af MQ-7-sensor
Arduino CO-skærm ved hjælp af MQ-7-sensor
Arduino CO-skærm ved hjælp af MQ-7-sensor
Arduino CO-skærm ved hjælp af MQ-7-sensor

Et par ord, hvorfor denne instruktive blev oprettet: en dag ringede min kærestes mor os midt om natten, fordi hun følte sig virkelig syg - hun havde svimmelhed, takykardi, kvalme, forhøjet blodtryk, hun besvimede endda i ukendt tid (sandsynligvis ~ 5 minutter, men der er ingen måde at fortælle det), alt sammen uden nogen åbenbar grund. Hun bor i en lille landsby langt væk fra hospitaler (60 km fra vores sted, 30 km til det nærmeste hospital, 10 km uden normal vej imellem), så vi skyndte os til hende og kom der hurtigt efter ambulancen. Hun blev indlagt og om morgenen følte hun det næsten godt, men lægerne kunne ikke finde årsagen til det. Den næste dag havde vi en idé: det kunne have været CO-forgiftning, da hun har gasvandskedel (på billedet), og sad tæt på det hele aftenen, da det skete. Vi købte for nylig MQ-7 CO-sensor, men havde aldrig tid til at samle en skema til det, så dette var det perfekte tidspunkt at gøre det. Efter en times søgen på internettet efter instruktioner, indså jeg, at jeg ikke kan finde nogen vejledning, der samtidig følger sensorproducentens instruktioner i databladet og forklarer noget som helst (et eksempel syntes at have en ganske god kode, men det var ikke klar over, hvordan man skulle anvende det, andre var for enkle og fungerede ikke godt). Så vi brugte cirka 12 timer på at udvikle skemaer, lave og udskrive 3d -kasse, teste og kalibrere sensoren, og den næste dag gik vi til den mistænkelige kedel. Det viste sig, at CO -niveauerne var ekstremt høje og kunne være dødelige, hvis CO -eksponeringstiden var længere. Så jeg tror, at alle, der har en lignende situation (som gasfyr eller anden forbrænding, der sker inde i et opholdsrum) bør få en sådan sensor til at forhindre, at noget dårligt sker.

Alt det skete for to uger siden, siden da har jeg forbedret skemaer og programmeret ret meget, og nu ser det ud til at være rimelig godt og relativt enkelt (ikke 3-linies-kode enkelt, men stadig). Selvom jeg håber, at en person med præcis CO -måler vil give mig nogle tilbagemeldinger om standardkalibrering, som jeg har lagt i skitsen - jeg formoder, at det langt fra er godt. Her er en komplet guide med nogle eksperimentelle data.

Trin 1: Stykliste

Materialeseddel
Materialeseddel

Du skal bruge: 0. Arduino bord. Jeg foretrækker kinesisk klon af Arduino Nano til sin enestående pris på $ 3, men enhver 8-bit arduino vil fungere her. Sketch bruger nogle avancerede timere -drift og blev kun testet på atmega328 mikrokontroller - selvom det sandsynligvis også vil fungere godt på andre. MQ-7 CO sensor. Mest almindeligt tilgængelig med dette Flying Fish-sensormodul, skal den gennemgå en lille ændring, detaljer i det næste trin, eller du kan bruge en adskilt MQ-7sensor.

2. NPN bipolar transistor. Næsten enhver NPN -transistor, der kan håndtere 300 mA eller mere, fungerer her. PNP-transistor fungerer ikke med et nævnt Flying Fish-modul (fordi det har en varmestift loddet til sensorens output), men kan bruges med en diskret MQ-7-sensor.

3. Modstande: 2 x 1k (fra 0,5k til 1,2k vil fungere fint) og 1 x 10k (den ene holdes bedst præcis - selvom hvis du absolut skal bruge en anden værdi, skal du justere reference_resistor_kOhm -variablen i skitsen i overensstemmelse hermed).

4. Kondensatorer: 2 x 10uF eller mere. Tantal eller keramik er påkrævet, elektrolyt vil ikke fungere godt på grund af høj ESR (de vil ikke være i stand til at levere nok strøm til at udjævne strøm med høj strøm).5. Grønne og røde lysdioder for at angive det aktuelle CO-niveau (du kan også bruge en enkelt dobbeltfarvet LED med 3 terminaler, som vi brugte i vores gule boks-prototype).6. Piezo -summer til at angive et højt CO -niveau. Brødbræt og ledninger (du kan også lodde alt til nanostifter eller klemme i Uno -stik, men det er let at lave en fejl på denne måde).

Trin 2: Modulmodifikation eller diskret sensorledning

Modulmodifikation eller diskret sensorledning
Modulmodifikation eller diskret sensorledning

For modul skal du aflodde modstand og kondensator, som vist på billedet. Du kan aflodde stort set alt, hvis du vil - modulelektronik er totalt ubrugelig, vi bruger den kun som holder til selve sensoren, men disse to komponenter forhindrer dig i at få korrekte aflæsninger, Hvis du bruger en separat sensor, skal varmestifter (H1 og H2) fastgøres til 5V og transistorens kollektor tilsvarende. Sæt en sensingside (en af A -stifter) til 5V, en anden sensingside (en hvilken som helst af B -stifter) til 10k modstand, ligesom den analoge pin på modulet i skemaer.

Trin 3: Driftsprincip

Driftsprincip
Driftsprincip
Driftsprincip
Driftsprincip

Hvorfor har vi overhovedet brug for alle disse komplikationer, hvorfor ikke tilslutte 5V, jord og bare få aflæsninger? Nå, du får desværre ikke noget nyttigt på denne måde. Ifølge MQ-7 datablad skal sensoren løbe igennem høj- og lavopvarmningscyklusser for at få korrekte målinger. Under lavtemperaturfasen absorberes CO på pladen og producerer meningsfulde data. Under høj temperaturfase fordamper absorberet CO og andre forbindelser fra sensorpladen og renser det til den næste måling.

Så generelt er betjeningen enkel:

1. Anvend 5V i 60 sekunder, brug ikke disse målinger til CO -måling.

2. Påfør 1,4V i 90 sekunder, brug disse målinger til CO -måling.

3. Gå til trin 1.

Men her er problemet: Arduino kan ikke levere nok strøm til at køre denne sensor fra dens ben - sensorens varmelegeme kræver 150 mA, mens Arduino -stiften ikke kan levere mere end 40 mA, så hvis den er tilsluttet direkte, vil Arduino -stiften brænde, og sensoren vinder stadig virker ikke. Så vi skal bruge en slags strømforstærker, der tager lille indgangsstrøm til at styre stor udgangsstrøm. Et andet problem er at få 1.4V. Den eneste måde at få denne værdi pålideligt uden at introducere mange analoge komponenter er at bruge PWM (Pulse Width Modulation) tilgang med feedback, der styrer udgangsspændingen.

NPN-transistor løser begge problemer: Når den konstant er tændt, er spændingen over sensoren 5V, og den opvarmes til høj temperaturfase. Når vi anvender PWM til dens input, pulserer strømmen, så udjævnes den af kondensatoren, og den gennemsnitlige spænding holdes konstant. Hvis vi bruger højfrekvent PWM (i skitsen har den en frekvens på 62,5KHz) og gennemsnitligt mange analoge aflæsninger (i skitsen gennemsnit vi over ~ 1000 aflæsninger), så er resultatet ganske pålideligt.

Det er afgørende at tilføje kondensatorer i henhold til skemaer. Billeder her illustrerer forskel i signal med og uden C2 -kondensator: uden den er PWM -krusning tydeligt synlig, og den forvrænger aflæsninger betydeligt.

Trin 4: Skemaer og brødbræt

Skemaer og brødbræt
Skemaer og brødbræt
Skemaer og brødbræt
Skemaer og brødbræt
Skemaer og brødbræt
Skemaer og brødbræt

Her er skematikken og brødbrættet.

ADVARSEL! Ændring af et standard breakout -modul er påkrævet! Uden modifikation er modul ubrugeligt. Ændring er beskrevet i det andet trin

Det er vigtigt at bruge stifterne D9 og D10 til lysdioder, da vi har output af hardware Timer1, giver det mulighed for problemfrit at ændre deres farver. Stifterne D5 og D6 bruges til summer, fordi D5 og D6 er output fra hardware Timer0. Vi konfigurerer dem til at være omvendt fra hinanden, så de vil skifte mellem (5V, 0V) og (0V, 5V) tilstande og dermed producere lyd på summer. Advarsel: dette påvirker Arduinos vigtigste timing-afbrydelse, så alle tidsafhængige funktioner (som millis ()) vil ikke producere korrekte resultater i denne skitse (mere om dette senere). Pin D3 har hardware Timer2-output forbundet til det (samt D11 - men det er mindre bekvemt at sætte ledning på D11 end på D3) - så vi bruger det til at levere PWM til spændingskontroltransistor. Modstand R1 bruges til at styre lysdiodernes lysstyrke. Det kan være alt fra 300 til 3000 Ohm, 1k er temmelig optimalt i lysstyrke/strømforbrug. Modstand R2 bruges til at begrænse transistorens basisstrøm. Det bør ikke være lavere end 300 ohm (for ikke at overbelaste Arduino pin) og ikke højere end 1500 ohm. 1k der er et sikkert valg.

Modstand R3 bruges i serie med sensorplade for at skabe en spændingsdeler. Spænding på sensorens output er lig med R3 / (R3 + Rs) * 5V, hvor Rs er strømfølers modstand. Sensormodstand afhænger af CO -koncentration, så spændingen ændres i overensstemmelse hermed. Kondensator C1 bruges til at udjævne PWM -spænding på MQ -7 -sensoren, jo højere kapacitans er jo bedre, men også den skal have lav ESR - så keramik (eller tantal) kondensator foretrækkes her, vil den elektrolytiske ikke fungere godt.

Kondensator C2 bruges til at udjævne sensorens analoge udgang (udgangsspændingen afhænger af indgangsspændingen - og vi har en ganske høj strøm PWM her, der påvirker alle skemaer, så vi har brug for C2). Den enkleste løsning er at bruge den samme kondensator som C1. NPN -transistoren enten leder strøm hele tiden for at levere høj strøm på sensorens varmelegeme eller fungerer i PWM -tilstand og reducerer dermed varmestrømmen.

Trin 5: Arduino -program

Arduino -program
Arduino -program

ADVARSEL: SENSOR KRÆVER MANUEL KALIBRERING TIL ALLE PRAKTISKE BRUG. UDEN KALIBRERING, AFHENDIG AF PARAMETRE I DIN SÆRLIGE SENSOR, SKAL DETTE SKETCH TÆNDE PÅ ALARM I REN LUFT ELLER IKKE OPLETE LETHAL CARBON MONOXIDE CONCENTRATION

Kalibrering er beskrevet i de følgende trin. Grov kalibrering er meget enkel, præcis er ret kompleks.

På det generelle plan er programmet ret simpelt:

Først kalibrerer vi vores PWM for at producere stabil 1,4V, der kræves af sensoren (korrekt PWM -bredde afhænger af mange parametre som nøjagtige modstandsværdier, netop denne sensors modstand, transistorens VA -kurve osv. Osv. - så den bedste måde er at prøve forskellige værdier og brug en, der passer bedst). Derefter løber vi kontinuerligt igennem en cyklus på 60 sekunder opvarmning og 90 sekunder måling. I implementeringen bliver det noget kompliceret. Vi er nødt til at bruge hardware-timere, fordi alt, hvad vi har her, har brug for højfrekvent stabil PWM for at fungere korrekt. Koden er vedhæftet her og kan downloades fra vores github, samt skematisk kilde i Fritzing. I programmet er der 3 funktioner, der håndterer timere: setTimer0PWM, setTimer1PWM, setTimer2PWM. Hver af dem indstiller timeren i PWM -tilstand med givne parametre (kommenteret i koden) og indstiller pulsbredde i henhold til inputværdier. håndtere alt indeni. og indstil korrekte timerværdier til at skifte mellem 5V og 1,4V opvarmning. LED'ernes tilstand indstilles af funktionssetLED'er, der accepterer grøn og rød lysstyrke på sin indgang (i lineær 1-100 skala) og konverterer den til tilsvarende timerindstilling.

Buzzer -tilstand styres ved hjælp af funktionerne buzz_on, buzz_off, buzz_beep. Tænd/sluk -funktioner tænder og slukker for lyden, bipfunktionen producerer en bestemt bip -sekvens med en periode på 1,5 sekunder, hvis den periodisk kaldes (denne funktion vender straks tilbage, så den ikke stopper hovedprogrammet - men du skal ringe til den igen og igen at producere bip -mønster).

Programmet kører først funktionen pwm_adjust, der finder ud af korrekt PWM -cyklusbredde for at opnå 1,4V under målefasen. Derefter bipper det et par gange for at indikere, at sensoren er klar, skifter til målefase og starter hovedsløjfen.

I hovedsløjfen kontrollerer programmet, om vi har brugt nok tid i den aktuelle fase (90 sekunder til målefasen, 60 sekunder til opvarmningsfasen), og hvis ja, ændrer den aktuelle fase. Det opdaterer også konstant sensoraflæsninger ved hjælp af eksponentiel udjævning: new_value = 0,999*old_value + 0,001*new_reading. Med sådanne parametre og målecyklus, giver det et gennemsnit af signal i løbet af de sidste 300 millisekunder. ADVARSEL: SENSOR KRÆVER MANUEL KALIBRERING TIL ALLE PRAKTISKE BRUG. UDEN KALIBRERING, AFHENDIG AF PARAMETRE I DIN SÆRLIGE SENSOR, SKAL DETTE SKETCH TÆNDE PÅ ALARM I REN LUFT ELLER IKKE OPLETE LETHAL CARBON MONOXIDE CONCENTRATION.

Trin 6: Første kørsel: Hvad kan man forvente

Første løb: Hvad kan man forvente
Første løb: Hvad kan man forvente

Hvis du har samlet alt korrekt, vil du efter at have kørt skitse se noget lignende i Serial monitor:

justering af PWM w = 0, V = 4,93

justering af PWM w = 17, V = 3,57PWM resultat: bredde 17, spænding 3,57

og derefter en række tal, der repræsenterer aktuelle sensoraflæsninger. Denne del er justering af PWM -bredden for at producere sensors varmespænding så tæt på 1,4V som muligt, den målte spænding trækkes fra 5V, så vores ideelle måleværdi er 3,6V. Hvis denne proces aldrig slutter eller slutter efter et enkelt trin (hvilket resulterer i bredde lig med 0 eller 254) - så er der noget galt. Kontroller, om din transistor virkelig er NPN og er korrekt tilsluttet (sørg for, at du har brugt base, samler, emitterstifter til højre - basen går til D3, kollektor til MQ -7 og emitter til jorden, regner ikke med Fritzing breadboard view - det er forkert for nogle transistorer) og sørg for, at du har tilsluttet sensorens input til Arduinos A1 -indgang. Hvis alt er i orden, skal du i Serial Plotter fra Arduino IDE se noget, der ligner billedet. Opvarmnings- og målecyklusser på 60 og 90 sekunders længde kører efter hinanden, hvor CO ppm måles og opdateres i slutningen af hver cyklus. Du kan tage en åben flamme tæt på sensoren, når målecyklussen er næsten færdig og se, hvordan det vil påvirke aflæsninger (afhængigt af flammetype kan det producere op til 2000 ppm CO -koncentration i det fri - så selvom kun en lille del af den går faktisk ind i sensoren, den vil stadig tænde alarmen, og den går ikke ud før i slutningen af den næste cyklus). Jeg viste det på billedet, samt reaktionen på ild fra lighter.

Trin 7: Sensorkalibrering

Sensorkalibrering
Sensorkalibrering
Sensorkalibrering
Sensorkalibrering

Ifølge producentens datablad skal sensoren køre opvarmnings-køle-cykler i 48 timer i træk, før den kan kalibreres. Og du bør gøre det, hvis du har tænkt dig at bruge det i lang tid: i mit tilfælde ændrede sensoraflæsning i ren luft sig i cirka 30% i løbet af 10 timer. Hvis du ikke tager dette i betragtning, kan du få 0 ppm resultat, hvor der faktisk er 100 ppm CO. Hvis du ikke vil vente i 48 timer, kan du overvåge sensorens output ved slutningen af målecyklussen. Når det over en time ikke ændres i mere end 1-2 point - kan du stoppe opvarmningen der.

Grov kalibrering:

Efter at have kørt skitse i mindst 10 timer i ren luft, skal du tage rå sensorværdi i slutningen af målecyklussen, 2-3 sekunder før opvarmningsfasen starter, og skrive den ind i sensor_reading_clean_air variabel (linje 100). Det er det. Programmet vil estimere andre sensorparametre, de vil ikke være præcise, men bør være nok til at skelne mellem 10 og 100 ppm koncentration.

Præcis kalibrering:

Jeg anbefaler stærkt at finde en kalibreret CO -måler, lave 100 ppm CO -prøve (dette kan gøres ved at tage noget røggas i sprøjten - CO -koncentration kan let ligge i området mellem flere tusinde ppm - og langsomt lægge den i lukket krukke med kalibreret måler og MQ-7 sensor), tag rå sensormåling ved denne koncentration og sæt den i sensor_reading_100_ppm_CO variabel. Uden dette trin kan din ppm -måling være forkert flere gange i begge retninger (stadig ok, hvis du har brug for alarm for farlig CO -koncentration derhjemme, hvor der normalt ikke burde være CO, men ikke godt til enhver industriel anvendelse).

Da jeg ikke havde nogen CO -måler, brugte jeg en mere sofistikeret tilgang. Først forberedte jeg en høj koncentration af CO ved hjælp af forbrænding i isoleret volumen (første foto). I dette papir fandt jeg de mest nyttige data, herunder CO -udbytte for forskellige flammetyper - det er ikke på billedet, men det sidste eksperiment brugte propangasforbrænding med samme opsætning, hvilket resulterede i ~ 5000 ppm CO -koncentration. Derefter blev den fortyndet 1:50 for at opnå 100 ppm, som illustreret på det andet foto, og blev brugt til at bestemme sensorens referencepunkt.

Trin 8: Nogle eksperimentelle data

Nogle eksperimentelle data
Nogle eksperimentelle data

I mit tilfælde fungerede sensoren ganske godt - den er ikke særlig følsom for virkelig lave koncentrationer, men god nok til at detektere noget højere end 50ppm. Jeg forsøgte gradvist at øge koncentrationen, tog målinger og byggede et sæt diagrammer. Der er to sæt 0ppm linjer - ren grøn før CO -eksponering og gulgrøn efter. Sensoren ser ud til lidt at ændre sin rene luftmodstand efter eksponering, men denne effekt er lille. Det ser ikke ud til klart at kunne skelne mellem 8 og 15, 15 og 26, 26 og 45 ppm koncentrationer-men tendensen er meget klar, så det kan se, om koncentrationen er i området 0-20 eller 40-60 ppm. For højere koncentrationer er afhængighed meget mere karakteristisk - når den udsættes for udstødning af en åben flamme, stiger kurven fra starten uden at gå ned overhovedet, og dens dynamik er helt anderledes. Så for høje koncentrationer er der ingen tvivl om, at det fungerer pålideligt, selvom jeg ikke kan bekræfte dets præcision, da jeg ikke har nogen vurderet CO -måler. Også dette sæt eksperimenter blev udført ved hjælp af 20k belastningsmodstand - og derefter besluttede jeg mig for for at anbefale 10k som standardværdi, burde den være mere følsom på denne måde. Det er det. Hvis du har en pålidelig CO -måler og vil have samlet dette kort, kan du dele nogle feedback om sensorpræcision - det ville være fantastisk at indsamle statistik over forskellige sensorer og forbedre standardskitsforudsætninger.

Anbefalede: