Innholdsfortegnelse:

Arduino CO-skjerm ved bruk av MQ-7-sensor: 8 trinn (med bilder)
Arduino CO-skjerm ved bruk av MQ-7-sensor: 8 trinn (med bilder)

Video: Arduino CO-skjerm ved bruk av MQ-7-sensor: 8 trinn (med bilder)

Video: Arduino CO-skjerm ved bruk av MQ-7-sensor: 8 trinn (med bilder)
Video: Как управлять приводом с помощью Arduino - Robojax 2024, Juli
Anonim
Arduino CO-skjerm ved bruk av MQ-7-sensor
Arduino CO-skjerm ved bruk av MQ-7-sensor
Arduino CO-skjerm ved bruk av MQ-7-sensor
Arduino CO-skjerm ved bruk av MQ-7-sensor

Noen få ord hvorfor denne instruerbare ble opprettet: en dag ringte moren til kjæresten min oss midt på natten fordi hun følte seg virkelig syk - hun hadde svimmelhet, takykardi, kvalme, høyt blodtrykk, hun besvimte til og med i ukjent tid (sannsynligvis ~ 5 minutter, men det er ingen måte å fortelle), alt uten noen åpenbar grunn. Hun bor i en liten landsby langt unna sykehus (60 km fra vårt sted, 30 km til nærmeste sykehus, 10 km uten normal vei mellom), så vi skyndte oss til henne og kom dit like etter ambulansen. Hun ble innlagt på sykehus og om morgenen følte hun seg nesten bra, men legene klarte ikke å finne årsaken til det. Dagen etter hadde vi en idé: det kunne ha vært CO-forgiftning, siden hun har en gassvannskjel (på bildet), og satt i nærheten av den hele kvelden da det skjedde. Vi kjøpte nylig MQ-7 CO-sensor, men hadde aldri tid til å sette sammen en skjema for det, så dette var det perfekte tidspunktet for det. Etter en times søking på internett etter instruksjoner, innså jeg at jeg ikke finner noen veiledning som samtidig følger sensorprodusentens instruksjoner i databladet og forklarer alt i det hele tatt (ett eksempel syntes å ha ganske god kode, men det var ikke klar over hvordan du skulle bruke den, andre var for enkle og ville ikke fungere bra). Så vi brukte omtrent 12 timer på å utvikle skjemaer, lage og skrive ut 3d -etui, teste og kalibrere sensoren, og dagen etter gikk vi til den mistenkelige kjelen. Det viste seg at CO -nivåene der var ekstremt høye, og kan være dødelige hvis CO -eksponeringstiden var lengre. Så jeg tror at alle som har en lignende situasjon (som gasskjel eller annen forbrenning som skjer inne i et boareal) bør få en slik sensor for å forhindre at noe ille skjer.

Alt som skjedde for to uker siden, siden da har jeg forbedret skjemaene og programmert ganske mye, og nå ser det ut til å være rimelig bra og relativt enkelt (ikke enkel 3-linjers kode, men likevel). Selv om jeg håper at noen med presis CO -måler vil gi meg noen tilbakemeldinger på standardkalibrering som jeg legger i skissen - jeg mistenker at det er langt fra bra. Her er en komplett guide med noen eksperimentelle data.

Trinn 1: Materialregning

Stykklister
Stykklister

Du trenger: 0. Arduino bord. Jeg foretrekker den kinesiske klonen av Arduino Nano for sin enestående pris på $ 3, men enhver 8-biters arduino vil fungere her. Sketch bruker noen avanserte tidtakere, og ble bare testet på atmega328 mikrokontroller - selv om det sannsynligvis vil fungere bra på andre også. MQ-7 CO sensor. Mest tilgjengelig med denne Flying Fish-sensormodulen, må den gjennomgå en liten modifikasjon, detaljer i neste trinn, eller du kan bruke en separat MQ-7-sensor.

2. NPN bipolar transistor. Nesten enhver NPN -transistor som kan håndtere 300 mA eller mer vil fungere her. PNP-transistor fungerer ikke med en nevnt Flying Fish-modul (fordi den har varmepinne loddet til sensorens utgang), men kan brukes med en diskret MQ-7-sensor.

3. Motstander: 2 x 1k (fra 0,5k til 1,2k vil fungere fint) og 1 x 10k (den ene holdes best presist - selv om du absolutt må bruke en annen verdi, juster reference_resistor_kOhm -variabelen i skissen deretter).

4. Kondensatorer: 2 x 10uF eller mer. Tantal eller keramiske er påkrevd, elektrolytisk vil ikke fungere godt på grunn av høy ESR (de vil ikke være i stand til å gi nok strøm til å jevne strøm med høy strøm).5. Grønne og røde lysdioder for å indikere gjeldende CO-nivå (du kan også bruke en enkelt tofarget LED med 3 terminaler, som vi brukte i vår gule boksprototype).6. Piezo -summer for å indikere høyt CO -nivå. Brødbrett og ledninger (du kan også lodde alt til Nano -pinner eller presse det inn i Uno -kontakter, men det er lett å gjøre en feil på denne måten).

Trinn 2: Modulmodifikasjon eller diskrete sensorkabler

Modulmodifikasjon eller diskrete sensorkabler
Modulmodifikasjon eller diskrete sensorkabler

For modul må du avlodde motstand og kondensator, som vist på bildet. Du kan desolde i utgangspunktet alt hvis du vil - modulelektronikk er totalt ubrukelig, vi bruker den bare som holder for selve sensoren, men disse to komponentene forhindrer deg i å få riktige avlesninger, Hvis du bruker en separat sensor, fest varmeelementpinnene (H1 og H2) til 5V og transistorens kollektor tilsvarende. Fest en sensingside (hvilken som helst A -pinne) til 5V, en annen sensingside (hvilken som helst B -pinne) til 10k motstand, akkurat som den analoge pinnen til modulen i skjemaer.

Trinn 3: Driftsprinsipp

Driftsprinsipp
Driftsprinsipp
Driftsprinsipp
Driftsprinsipp

Hvorfor trenger vi alle disse komplikasjonene i det hele tatt, hvorfor ikke koble til 5V, bakken og bare få avlesninger? Vel, du får dessverre ikke noe nyttig på denne måten. I følge MQ-7-datablad må sensoren løpe gjennom høy- og lavoppvarmingssykluser for å få riktige målinger. Under lavtemperaturfasen absorberes CO på platen og produserer meningsfylte data. Under høy temperatur fase fordamper absorbert CO og andre forbindelser fra sensorplaten og rengjør det for neste måling.

Så generelt er operasjonen enkel:

1. Påfør 5V i 60 sekunder, ikke bruk disse målingene til CO -måling.

2. Påfør 1,4V i 90 sekunder, bruk disse målingene for CO -måling.

3. Gå til trinn 1.

Men her er problemet: Arduino kan ikke gi nok strøm til å kjøre denne sensoren fra pinnene - sensorens varmeapparat krever 150 mA, mens Arduino -pinnen ikke kan gi mer enn 40 mA, så hvis den er festet direkte, vil Arduino -pinnen brenne og sensoren vil fortsatt vinne fungerer ikke. Så vi må bruke en slags strømforsterker som tar liten inngangsstrøm for å kontrollere stor utgangsstrøm. Et annet problem er å få 1,4V. Den eneste måten å få denne verdien på en pålitelig måte uten å introdusere mange analoge komponenter er å bruke PWM (Pulse Width Modulation) tilnærming med tilbakemelding som vil kontrollere utgangsspenningen.

NPN-transistoren løser begge problemene: når den er konstant slått på, er spenningen over sensoren 5V og den varmer for høy temperaturfase. Når vi bruker PWM på inngangen, pulserer strømmen, deretter glattes den av kondensatoren, og gjennomsnittsspenningen holdes konstant. Hvis vi bruker høyfrekvent PWM (i skissen har den en frekvens på 62,5 KHz) og gjennomsnittlig mange analoge avlesninger (i skissen gjennomsnittlig vi over ~ 1000 avlesninger), så er resultatet ganske pålitelig.

Det er kritisk å legge til kondensatorer i henhold til skjemaer. Bilder her illustrerer forskjell i signal med og uten C2 -kondensator: uten den er PWM -krusning tydelig synlig og den forvrenger avlesninger betydelig.

Trinn 4: Skjemaer og brødbrett

Skjemaer og brødbrett
Skjemaer og brødbrett
Skjemaer og brødbrett
Skjemaer og brødbrett
Skjemaer og brødbrett
Skjemaer og brødbrett

Her er skjematikken og brødbrettet.

ADVARSEL! Modifikasjon av en standard breakout -modul er nødvendig! Uten modifikasjon er modul ubrukelig. Modifikasjon er beskrevet i det andre trinnet

Det er viktig å bruke pinnene D9 og D10 for lysdioder, siden det har utganger av maskinvare Timer1, det vil tillate å jevnt endre fargene. Pins D5 og D6 brukes til summer, fordi D5 og D6 er utganger fra hardware Timer0. Vi vil konfigurere dem til å være inverse hverandre, slik at de vil bytte mellom (5V, 0V) og (0V, 5V) tilstander, og dermed produsere lyd på summer. Advarsel: dette påvirker Arduinos viktigste tidsavbrudd, så alle tidsavhengige funksjoner (som millis ()) vil ikke gi riktige resultater i denne skissen (mer om dette senere). Pin D3 har hardware Timer2-utgang koblet til den (samt D11 - men det er mindre praktisk å sette ledning på D11 enn på D3) - så vi bruker den til å gi PWM for spenningskontrollerende transistor. Motstand R1 brukes til å kontrollere lysstyrken til lysdioder. Det kan være alt fra 300 til 3000 Ohm, 1k er ganske optimalt når det gjelder lysstyrke/strømforbruk. Resistor R2 brukes til å begrense transistorens basestrøm. Det bør ikke være lavere enn 300 ohm (for ikke å overbelaste Arduino -pinnen), og ikke høyere enn 1500 ohm. 1k er det et trygt valg.

Motstand R3 brukes i serie med sensorplate for å lage en spenningsdeler. Spenning på sensorens utgang er lik R3 / (R3 + Rs) * 5V, hvor Rs er strømfølers motstand. Sensormotstanden avhenger av CO -konsentrasjon, så spenningen endres tilsvarende. Kondensator C1 brukes til å jevne inn PWM -spenning på MQ -7 -sensoren, jo høyere er kapasitansen, desto bedre, men den må også ha lav ESR - så keramikk (eller tantal) kondensator er å foretrekke her, vil den elektrolytiske ikke fungere godt.

Kondensator C2 brukes til å jevne sensorens analoge utgang (utgangsspenningen avhenger av inngangsspenningen - og vi har ganske høy PWM her, som påvirker alle skjemaer, så vi trenger C2). Den enkleste løsningen er å bruke den samme kondensatoren som C1. NPN -transistoren enten leder strøm hele tiden for å gi høy strøm på sensorens varmeapparat, eller fungerer i PWM -modus og reduserer dermed varmestrømmen.

Trinn 5: Arduino -program

Arduino -programmet
Arduino -programmet

ADVARSEL: SENSOR KREVER MANUELL KALIBRERING FOR ALLE PRAKTISK BRUK. UTEN KALIBRERING, AVHENGENDE AV PARAMETRE I DEN SÆRLIGE SENSOREN, KAN DETTE SKETSEN SLÅ PÅ ALARM I REN LUFT ELLER IKKE OPPDAG LETHAL CARBON MONOXIDE CONCENTRATION

Kalibrering er beskrevet i de følgende trinnene. Grov kalibrering er veldig enkel, presis er ganske kompleks.

På det generelle nivået er programmet ganske enkelt:

Først kalibrerer vi vår PWM for å produsere stabil 1.4V som kreves av sensoren (riktig PWM -bredde avhenger av mange parametere som eksakte motstandsverdier, denne sensorens motstand, transistorens VA -kurve etc etc - så den beste måten er å prøve forskjellige verdier og bruk en som passer best). Deretter går vi kontinuerlig gjennom en syklus på 60 sekunder med oppvarming og 90 sekunders måling. Vi må bruke maskinvaretimere fordi alt vi har her trenger høyfrekvent stabil PWM for å fungere skikkelig. Koden er vedlagt her og kan lastes ned fra vår github, samt skjematisk kilde i Fritzing. I programmet er det 3 funksjoner som håndterer tidtakere: setTimer0PWM, setTimer1PWM, setTimer2PWM. Hver av dem setter timeren i PWM -modus med gitte parametere (kommentert i koden), og angir pulsbredde i henhold til inngangsverdier. Målefaser byttes med funksjonene startMeasurementPhase og startHeatingPhase, de håndtere alt inni. og angi riktige timerverdier for veksling mellom 5V og 1,4V oppvarming. LED-tilstanden er satt av funksjonssettLEDer som godtar grønn og rød lysstyrke på inngangen (i lineær 1-100 skala) og konverterer den til tilsvarende timerinnstilling.

Summerstatus kontrolleres ved hjelp av funksjonene buzz_on, buzz_off, buzz_beep. På/av -funksjoner slår lyden på og av, pipefunksjonen produserer en bestemt pipesekvens med en periode på 1,5 sekunder hvis den blir ringt opp med jevne mellomrom (denne funksjonen returnerer umiddelbart, slik at den ikke stopper hovedprogrammet - men du må ringe den igjen og igjen for å produsere pipemønster).

Programmet kjører først funksjonen pwm_adjust som finner ut riktig PWM -syklusbredde for å oppnå 1,4V under målefasen. Deretter piper det noen ganger for å indikere at sensoren er klar, bytter til målefase og starter hovedsløyfen.

I hovedsløyfen sjekker programmet om vi brukte nok tid i gjeldende fase (90 sekunder for målefase, 60 sekunder for oppvarmingsfase), og hvis ja, endrer den nåværende fasen. Den oppdaterer også sensoravlesninger hele tiden ved hjelp av eksponentiell utjevning: new_value = 0,999*old_value + 0,001*new_reading. Med slike parametere og målesyklus, gjennomsnitts signalet over omtrent de siste 300 millisekundene. ADVARSEL: SENSOR KREVER MANUELL KALIBRERING FOR NOEN PRAKTISK BRUK. UTEN KALIBRERING, AVHENGENDE AV PARAMETRE I DEN SÆRLIGE SENSOREN, KAN DETTE SKETSEN SLÅ PÅ ALARM I REN LUFT ELLER IKKE OPPDAG LETHAL CARBON MONOXIDE CONCENTRATION.

Trinn 6: Første kjøring: Hva du kan forvente

Første løp: Hva du kan forvente
Første løp: Hva du kan forvente

Hvis du har montert alt på riktig måte, vil du etter å ha kjørt skisse se noe slikt i Serial monitor:

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

justering av PWM w = 17, V = 3,57PWM resultat: bredde 17, spenning 3,57

og deretter en rekke tall som representerer gjeldende sensoravlesninger. Denne delen er å justere PWM -bredden for å produsere sensors varmespenning så nær 1,4V som mulig, målt spenning trekkes fra 5V, så vår ideelle måleverdi er 3,6V. Hvis denne prosessen aldri slutter eller slutter etter et enkelt trinn (som resulterer i bredde lik 0 eller 254) - så er det noe galt. Sjekk om transistoren din virkelig er NPN og er riktig tilkoblet (sørg for at du brukte basen, samleren, emitterpinnene rett - basen går til D3, samleren til MQ -7 og emitteren til bakken, ikke regne med Fritzing breadboard view - det er feil for noen transistorer) og sørg for at du har koblet sensorens inngang til Arduinos A1 -inngang. Hvis alt er bra, bør du se i Serial Plotter fra Arduino IDE noe som ligner på bildet. Varme- og målesykluser på 60 og 90 sekunders lengde kjører etter hverandre, med CO ppm målt og oppdatert på slutten av hver syklus. Du kan ta en åpen flamme nær sensoren når målesyklusen er nesten ferdig og se hvordan det vil påvirke avlesningene (avhengig av flammetype kan den produsere opptil 2000 ppm CO -konsentrasjon i friluft - så selv om bare en liten del av den går faktisk inn i sensoren, den vil fortsatt slå på alarmen, og den vil ikke gå av før slutten av neste syklus). Jeg viste det på bildet, samt responsen på brann fra lighter.

Trinn 7: Sensorkalibrering

Sensorkalibrering
Sensorkalibrering
Sensorkalibrering
Sensorkalibrering

I følge produsentens datablad skal sensoren kjøre varmekjølesykluser i 48 timer på rad før den kan kalibreres. Og du bør gjøre det hvis du har tenkt å bruke det over lang tid: i mitt tilfelle endret sensoravlesningen i ren luft seg i omtrent 30% over 10 timer. Hvis du ikke tar dette i betraktning, kan du få 0 ppm resultat der det faktisk er 100 ppm CO. Hvis du ikke vil vente i 48 timer, kan du overvåke sensorutgangen på slutten av målesyklusen. Når det over en time ikke vil endre seg på mer enn 1-2 poeng - kan du slutte å varme der.

Grov kalibrering:

Etter å ha kjørt skissen i minst 10 timer i ren luft, ta rå sensorverdi i slutten av målesyklusen, 2-3 sekunder før oppvarmingsfasen starter, og skriv den inn i sensor_reading_clean_air variabel (linje 100). Det er det. Programmet vil estimere andre sensorparametere, de vil ikke være presise, men bør være nok til å skille mellom 10 og 100 ppm konsentrasjon.

Presis kalibrering:

Jeg anbefaler på det sterkeste å finne en kalibrert CO -måler, lage 100 ppm CO -prøve (dette kan gjøres ved å ta litt røykgass inn i sprøyten - CO -konsentrasjon kan lett ligge i området mellom flere tusen ppm - og sakte sette den i en lukket krukke med kalibrert måler og MQ-7-sensor), ta rå sensoravlesning ved denne konsentrasjonen og sett den inn i sensor_reading_100_ppm_CO-variabelen. Uten dette trinnet kan ppm -målingen din være feil flere ganger i begge retninger (fortsatt ok hvis du trenger alarm for farlig CO -konsentrasjon hjemme, hvor det normalt ikke burde være CO, men ikke bra for industrielle applikasjoner).

Siden jeg ikke hadde noen CO -måler, brukte jeg en mer sofistikert tilnærming. Først forberedte jeg høy konsentrasjon av CO ved forbrenning i isolert volum (første foto). I denne artikkelen fant jeg de mest nyttige dataene, inkludert CO -utbytte for forskjellige flammetyper - det er ikke på bildet, men det siste eksperimentet brukte forbrenning av propangass, med samme oppsett, noe som resulterte i ~ 5000 ppm CO -konsentrasjon. Deretter ble den fortynnet 1:50 for å oppnå 100 ppm, som vist på det andre bildet, og ble brukt til å bestemme sensorens referansepunkt.

Trinn 8: Noen eksperimentelle data

Noen eksperimentelle data
Noen eksperimentelle data

I mitt tilfelle fungerte sensoren ganske bra - den er ikke veldig følsom for veldig lave konsentrasjoner, men god nok til å oppdage noe høyere enn 50 sider / min. Jeg prøvde å øke konsentrasjonen gradvis, ta målinger og bygde et sett med diagrammer. Det er to sett med 0ppm linjer - ren grønn før CO -eksponering og gulgrønn etter. Sensoren ser ut til å endre ren luftmotstand litt etter eksponering, men denne effekten er liten. Det ser ikke ut til å kunne skille klart mellom 8 og 15, 15 og 26, 26 og 45 ppm konsentrasjoner-men trenden er veldig tydelig, så det kan se om konsentrasjonen er i området 0-20 eller 40-60 ppm. For høyere konsentrasjoner er avhengighet mye mer særegen - når den utsettes for åpen eksos, går kurven opp fra starten uten å gå ned i det hele tatt, og dens dynamikk er helt annerledes. Så for høye konsentrasjoner er det ingen tvil om at det fungerer pålitelig, selv om jeg ikke kan bekrefte presisjonen siden jeg ikke har noen CO -måler. Dette settet med eksperimenter ble også utført med 20k lastmotstand - og etter det bestemte jeg meg for å anbefale 10k som standardverdi, bør den være mer sensitiv på denne måten. Det er det. Hvis du har en pålitelig CO -måler og vil ha satt sammen dette kortet, vennligst del noen tilbakemeldinger om sensornøyaktighet - det ville være flott å samle statistikk over forskjellige sensorer og forbedre standard skisseforutsetninger.

Anbefalt: