Cuprins:

Monitor Arduino CO folosind senzorul MQ-7: 8 pași (cu imagini)
Monitor Arduino CO folosind senzorul MQ-7: 8 pași (cu imagini)

Video: Monitor Arduino CO folosind senzorul MQ-7: 8 pași (cu imagini)

Video: Monitor Arduino CO folosind senzorul MQ-7: 8 pași (cu imagini)
Video: how to make CO Detector with mq-7 and Arduino (mq-7 sensor Arduino) 2024, Noiembrie
Anonim
Monitor Arduino CO folosind senzorul MQ-7
Monitor Arduino CO folosind senzorul MQ-7
Monitor Arduino CO folosind senzorul MQ-7
Monitor Arduino CO folosind senzorul MQ-7

Câteva cuvinte de ce a fost creat acest instructabil: într-o zi, mama iubitei mele ne-a sunat la mijlocul nopții, pentru că se simțea foarte rău - avea amețeli, tahicardie, greață, tensiune arterială crescută, chiar a leșinat pentru timp necunoscut (probabil ~ 5 minute, dar nu există nicio modalitate de a spune), toate fără niciun motiv aparent. Locuiește într-un sat mic, departe de spitale (la 60 km de locul nostru, la 30 km de cel mai apropiat spital, la 10 km fără drum normal între ele), așa că ne-am repezit la ea și am ajuns acolo la scurt timp după ambulanță. A fost internată în spital și dimineața s-a simțit aproape bine, dar medicii nu au putut găsi cauza. A doua zi am avut o idee: ar fi putut fi otrăvire cu CO, deoarece ea avea un cazan cu apă pe gaz (pe fotografie) și a stat aproape de el toată seara când s-a întâmplat. Am cumpărat recent senzorul MQ-7 CO dar nu am avut niciodată timp să-i montez o schemă, așa că acesta a fost momentul perfect pentru a face acest lucru. După o oră de căutare pe internet a oricăror instrucțiuni, mi-am dat seama că nu găsesc niciun ghid care să urmeze în același timp instrucțiunile producătorului senzorului furnizate în foaia sa tehnică și să explice orice (un exemplu părea să aibă un cod destul de bun, dar nu era clar cum să-l aplicăm, altele erau simplificate în exces și nu ar funcționa bine). Așa că am petrecut aproximativ 12 ore pentru dezvoltarea schemelor, realizarea și tipărirea carcasei 3D, testarea și calibrarea senzorului, iar a doua zi am mers la cazanul suspect. S-a dovedit că nivelurile de CO acolo erau extrem de ridicate și ar putea fi fatale dacă timpul de expunere la CO ar fi mai mare. Deci, cred că oricine are o situație similară (cum ar fi cazanul pe gaz sau altă combustie care se întâmplă într-un spațiu de locuit) ar trebui să aibă un astfel de senzor pentru a preveni să se întâmple ceva rău.

Toate acestea s-au întâmplat acum două săptămâni, de atunci am îmbunătățit schemele și programul destul de mult, iar acum pare a fi rezonabil de bun și relativ simplu (nu 3 linii de cod simple, dar totuși). Deși sper că cineva cu un contor de CO precis îmi va oferi un feedback despre calibrarea implicită pe care l-am pus în schiță - bănuiesc că este departe de a fi bun. Iată un ghid complet cu câteva date experimentale.

Pasul 1: Lista materialelor

Proiect de lege de materiale
Proiect de lege de materiale

Veți avea nevoie de: 0. Placa Arduino. Prefer clona chineză Arduino Nano pentru prețul său remarcabil de 3 USD, dar orice arduino de 8 biți va funcționa aici. Sketch folosește câteva funcții avansate de temporizare și a fost testat doar pe microcontrolerul ATMEGA328 - deși probabil va funcționa bine și pe altele. Senzor MQ-7 CO. Cel mai frecvent disponibil cu acest modul senzor Flying Fish, acesta trebuie să treacă printr-o mică modificare, detalii în pasul următor sau puteți utiliza un senzor MQ-7 separat.

2. Tranzistor bipolar NPN. Practic orice tranzistor NPN care poate gestiona 300 mA sau mai mult va funcționa aici. Tranzistorul PNP nu va funcționa cu un modul Flying Fish menționat (deoarece are un pin de încălzire lipit la ieșirea senzorului), dar poate fi utilizat cu un senzor discret MQ-7.

3. Rezistoare: 2 x 1k (de la 0,5k la 1,2k vor funcționa bine) și 1 x 10k (cel mai bine este păstrat precis - deși dacă trebuie absolut să utilizați o valoare diferită, reglați variabila reference_resistor_kOhm în schiță în consecință).

4. Condensatoare: 2 x 10 uF sau mai mult. Sunt necesare tantal sau ceramică, electroliticul nu va funcționa bine din cauza ESR ridicat (nu vor putea furniza suficient curent pentru a netezi ondularea cu curent mare). LED-uri verzi și roșii pentru a indica nivelul curent de CO (puteți utiliza, de asemenea, un singur LED dual-color cu 3 terminale, așa cum am folosit în prototipul nostru de cutie galbenă).6. Buzzer piezoelectric pentru a indica un nivel ridicat de CO. Pânză și fire (puteți, de asemenea, să lipiți totul cu pini Nano sau să le strângeți în prizele Uno, dar este ușor să faceți o greșeală în acest fel).

Pasul 2: Modificarea modulului sau cablarea senzorului discret

Modificarea modulului sau cablarea senzorului discret
Modificarea modulului sau cablarea senzorului discret

Pentru modul, trebuie să desudați rezistorul și condensatorul, așa cum se arată pe fotografie. Puteți desolda practic orice dacă doriți - electronica modulului este total inutilă, o folosim doar ca suport pentru senzorul în sine, dar aceste două componente vă vor împiedica să obțineți citiri corecte, Dacă utilizați senzor discret, atașați știfturile de încălzire (H1 și H2) la 5V și colectorul tranzistorului corespunzător. Atașați o parte de detectare (oricare dintre pinii A) la 5V, o altă parte de detectare (oricare dintre pinii B) la rezistorul de 10 k, la fel ca pinul analogic al modulului din schemă.

Pasul 3: Principiul de funcționare

Principiul de funcționare
Principiul de funcționare
Principiul de funcționare
Principiul de funcționare

De ce avem nevoie de toate aceste complicații, de ce să nu atașăm 5V, la sol și doar să obținem citiri? Ei bine, din păcate nu veți obține nimic util în acest fel. Conform fișei tehnice MQ-7, senzorul trebuie să treacă prin și cicluri de încălzire reduse pentru a obține măsurători adecvate. În timpul fazei de temperatură scăzută, CO este absorbit pe placă, producând date semnificative. În timpul fazei de temperatură ridicată, CO absorbit și alți compuși se evaporă de pe placa senzorului, curățându-l pentru următoarea măsurare.

Deci, în general, funcționarea este simplă:

1. Aplicați 5V timp de 60 de secunde, nu utilizați aceste citiri pentru măsurarea CO.

2. Aplicați 1.4V timp de 90 de secunde, utilizați aceste citiri pentru măsurarea CO.

3. Continuați cu pasul 1.

Iată însă problema: Arduino nu poate furniza suficientă putere pentru a rula acest senzor de la pinii săi - încălzitorul senzorului necesită 150 mA, în timp ce pinul Arduino poate oferi nu mai mult de 40 mA, deci dacă este atașat direct, pinul Arduino va arde și senzorul va câștiga nu merge. Deci, trebuie să folosim un fel de amplificator de curent care să ia curent de intrare mic pentru a controla curentul de ieșire mare. O altă problemă este obținerea de 1.4V. Singura modalitate de a obține în mod fiabil această valoare fără a introduce o mulțime de componente analogice este utilizarea abordării PWM (Pulse Width Modulation) cu feedback care va controla tensiunea de ieșire.

Tranzistorul NPN rezolvă ambele probleme: când este pornit constant, tensiunea pe senzor este de 5V și se încălzește pentru faza de temperatură ridicată. Când aplicăm PWM la intrarea sa, curentul pulsează, apoi este netezit de condensator și tensiunea medie este menținută constantă. Dacă folosim PWM de înaltă frecvență (în schiță are o frecvență de 62,5 KHz) și mediați o mulțime de citiri analogice (în schiță mediam peste ~ 1000 de citiri), atunci rezultatul este destul de fiabil.

Este esențial să adăugați condensatori conform schemelor. Imaginile de aici ilustrează diferența de semnal cu și fără condensator C2: fără acesta, ondulația PWM este clar vizibilă și distorsionează semnificativ citirile.

Pasul 4: Scheme și Breadboard

Scheme și Breadboard
Scheme și Breadboard
Scheme și Breadboard
Scheme și Breadboard
Scheme și Breadboard
Scheme și Breadboard

Iată ansamblul schemei și al panoului.

AVERTIZARE! Este necesară modificarea unui modul standard breakout! Fără modificare modulul este inutil. Modificarea este descrisă în al doilea pas

Este important să utilizați pinii D9 și D10 pentru LED-uri, deoarece acolo avem ieșiri de hardware Timer1, va permite să le schimbați culorile fără probleme. Pinii D5 și D6 sunt utilizați pentru buzzer, deoarece D5 și D6 sunt ieșiri ale temporizatorului hardware0. Le vom configura pentru a fi inverse una la alta, astfel încât acestea să comute între stările (5V, 0V) și (0V, 5V), producând astfel sunet pe buzzer. Atenție: acest lucru afectează întreruperea principală a temporizării Arduino, astfel încât toate funcțiile dependente de timp (cum ar fi millis ()) nu vor produce rezultate corecte în această schiță (mai multe despre aceasta mai târziu). D11 - dar este mai puțin convenabil să puneți fir pe D11 decât pe D3) - așa că îl folosim pentru a furniza PWM pentru tranzistorul de control al tensiunii. Rezistorul R1 este utilizat pentru a controla luminozitatea LED-urilor. Poate fi de la 300 la 3000 Ohm, 1k este destul de optim în luminozitate / consum de energie. Rezistorul R2 este utilizat pentru a limita curentul de bază al tranzistorului. Nu ar trebui să fie mai mic de 300 Ohmi (pentru a nu suprasolicita pinul Arduino) și nici mai mare de 1500 Ohmi. 1k există o alegere sigură.

Rezistorul R3 este utilizat în serie cu placa senzorului pentru a crea un divizor de tensiune. Tensiunea la ieșirea senzorului este egală cu R3 / (R3 + Rs) * 5V, unde Rs este rezistența curentă a senzorului. Rezistența senzorului depinde de concentrația de CO, deci tensiunea se modifică corespunzător. condensatorul este preferat aici, unul electrolitic nu va funcționa bine.

Condensatorul C2 este utilizat pentru a netezi ieșirea analogică a senzorului (tensiunea de ieșire depinde de tensiunea de intrare - și avem un PWM de curent destul de mare, care afectează toate schemele, deci avem nevoie de C2). Cea mai simplă soluție este de a utiliza același condensator ca tranzistorul C1. NPN fie conduce curentul tot timpul pentru a furniza curent mare la încălzitorul senzorului, fie funcționează în modul PWM, reducând astfel curentul de încălzire.

Pasul 5: Program Arduino

Program Arduino
Program Arduino

AVERTISMENT: SENZORUL NECESITĂ CALIBRARE MANUALĂ PENTRU ORICE UTILIZARE PRACTICĂ. FĂRĂ CALIBRARE, ÎN FUNCȚIE DE PARAMETRII SENZORULUI DUMNEAVOASTRĂ, ACEASTA SCHIȚĂ POATE ACTIVA ALARMA ÎN AERUL CURAT SAU NU DETECTA CONCENTRAREA MONOXIDULUI DE CARBON LETAL

Calibrarea este descrisă în pașii următori. Calibrarea dură este foarte simplă, precisă este destul de complexă.

La nivel general, programul este destul de simplu:

Mai întâi ne calibrăm PWM-ul pentru a produce 1.4V stabili necesari senzorului (lățimea adecvată a PWM depinde de o mulțime de parametri, cum ar fi valorile exacte ale rezistorului, rezistența acestui senzor special, curba VA a tranzistorului etc etc - deci cel mai bun mod este să încercați diferite valori și folosim unul care se potrivește cel mai bine). Apoi, continuăm ciclul de 60 de secunde de încălzire și 90 de secunde de măsurare. În implementare devine oarecum complicat. Trebuie să folosim temporizatoare hardware, deoarece tot ce avem aici are nevoie de PWM stabil de înaltă frecvență pentru a funcționa corect. Codul este atașat aici și poate fi descărcat de pe github-ul nostru, precum și sursa schematică din Fritzing. În program există 3 funcții care gestionează temporizatoarele: setTimer0PWM, setTimer1PWM, setTimer2PWM. Fiecare dintre ele setează temporizatorul în modul PWM cu parametrii dați (comentat în cod) și setează lățimea impulsului în funcție de valorile de intrare. Fazele de măsurare sunt comutate folosind funcțiile startMeasurementPhase și startHeatingPhase, ele descurcați totul înăuntru. și setați valorile adecvate ale temporizatorului pentru comutarea între încălzirea de 5V și 1.4V. Starea LED-urilor este setată de funcția setLED-uri care acceptă luminozitatea verde și roșie la intrarea sa (în scară liniară 1-100) și o convertește în setarea corespunzătoare a temporizatorului.

Starea sonorului este controlată utilizând funcțiile buzz_on, buzz_off, buzz_beep. Funcțiile de pornire / dezactivare activează și dezactivează sunetul, funcția de semnal sonor produce o secvență de semnal sonor specifică cu o perioadă de 1,5 secunde dacă este apelată periodic (această funcție revine imediat, astfel încât să nu întrerupă programul principal - dar trebuie să îl apelați din nou și din nou a produce tipar de bip).

Programul execută mai întâi funcția pwm_adjust care află lățimea corectă a ciclului PWM pentru a atinge 1,4V în timpul fazei de măsurare. Apoi, emite un semnal sonor de câteva ori pentru a indica faptul că senzorul este gata, trece în faza de măsurare și pornește bucla principală.

În bucla principală, programul verifică dacă am petrecut suficient timp în faza curentă (90 de secunde pentru faza de măsurare, 60 de secunde pentru faza de încălzire) și dacă da, atunci schimbă faza curentă. De asemenea, actualizează constant citirile senzorilor utilizând netezirea exponențială: new_value = 0.999 * old_value + 0.001 * new_reading. Cu astfel de parametri și ciclu de măsurare, acesta face o medie a semnalului pe aproximativ ultimele 300 de milisecunde. AVERTISMENT: SENZORUL NECESITĂ CALIBRARE MANUALĂ PENTRU ORICE UTILIZARE PRACTICĂ. FĂRĂ CALIBRARE, ÎN FUNCȚIE DE PARAMETRII SENZORULUI DUMNEAVOASTRĂ, ACEASTA SCHIȚĂ POATE ACTIVA ALARMA ÎN AERUL CURAT SAU NU DETECTA CONCENTRAREA MONOXIDULUI DE CARBON LETAL.

Pasul 6: Prima alergare: la ce să ne așteptăm

Prima alergare: la ce să ne așteptăm
Prima alergare: la ce să ne așteptăm

Dacă ați asamblat totul în mod corespunzător, după ce ați rulat schița, veți vedea așa ceva în monitorul serial:

ajustarea PWM w = 0, V = 4,93

ajustarea PWM w = 17, V = 3,57 Rezultatul PWM: lățimea 17, tensiunea 3,57

și apoi o serie de numere reprezentând citirile curente ale senzorului. Această parte este reglarea lățimii PWM pentru a produce tensiunea încălzitorului senzorului cât mai aproape de 1.4V posibil, tensiunea măsurată este dedusă din 5V, deci valoarea noastră măsurată ideală este 3.6V. Dacă acest proces nu se încheie niciodată sau nu se termină după un singur pas (rezultând o lățime egală cu 0 sau 254) - atunci ceva nu este în regulă. Verificați dacă tranzistorul dvs. este într-adevăr NPN și este conectat corect (asigurați-vă că ați folosit baza, colectorul, pinii emițătorului dreapta - baza merge la D3, colectorul la MQ-7 și emițătorul la masă, nu contați pe vizualizarea Fritzing - este greșit pentru unele tranzistoare) și asigurați-vă că ați conectat intrarea senzorului la intrarea A1 a Arduino. Dacă totul este în regulă, ar trebui să vedeți în Serial Plotter din Arduino IDE ceva similar cu imaginea. Ciclurile de încălzire și măsurare de 60 și 90 de secunde se desfășoară una după alta, cu CO ppm măsurate și actualizate la sfârșitul fiecărui ciclu. Puteți lua o flacără deschisă aproape de senzor când ciclul de măsurare este aproape terminat și puteți vedea cum va afecta citirile (în funcție de tipul de flacără, poate produce concentrație de CO până la 2000 ppm în aer liber - deci, chiar dacă doar o mică parte din intră de fapt în senzor, tot va porni alarma și nu se va declanșa până la sfârșitul ciclului următor). L-am arătat pe imagine, precum și răspunsul la foc de la brichetă.

Pasul 7: Calibrarea senzorului

Calibrarea senzorului
Calibrarea senzorului
Calibrarea senzorului
Calibrarea senzorului

Conform fișei tehnice a producătorului, senzorul ar trebui să ruleze cicluri de încălzire-răcire timp de 48 de ore la rând înainte de a putea fi calibrat. Și ar trebui să o faceți dacă intenționați să-l utilizați pentru o lungă perioadă de timp: în cazul meu, citirea senzorului în aer curat s-a schimbat cu aproximativ 30% în decurs de 10 ore. Dacă nu veți lua în considerare acest lucru, puteți obține un rezultat de 0 ppm acolo unde există de fapt 100 ppm de CO. Dacă nu doriți să așteptați 48 de ore, puteți monitoriza ieșirea senzorului la sfârșitul ciclului de măsurare. Când peste o oră nu se va schimba mai mult de 1-2 puncte - puteți opri încălzirea acolo.

Calibrare dură:

După ce ați executat schița timp de cel puțin 10 ore în aer curat, luați valoarea brută a senzorului la sfârșitul ciclului de măsurare, cu 2-3 secunde înainte de începerea fazei de încălzire și scrieți-o în variabila sensor_reading_clean_air (linia 100). Asta e. Programul va estima alți parametri ai senzorului, nu vor fi exacți, dar ar trebui să fie suficienți pentru a face distincția între concentrația de 10 și 100 ppm.

Calibrare precisă:

Recomand cu tărie să găsiți un contor de CO calibrat, să faceți o probă de CO 100 ppm (acest lucru se poate face luând niște gaze arse în seringă - concentrația de CO poate fi ușor în intervalul de câteva mii de ppm - și punându-l încet în borcanul închis cu contor calibrat și senzor MQ-7), luați citirea senzorului brut la această concentrație și puneți-o în variabila sensor_reading_100_ppm_CO. Fără acest pas, măsurarea ppm poate fi greșită de mai multe ori în ambele direcții (totuși ok dacă aveți nevoie de alarmă pentru o concentrație periculoasă de CO acasă, unde în mod normal nu ar trebui să existe deloc CO, dar nu este bună pentru nicio aplicație industrială).

Deoarece nu aveam niciun contor de CO, am folosit o abordare mai sofisticată. Mai întâi am pregătit o concentrație mare de CO folosind combustia în volum izolat (prima fotografie). În această lucrare am găsit cele mai utile date, inclusiv randamentul de CO pentru diferite tipuri de flacără - nu este în fotografie, dar experimentul final a folosit arderea gazului propan, cu aceeași configurație, rezultând o concentrație de CO ~ 5000 ppm. Apoi a fost diluat 1:50 pentru a atinge 100 ppm, așa cum este ilustrat în a doua fotografie, și a fost utilizat pentru a determina punctul de referință al senzorului.

Pasul 8: Unele date experimentale

Unele date experimentale
Unele date experimentale

În cazul meu, senzorul a funcționat destul de bine - nu este foarte sensibil pentru concentrații foarte mici, dar suficient de bun pentru a detecta ceva mai mare de 50ppm. Am încercat să măresc concentrația treptat, luând măsurători și am construit un set de diagrame. Există două seturi de linii 0ppm - verde pur înainte de expunerea la CO și verde galben după. Senzorul pare să-și schimbe ușor rezistența la aer curat după expunere, dar acest efect este mic. Se pare că nu poate distinge în mod clar concentrațiile de 8 și 15, 15 și 26, 26 și 45 ppm - dar tendința este foarte clară, deci poate spune dacă concentrația este în intervalul 0-20 sau 40-60 ppm. Pentru concentrații mai mari, dependența este mult mai distinctivă - atunci când este expusă la evacuarea unei flăcări deschise, curba crește de la început fără a coborî deloc, iar dinamica sa este total diferită. Deci, pentru concentrații mari, nu există nicio îndoială că funcționează fiabil, deși nu pot confirma precizia acestuia, deoarece nu am niciun contor de CO nominal. pentru a recomanda 10k ca valoare implicită, ar trebui să fie mai sensibil în acest fel. Dacă aveți un contor de CO de încredere și ați asamblat această placă, vă rugăm să împărtășiți câteva feedback-uri despre precizia senzorului - ar fi minunat să colectați statistici pentru diferiți senzori și să îmbunătățiți ipotezele de schiță implicite.

Recomandat: