Turinys:

„Arduino CO“monitorius naudojant MQ-7 jutiklį: 8 žingsniai (su nuotraukomis)
„Arduino CO“monitorius naudojant MQ-7 jutiklį: 8 žingsniai (su nuotraukomis)

Video: „Arduino CO“monitorius naudojant MQ-7 jutiklį: 8 žingsniai (su nuotraukomis)

Video: „Arduino CO“monitorius naudojant MQ-7 jutiklį: 8 žingsniai (su nuotraukomis)
Video: PZEM-004T и ESP8266 ESP-01 Wi-Fi-монитор энергопотребления | ESP-01 Домашняя автоматизация 2024, Liepa
Anonim
„Arduino CO“monitorius naudojant MQ-7 jutiklį
„Arduino CO“monitorius naudojant MQ-7 jutiklį
„Arduino“CO monitorius naudojant MQ-7 jutiklį
„Arduino“CO monitorius naudojant MQ-7 jutiklį

Keletas žodžių, kodėl buvo sukurtas šis pamokomas dalykas: vieną dieną mano merginos mama paskambino mums vidury nakties, nes jai labai blogai - svaigo galva, tachikardija, pykino, pakilo kraujospūdis, ji net apalpo nežinomą laiką (tikriausiai ~ 5 minučių, bet nėra jokio būdo pasakyti), viskas be jokios akivaizdžios priežasties. Ji gyvena mažame kaimelyje, toli nuo ligoninių (60 km nuo mūsų vietos, 30 km iki artimiausios ligoninės, 10 km be jokio normalaus kelio tarp jų), todėl mes skubėjome pas ją ir netrukus atvykome po greitosios pagalbos. Ji pateko į ligoninę ir ryte jautėsi beveik gerai, tačiau gydytojams nepavyko rasti to priežasties. Kitą dieną mes turėjome idėją: tai galėjo būti apsinuodijimas CO, nes ji turi dujinį vandens katilą (nuotraukoje) ir visą vakarą sėdėjo šalia, kai tai atsitiko. Neseniai nusipirkome MQ-7 CO jutiklį, bet niekada neturėjau laiko surinkti jo schemų, todėl tai buvo puikus laikas tai padaryti. Po valandos, kai internete ieškojau instrukcijų, supratau, kad nerandu jokio vadovo, kuris tuo pačiu metu atitiktų jutiklių gamintojo instrukcijas, pateiktas jo duomenų lape, ir iš viso ką nors paaiškintų (vienas pavyzdys atrodė gana geras, tačiau nebuvo aišku, kaip jį taikyti, kiti buvo supaprastinti ir netinkamai veikė). Taigi apie 12 valandų skyrėme schemoms kurti, 3D korpusui gaminti ir spausdinti, jutikliui išbandyti ir kalibruoti, o kitą dieną nuėjome prie įtartino katilo. Paaiškėjo, kad CO lygis ten buvo labai didelis ir gali būti mirtinas, jei CO ekspozicijos laikas būtų ilgesnis. Taigi manau, kad kiekvienas, turintis panašią situaciją (pvz., Dujinis katilas ar kitas degimas, vykstantis gyvenamojoje patalpoje), turėtų gauti tokį jutiklį, kad nebūtų nieko blogo.

Viskas, kas atsitiko prieš dvi savaites, nuo to laiko aš labai patobulinau schemas ir programą, o dabar atrodo, kad tai yra pakankamai gerai ir gana paprasta (ne 3 kodo eilutės paprastos, bet vis tiek). Nors tikiuosi, kad kažkas, turintis tikslų CO matuoklį, pateiks man atsiliepimų apie numatytąjį kalibravimą, kurį įdėjau į eskizą - įtariu, kad tai toli gražu nėra gerai. Čia yra visas vadovas su kai kuriais eksperimentiniais duomenimis.

1 žingsnis: medžiagų sąrašas

Sąmata
Sąmata

Jums reikės: 0. „Arduino“lenta. Man labiau patinka kiniškas „Arduino Nano“klonas už puikią 3 USD kainą, tačiau čia veiks bet koks 8 bitų arduino. „Sketch“naudoja kai kurias pažangias laikmačių operacijas ir buvo išbandytas tik naudojant „atmega328“mikrovaldiklį - nors tikriausiai jis gerai veiks ir su kitais. MQ-7 CO jutiklis. Dažniausiai prieinamas su šiuo „Flying Fish“jutiklio moduliu, jis turi būti atliktas nedideliu pakeitimu, kitame žingsnyje pateikiama išsami informacija arba galite naudoti atskirą MQ-7 jutiklį.

2. NPN bipolinis tranzistorius. Čia veiks praktiškai bet koks NPN tranzistorius, galintis valdyti 300 mA ar daugiau. PNP tranzistorius neveiks su minėtu „Flying Fish“moduliu (nes jame yra šildytuvo kaištis, prilituotas prie jutiklio išvesties), tačiau jį galima naudoti su atskiru MQ-7 jutikliu.

3. Rezistoriai: 2 x 1k (nuo 0,5k iki 1,2k veiks gerai) ir 1x10k (tą vieną geriausia laikyti tiksliai - nors jei būtinai turite naudoti kitą vertę, atitinkamai pakoreguokite eskizo kintamąjį reference_resistor_kOhm).

4. Kondensatoriai: 2 x 10uF ar daugiau. Reikalingi tantalo arba keramikos gaminiai, dėl didelio ESR elektrolitinė sistema neveiks gerai (jie negalės tiekti pakankamai srovės, kad išlygintų didelės srovės bangavimą). Žali ir raudoni šviesos diodai, rodantys esamą CO lygį (taip pat galite naudoti vieną dviejų spalvų šviesos diodą su 3 gnybtais, kaip mes naudojome savo geltonos dėžės prototipą). Pjezo garsinis signalas, rodantis aukštą CO lygį.7. Duonos lenta ir laidai (taip pat galite viską lituoti prie „Nano“kaiščių arba įspausti į „Uno“lizdus, tačiau tokiu būdu lengva suklysti).

2 veiksmas: modulio modifikavimas arba atskirų jutiklių laidai

Modulio modifikavimas arba atskirų jutiklių laidai
Modulio modifikavimas arba atskirų jutiklių laidai

Norėdami modulį, turite išlydyti rezistorių ir kondensatorių, kaip parodyta nuotraukoje. Iš esmės viską galite išlydyti, jei norite - modulio elektronika yra visiškai nenaudinga, mes ją naudojame tik kaip paties jutiklio laikiklį, tačiau šie du komponentai neleis jums gauti teisingų rodmenų, Jei naudojate diskretinį jutiklį, pritvirtinkite šildytuvo kaiščius (H1 ir H2) prie 5 V ir atitinkamai tranzistoriaus kolektoriaus. Pritvirtinkite vieną jutimo pusę (bet kurį iš A kaiščių) prie 5 V, kitą jutimo pusę (bet kurią iš B kaiščių) prie 10 k rezistoriaus, kaip ir schemoje esantį analoginį modulio kaištį.

3 žingsnis: veikimo principas

Veikimo principas
Veikimo principas
Veikimo principas
Veikimo principas

Kodėl mums reikia visų šių komplikacijų, kodėl gi ne prijungti 5 V įtampą ir tiesiog gauti rodmenis? Deja, tokiu būdu, deja, nieko naudingo negausite. Remiantis MQ-7 duomenų lapu, jutiklis turi veikti per aukštą ir žemo kaitinimo ciklai, kad būtų gauti tinkami matavimai. Žemos temperatūros fazėje CO absorbuojamas plokštelėje, gaunant reikšmingų duomenų. Aukštos temperatūros fazėje absorbuotas CO ir kiti junginiai išgaruoja iš jutiklio plokštelės, išvalydami jį kitam matavimui.

Taigi apskritai operacija yra paprasta:

1. 60 sekundžių naudokite 5 V įtampą, nenaudokite šių rodmenų CO matavimui.

2. 90 sekundžių naudokite 1,4 V įtampą, naudokite šiuos rodmenis CO matavimui.

3. Pereikite prie 1 veiksmo.

Bet čia yra problema: „Arduino“negali tiekti pakankamai energijos, kad šis jutiklis veiktų iš kaiščių - jutiklio šildytuvui reikia 150 mA, o „Arduino“kaiščiui - ne daugiau kaip 40 mA, taigi, jei jis bus tiesiogiai prijungtas, „Arduino“kaištis sudegs ir jutiklis vis tiek laimės neveikia. Taigi, norėdami valdyti didelę išėjimo srovę, turime naudoti tam tikrą srovės stiprintuvą, kuris naudoja mažą įvesties srovę. Kita problema yra 1.4V. Vienintelis būdas patikimai gauti šią vertę neįvedant daug analoginių komponentų yra naudoti PWM (impulso pločio moduliacijos) metodą su grįžtamuoju ryšiu, kuris valdys išėjimo įtampą.

NPN tranzistorius išsprendžia abi problemas: kai jis nuolat įjungiamas, jutiklio įtampa yra 5 V ir ji šildo aukštos temperatūros fazei. Kai jo įėjimui pritaikome PWM, srovė pulsuoja, tada ją išlygina kondensatorius, o vidutinė įtampa palaikoma pastovi. Jei mes naudojame aukšto dažnio PWM (eskize jo dažnis yra 62,5 KHz) ir vidutiniškai daug analoginių rodmenų (eskize mes vidutiniškai per ~ 1000 rodmenų), tada rezultatas yra gana patikimas.

Labai svarbu pridėti kondensatorių pagal schemą. Čia esantys vaizdai iliustruoja signalo skirtumą su C2 kondensatoriumi ir be jo: be jo PWM pulsavimas yra aiškiai matomas ir žymiai iškraipo rodmenis.

4 žingsnis: schemos ir „Breadboard“

Schemos ir „Breadboard“
Schemos ir „Breadboard“
Schemos ir „Breadboard“
Schemos ir „Breadboard“
Schemos ir „Breadboard“
Schemos ir „Breadboard“

Čia yra schemos ir duonos lentos surinkimas.

ĮSPĖJIMAS! Būtina keisti standartinį išjungimo modulį! Be modifikavimo modulis yra nenaudingas. Modifikacija aprašyta antrame žingsnyje

Šviesos diodams svarbu naudoti kaiščius D9 ir D10, nes ten yra aparatinės įrangos „Timer1“išvestys, tai leis sklandžiai keisti jų spalvas. Smeigtukai D5 ir D6 naudojami garso signalui, nes D5 ir D6 yra aparatinės įrangos laikmačio 0 išėjimai. Mes sukonfigūruosime, kad jie būtų atvirkščiai vienas kitam, todėl jie persijungs tarp (5V, 0V) ir (0V, 5V) būsenų, taip skleisdami garsą. Įspėjimas: tai turi įtakos pagrindiniam „Arduino“laiko pertraukimui, todėl visos nuo laiko priklausančios funkcijos (pvz., Milis ()) šiame eskize neteiks teisingų rezultatų (daugiau apie tai vėliau). „Pin D3“prijungta prie aparatinės įrangos „Timer2“išvestis (taip pat D11 - bet mažiau patogu prijungti laidą prie D11 nei ant D3), todėl mes naudojame jį, kad užtikrintume PWM įtampos valdymo tranzistoriui. Rezistorius R1 naudojamas šviesos diodų ryškumui valdyti. Jis gali būti nuo 300 iki 3000 omų, 1k yra gana optimalus ryškumas/energijos suvartojimas. Rezistorius R2 naudojamas riboti tranzistoriaus bazinę srovę. Jis neturėtų būti mažesnis nei 300 omų (kad nebūtų perkrautas „Arduino“kaištis) ir ne didesnis kaip 1500 omų. 1k yra saugus pasirinkimas.

Rezistorius R3 naudojamas serijiniu būdu su jutiklio plokštele, kad būtų sukurtas įtampos skirstytuvas. Jutiklio išėjimo įtampa yra lygi R3 / (R3 + Rs) * 5V, kur Rs yra srovės jutiklio varža. Jutiklio pasipriešinimas priklauso nuo CO koncentracijos, todėl atitinkamai keičiasi įtampa. Kondensatorius C1 naudojamas MW -7 jutiklio įvesties PWM įtampai išlyginti, tuo didesnė jo talpa, tuo geriau, bet taip pat turi būti mažas ESR - taigi keraminis (arba tantalo) čia pirmenybė teikiama kondensatoriui, elektrolitinis neveiks gerai.

Kondensatorius C2 naudojamas išlyginti jutiklio analoginę išvestį (išėjimo įtampa priklauso nuo įėjimo įtampos - ir čia mes turime gana didelę srovės PWM, kuri turi įtakos visoms schemoms, todėl mums reikia C2). Paprasčiausias sprendimas yra naudoti tą patį kondensatorių kaip ir C1. NPN tranzistorius arba visą laiką veda srovę, kad jutiklio šildytuve būtų didelė srovė, arba veikia PWM režimu, taip sumažinant šildymo srovę.

5 žingsnis: „Arduino“programa

„Arduino“programa
„Arduino“programa

ĮSPĖJIMAS: JUTIKLIUI REIKIA VADOVINIO KALIBRAVIMO bet kokiam praktiniam naudojimui. NESKALIBRUOTI, PRIKLAUSOMA Į JŪSŲ YPATINGO JUTIKLIO PARAMETRUS, ŠIS EŠKYTAS GALI ĮJUNGTI ALARMĄ ŠVALIAME OROJE ARBA NETIKTI LETALIO ANGLIES MONOKSIDO KONCENTRACIJOS

Kalibravimas aprašytas tolesniuose žingsniuose. Grubus kalibravimas yra labai paprastas, tikslus yra gana sudėtingas.

Apskritai programa yra gana paprasta:

Pirmiausia mes kalibruojame savo PWM, kad gautume stabilų 1,4 V, kurio reikalauja jutiklis (tinkamas PWM plotis priklauso nuo daugelio parametrų, tokių kaip tikslios rezistoriaus vertės, šio konkretaus jutiklio atsparumas, tranzistoriaus VA kreivė ir tt - taigi geriausias būdas yra išbandyti įvairias vertes ir naudoti tą, kuris geriausiai tinka). Tada mes nuolat vykdome 60 sekundžių kaitinimo ir 90 sekundžių matavimo ciklą. Įgyvendinant tai tampa šiek tiek sudėtinga. Turime naudoti aparatūros laikmačius, nes viskam, ką čia turime, reikia aukšto dažnio stabilaus PWM, kad jis tinkamai veiktų. Kodas pridėtas čia ir jį galima atsisiųsti iš mūsų „github“, taip pat schemų šaltinio „Fritzing“. Programoje yra 3 funkcijos, valdančios laikmačius: setTimer0PWM, setTimer1PWM, setTimer2PWM. Kiekvienas iš jų nustato laikmatį PWM režimu su nurodytais parametrais (komentuojamas kode) ir nustato impulsų plotį pagal įvesties vertes. Matavimo fazės perjungiamos naudojant funkcijas startMeasurementPhase ir startHeatingPhase, jos tvarkyk viską viduje. ir nustatykite tinkamas laikmačio reikšmes perjungimui tarp 5V ir 1,4V šildymo. Šviesos diodų būseną nustato funkcijų rinkinysLED, kuris priima žalia ir raudona ryškumą (linijinė 1-100 skalė) ir paverčia jį atitinkamu laikmačio nustatymu.

Garso signalo būsena valdoma naudojant funkcijas buzz_on, buzz_off, buzz_beep. Įjungimo/išjungimo funkcijos įjungia ir išjungia garsą, pyptelėjimo funkcija sukuria tam tikrą 1,5 sekundės trukmės pyptelėjimo seką, jei ji periodiškai iškviečiama (ši funkcija iškart grįžta, kad nesustabdytų pagrindinės programos, bet jūs turite ją skambinti vėl ir vėl pypsėjimo modeliui sukurti).

Programa pirmiausia paleidžia funkciją pwm_adjust, kuri nustato tinkamą PWM ciklo plotį, kad matavimo metu būtų pasiekta 1,4 V. Tada jis keletą kartų pyptelėja, rodydamas, kad jutiklis yra paruoštas, persijungia į matavimo fazę ir pradeda pagrindinę kilpą.

Pagrindinėje grandinėje programa patikrina, ar dabartinėje fazėje praleidome pakankamai laiko (90 sekundžių matavimo fazei, 60 sekundžių šildymo fazei), o jei taip, tada pakeičia dabartinę fazę. Be to, jis nuolat atnaujina jutiklių rodmenis, naudodami eksponentinį išlyginimą: new_value = 0.999*old_value + 0.001*new_reading. Esant tokiems parametrams ir matavimo ciklui, jis vidutiniškai per paskutines 300 milisekundžių perduoda signalą. ĮSPĖJIMAS: JUTIKLIS REIKIA VADOVINIO KALIBRAVIMO bet kokiam praktiniam naudojimui. NESKALIBRUOTI, PRIKLAUSOMA Į JŪSŲ YPATINGO JUTIKLIO PARAMETRUS, ŠIS EŠKYTAS GALI ĮJUNGTI ALARMĄ ŠVALIAME OROJE ARBA NETIKTI LETALIO ANGLIES MONOKSIDO KONCENTRACIJOS.

6 veiksmas: pirmasis paleidimas: ko tikėtis

Pirmasis bėgimas: ko tikėtis
Pirmasis bėgimas: ko tikėtis

Jei viską tinkamai surinkote, paleidę eskizą, serijiniame monitoriuje pamatysite kažką panašaus:

koreguojant PWM w = 0, V = 4,93

PWM reguliavimas w = 17, V = 3,57 PWM rezultatas: plotis 17, įtampa 3,57

ir tada skaičių serija, atspindinti dabartinius jutiklių rodmenis. Ši dalis reguliuoja PWM plotį, kad jutiklio šildytuvo įtampa būtų kuo arčiau 1,4 V, išmatuota įtampa atimama iš 5 V, todėl mūsų ideali išmatuota vertė yra 3,6 V. Jei šis procesas niekada nesibaigia arba nesibaigia po vieno žingsnio (todėl plotis lygus 0 arba 254) - kažkas negerai. Patikrinkite, ar jūsų tranzistorius tikrai yra NPN ir ar tinkamai prijungtas (įsitikinkite, kad teisingai naudojote pagrindą, kolektorių, emiterio kaiščius - bazė eina į D3, kolektorius - į MQ -7, o emiteris - į žemę, nesitikėkite „Fritzing“lentos vaizdu - tai yra klaidinga kai kuriems tranzistoriams) ir įsitikinkite, kad prijungėte jutiklio įvestį prie „Arduino“A1 įvesties. Jei viskas gerai, „Arduino IDE“serijos braižytuve turėtumėte pamatyti kažką panašaus į vaizdą. Šildymo ir matavimo ciklai, kurių trukmė 60 ir 90 sekundžių, vyksta vienas po kito, o kiekvieno ciklo pabaigoje išmatuotas ir atnaujinamas CO ppm. Kai matavimo ciklas beveik baigtas, galite paimti atvirą liepsną šalia jutiklio ir pamatyti, kaip tai paveiks rodmenis (priklausomai nuo liepsnos tipo, ji gali sukelti iki 2000 ppm CO koncentraciją atvirame ore - taigi, nors tik nedidelė dalis jis iš tikrųjų patenka į jutiklį, jis vis tiek įjungs aliarmą ir neišsijungs iki kito ciklo pabaigos). Parodžiau tai paveikslėlyje, taip pat reakciją į žiebtuvėlio ugnį.

7 žingsnis: jutiklio kalibravimas

Jutiklio kalibravimas
Jutiklio kalibravimas
Jutiklio kalibravimas
Jutiklio kalibravimas

Remiantis gamintojo duomenų lapu, jutiklis turi veikti šildymo ir vėsinimo ciklus 48 valandas iš eilės, kol jį galima kalibruoti. Ir jūs turėtumėte tai padaryti, jei ketinate jį naudoti ilgą laiką: mano atveju jutiklio rodmenys gryname ore per 10 valandų pasikeitė apie 30%. Jei į tai neatsižvelgsite, galite gauti 0 ppm rezultatą, kai iš tikrųjų yra 100 ppm CO. Jei nenorite laukti 48 valandų, matavimo ciklo pabaigoje galite stebėti jutiklio išėjimą. Kai per valandą jis nepasikeis daugiau nei 1-2 taškais - ten galite nustoti šildyti.

Grubus kalibravimas:

Paleidę eskizą mažiausiai 10 valandų gryname ore, matavimo ciklo pabaigoje, likus 2–3 sekundėms iki kaitinimo fazės, išmatuokite neapdorotą jutiklio vertę ir įrašykite ją į kintamąjį sensor_reading_clean_air (100 eilutė). Viskas. Programa įvertins kitus jutiklių parametrus, jie nebus tikslūs, tačiau jų turėtų pakakti, kad būtų galima atskirti 10–100 ppm koncentraciją.

Tikslus kalibravimas:

Aš labai rekomenduoju surasti kalibruotą CO matuoklį, paimti 100 ppm CO mėginį (tai galima padaryti į švirkštą paėmus šiek tiek išmetamųjų dujų - CO koncentracija gali lengvai siekti kelis tūkstančius ppm) ir lėtai supilti jį į uždarą indą su kalibruotas matuoklis ir MQ-7 jutiklis), išmatuokite neapdorotą jutiklį esant tokiai koncentracijai ir įdėkite jį į kintamąjį sensor_reading_100_ppm_CO. Neatlikus šio veiksmo, jūsų ppm matavimas gali būti klaidingas kelis kartus bet kuria kryptimi (vis tiek gerai, jei jums reikia aliarmo dėl pavojingos CO koncentracijos namuose, kur paprastai neturėtų būti jokio CO, bet netinka bet kokiam pramoniniam naudojimui).

Kadangi neturėjau jokio CO skaitiklio, naudojau sudėtingesnį metodą. Pirmiausia paruošiau didelę CO koncentraciją, degindamas izoliuotą tūrį (pirmoji nuotrauka). Šiame darbe radau naudingiausius duomenis, įskaitant CO išeigą skirtingiems liepsnos tipams - to nėra nuotraukoje, tačiau paskutiniame eksperimente buvo naudojamas propano dujų deginimas su ta pačia sąranka, todėl CO koncentracija buvo ~ 5000 ppm. Tada jis buvo praskiestas 1:50, kad būtų pasiekta 100 ppm, kaip parodyta antroje nuotraukoje, ir buvo naudojamas jutiklio atskaitos taškui nustatyti.

8 veiksmas: kai kurie eksperimentiniai duomenys

Kai kurie eksperimentiniai duomenys
Kai kurie eksperimentiniai duomenys

Mano atveju jutiklis veikė gana gerai - jis nėra labai jautrus tikrai mažoms koncentracijoms, bet pakankamai geras, kad aptiktų viską, kas didesnė nei 50 ppm. Bandžiau palaipsniui didinti koncentraciją, atlikdamas matavimus ir sukūriau diagramų rinkinį. Yra du 0 ppm linijų rinkiniai - gryna žalia prieš CO poveikį ir geltona žalia po to. Atrodo, kad po poveikio jutiklis šiek tiek keičia savo atsparumą švariam orui, tačiau šis poveikis yra nedidelis. Atrodo, kad jis negali aiškiai atskirti 8 ir 15, 15 ir 26, 26 ir 45 ppm koncentracijų, tačiau tendencija yra labai aiški, todėl ji gali pasakyti, ar koncentracija yra 0–20, ar 40–60 ppm. Esant didesnėms koncentracijoms, priklausomybė yra kur kas ryškesnė - veikiant atviros liepsnos išmetimui, kreivė nuo pat pradžių kyla aukštyn, visai nenusileisdama, o jos dinamika yra visiškai kitokia. Taigi esant didelėms koncentracijoms nėra abejonių, kad jis veikia patikimai, nors negaliu patvirtinti jo tikslumo, nes neturiu jokio vardinio CO matuoklio. Be to, šis eksperimentų rinkinys buvo atliktas naudojant 20k apkrovos rezistorių - ir po to nusprendžiau kad rekomenduotumėte 10 k kaip numatytąją vertę, ji turėtų būti jautresnė. Štai tiek. Jei turite patikimą CO matuoklį ir būsite surinkęs šią plokštę, pasidalykite atsiliepimais apie jutiklio tikslumą - būtų puiku surinkti įvairių jutiklių statistiką ir patobulinti numatytas eskizo prielaidas.

Rekomenduojamas: