Am venit cu aceasta idee intrucat recent am schimbat senzorul de gaze pe care il am in bucatarie, care inchide gazele atunci cand simte in aer o concentratie mai mare a unor gaze inflamabile sau fum, incercand astfel sa previna un incendiu. Problema sa, insa, este ca, de multe ori, da alarme false (exemplu: se spala masa din bucatarie cu solutii ce contin alcool, cineva se da cu deodorant in preajma sa). Aceasta a fost ideea initiala, adica un detector de incendiu, insa am deviat de la aceasta idee, transformand proiectul intr-un detector de fun de tigara.
Actualul proiect realizeaza o alarma ce indica prezenta fumului de tigara in incaperea in care este plasata. Alarma are mai multe praguri de senzitivitate si monitorizeaza evolutia recenta a datelor obtinute de catre senzori, care sunt afisate sub forma de grafic pe calculator, in cadrul unei aplicatii scrise in Python. In plus, concentratiile curente ale gazelor monitorizate (CO, CO2, toluen, fum/microparicule) este afisata pe doua ecrane LCD.
Proiectul curent verifica prezenta fumului de tigara folosindu-se de semnalul analog intors de senzorii MQ-2 si MQ-135. Pe baza formulelor detaliate in capitolele urmatoare, se calculeaza concentratia gazelor periculoase (CO, CO2, toluen), tinand cont si de faptul ca senzorii au o caracteristica neliniata dependentea de temperatura si umiditatea curenta, ce sunt aflate cu ajutorul senzorului DHT11.
In plus, se masoara si cantitatea fumului in aer folosindu-se senzorul fotoelectric Sharp GP2Y1014AU.
Astfel, alarma urmareste evolutia concentratiilor de CO, CO2, toluen si a cantitatii fumului in aer.
In continuare sunt setate cateva praguri acceptabile pentru cantitatea fiecarui gaz periculos, aflate prin testarea comportamentului alarmei in aer curat.
Odata ce cantitatile curente calculate pe baza informatiilor provenite de la senzorii anterior mentionati depasesc aceste praguri, alarma porneste, indicand pericolul prin semnal sonor - buzzer, cat si vizual - led rosu. In plus, la orice moment de timp concentratiile gazelor urmarite sunt afisate pe cele doua LCD-uri, iar datele de la senzori sunt reprezentate grafic pe calculator.
Totusi, pentru a oferi flexibilitate, alarma poate fi ajustata asfel incat sa fie mai sensibila sau mai toleranta la pericol, prin apasarea butonului ce ii seteaza senzitivitatea la unul din cele 3 praguri existente: SMALL, NORMAL, BIG. La SMALL, daca oricare din concentratiile gazelor periculoase sare peste prag, alarma porneste. La NORMAL, macar doua trebuie sa depaseasca pragul. Iar la BIG, daca cel putin trei au sarit peste prag, se da alarma. Aceasta senzitivitate se seteaza prin apasarea unui buton, numit SENZITIV.
Un al doilea buton, ON-OFF, permite unui administator sa inchida alarma prin apasarea sa. Astfel, gazele sunt in continuare monitorizate, insa nu se va mai semnaliza depasirea pragurilor. Alarma poate fi repornita printr-o alta apasare a aceluiasi buton.
Daca poza nu se vede clar: Right Click → Open Image in New Tab
Senzorii din gama MQ sunt senzori de tip Metal Oxide Semiconductor (MOS), care folosesc bioxidul de staniu (SnO2) ca material semiconductor oxid metalic. Principiul de functionare al unui senzor MQ se bazeaza pe proprietatea materialelor semiconductoare oxizi metalici de crestere a conductibilitatii, si implicit de scadere a rezistentei electrice, atunci cand creste concentratia unui gaz tinta, care intra in contact cu suprafata sa. Senzorul contine in interior o rezistenta de incalzire deoarece fenomenul se produce la temperaturi de 200oC – 400oC.
Pentru masurarea rezistentei semiconductorului in prezenta unui gaz se foloseste divizorul de tensiune din figura. Tensiunea de iesire Vout este dependenta de rezistenta semiconductorului Rs, deci de concentratia gazului:
\begin{align} R_S = R_L\frac{Vcc-Vout}{Vout} \end{align}
\begin{align} Vout = Vcc\frac{R_L}{R_L + R_S} = R_L\frac{Vcc}{Vout}-1 \end{align} unde: unde: RL_MQ2=4,7KΩ , RL_MQ135=20KΩ si Vcc=5V
Pentru citirea tensiunii de iesire Vout a senzorului se foloseste convertorul CAD pe 10 biti, incorporat in placa Arduino, care poate detecta 1024 (210) nivele ale tensiunii analogice, intre 0-5V. Deci, se va realiza o aproximare deoarece vor exista doar 1024 valori distincte intre 0 si 5V (pas de 4,89mV):
\begin{align} VoutCAD = \frac{k_{out}∙5V}{1023} = k_{out}∙4,89mV \end{align} unde unde kout=0÷1023
Caracteristica de sensibilitate a sensorului In Specificatiile Tehnice ale senzorilor MQ-2 si MQ-135 sunt date Caracteristicile de sensibilitate ale sensorilor, indicand depenenta concentratiei gazelor tinta de rezistenta senzorului. Senzorii din gama MQ au o selectivitate scazuta, reactionand la mai multe gaze. Daca simultan sunt prezente mai multe gaze, masuratorile sunt afectate, senzorul neputand sa identifice gazul cu cea mai mare concentratie
Asa cum se precizeaza, graficele au fost obtinute la temperatura T=20oC si umiditate H=65% , 21% concentratie de O2. Graficele au o scala logaritmica: pe axa X este valoarea concentratiei gazului analizat (notata C) exprimata in ppm, iar pe axa Y raportul RS/R0 , unde rezistentele senzorului RS si R0 sunt:
Rs ≝ Rs20_65_nedeterminat in mediu cu Cgaze nedeterminat, la T=20oC si H=65%; R0_MQ2 ≝ Rs20_65_1000ppm_H2 in mediu H2 cu CH2=1000ppm, la T=20oC si H=65%;
R0_MQ135 ≝ Rs20_65_100ppm_NH4 in mediu NH4 cu C=100ppm, la T=20oC si H=65%;
Aceste grafice nu ofera o functie de forma: C[ppm]=f(Vout) , care sa permita determinarea concentratiei gazului analizat (in ppm) stiind valoarea tensiunii de iesire Vout a senzorului. Determinarea functiei C[ppm]=f(Vout) necesita calcule suplimentare.
Ecuatiile concentratiilor gazelor
Pe Internet sunt cateva abordari pentru determinarea acestor functii, iar rezultatele cel mai des folosite sunt cele din biblioteca Arduino IDE pentru senzorii MQ: https://github.com/miguel5612/MQSensorsLib. In algoritmul utilizat de mine pentru stabilirea acestor functii, suplimentar voi tine cont si de dependenta de temperatura si umiditate a senzorilor MQ.
1. Aproximam graficul caracteristicii de sensibilitate al fiecarui gaz din Caracteristica de sensibilitate a senzorului ca fiind liniar, de forma:
Y=m∙X+p unde m=panta dreptei
p=intersectia graficului actual cu axa OY, deci unde X=0
Deoarece graficele sunt de tip log-log (ambele axe au o scala logaritmica), ecuatia este de forma:
log(y)=m∙log(x)+p
2. Aproximam fiecare grafic cu o dreapta. Consideram 2 puncte (x1,y1) si (x2,y2) de pe fiecare grafic, pentru a calcula ecuatia dreptei (determinam panta - m si intersectia cu axa OY - p):
log(y1)=m∙log(x1)+p
log(y2)=m∙log(x2)+p
\begin{align}m = \frac{log(y_2)-log(y_1)}{log(x_2)-log(x_1)} = \frac{log(\frac{y_2}{y_1})}{\frac{x_2}{x_1}}\end{align}
\begin{align}p = log(y_1)-m∙log(x_1)\end{align}
3. Ecuatiile pentru concentratiile gazelor tinta sunt:
\begin{align} log(C) = \frac{log(\frac{R_S}{R_0})-p)}{m} = \frac{log(10^{-p}\frac{R_S}{R_0})}{m}\end{align}
Rezulta formula concentratiei gazului:
\begin{align}C_{[ppm]} = 10^{-\frac{p}{m}}(\frac{R_s}{R_0})^{\frac{1}{m}} = a(\frac{R_{s_{20.65.nedeterminat}}}{R_{0_{MQ}}})^b\end{align}
unde:
\begin{align}a = 10^{-\frac{p}{m}}\end{align}
\begin{align}b = \frac{1}{m}\end{align}
Valorile m si p pentru senzorul MQ-2 sunt cele din tabelul de mai jos.
Valorile m si p pentru senzorul MQ-135 sunt cele din tabelul de mai jos.
Dependenta de temperatura si umiditate
Ecuatiile pentru C[ppm] in cazul lui MQ-2 si MQ-135 sunt valabile pentru masuratori ale senzorilor efectuate la temperatura T=20oC si umiditate H=65%, in timp ce masuratorile in timp real se realizeaza la temperatura T si umiditatea H. Conform Specificatiilor Tehnice ale senzorilor MQ-2 si MQ-135, raportul Rs/Ro din graficele de mai jos - Caracteristica de temperatura si umiditate depinde de temperatura si umiditate.
Pe axa X este valoarea C = concentratiei gazului analizat exprimata in ppm, iar pe axa Y raportul RS/R0 , (alt R0, nu cel din Caracteristica de sensibilitate) unde:
Rs_MQ2 ≝ RsT_H_1000ppm_H2 in mediu H2 cu C=1000ppm, la T si H diferite;
R0TH_MQ2 ≝ Rs20_33_1000ppm_H2 in mediu H2 cu C=1000ppm, la T=20oC si H=33%;
Rs_MQ135 ≝ RsT_H_1000ppm_H2 in mediu NH4 cu C=1000ppm, la T si H diferite;
R0TH_MQ135 ≝ Rs20_33_1000ppm_H2 in mediu NH4 cu C=1000ppm, la T=20oC si H=33%;
Sunt date doar doua curbe, corespunzatoare umiditatii relative H85% si H33%.
Stabilirea dependentei valorii masurate Rs_T_H_nedeterminat de Rs_20_65_nedeterminat
Rezistenta masurata de senzor la un moment dat, Rs_T_H_nedeterminat, este realizata intr-un mediu cu concentratii de gaze nedeterminate, la o temperatura T si umiditatea H, indicata de senzorul de temperatura si umiditate. Folosind graficele de mai sus - Caracteristica de temperatura si umiditate din Fisa tehnica a senzorului – se stabileste o relatie intre rezistenta senzorului in momentul masuratorii (Rs_T_H_nedeterminat) si rezistenta senzorului in acelasi mediu, la T=20oC si H=65% (Rs_20_65_nedeterminat).
MQ2
Folosind WebPlotDesigner (https://apps.automeris.io/wpd/) pentru cele doua grafice din Caracteristica de temperatura si umiditate din Fisa tehnica a senzorului MQ-2 (umiditate 85% si umiditate 33%), se determina valorile raportului (Rs_T_H_1000ppm_H2)/(Rs_20_33_1000ppm_H2) din 5oC in 5oC (tabelul de mai jos).
Aproximam ca fiind liniara caracteristica intre doua puncte succesive din tabelul de mai sus, pentru a putea interpola. Prin interpolare (facuta in Matlab) tabelul de mai sus este extins pentru valori ale temperaturii din grad in grad (intre 0-500oC), pentru H85% si H33% Folosind extrapolarea, pentru oricare T (intre 0-500oC) si H (intre 0-99%) masurate de senzorul DTH11, se poate calcula valoarea raportului (Rs_T_H_1000ppm_H2)/(Rs_20_33_1000ppm_H2) ≝ Z.
\begin{align}\frac{R_{s_{20.65.1000ppm.H_2}}}{R_{s_{20.33.1000ppm.H_2}}} = \frac{R_{0_MQ2}}{R_{s_{20.33.1000ppm.H_2}}} = 0,9471\end{align}
\begin{align}\frac{R_{s_{T.H.1000ppm.H_2}}}{R_{0_{MQ2}}} = \frac{R_{s_{T.H.1000ppm.H_2}}}{R_{s_{20.65.1000ppm.H_2}}} ∙ \frac{R_{s_{20.33.1000ppm.H_2}}}{R_{0_{MQ2}}}=\frac{z}{0,9471} = f\end{align}
Presupunem ca acest raport se pastreaza si in cazul altor gaze:
\begin{align}\frac{R_{s_{T.H.1000ppm.H_2}}}{R_{0_{MQ2}}} = \frac{R_{s_{T.H.nedeterminat}}}{R_{s_{20.65.nedeterminat}}} = f\end{align}
Formula folosita in cod este (unde valoarea rezistentei Rs_T_H_nedeterminat se determina in urma masuratorii):
\begin{align}R_{s_{20.65.nedeterminat}} = \frac{R_{s_{T.H.nedeterminat}}}{f}\end{align}
unde f=Z/0,9471, iar Z=(Rs_T_H_1000ppm_H2)/(Rs_20_33_1000ppm_H2).
MQ135
Se urmeaza aceasi pasi ca si in cazul senzorului MQ-2.
Valorile raportului (Rs_T_H_100ppm_NH4)/(Rs_20_33_100ppm_NH4) pentru cele doua grafice corespunzatoare H=85% si H=33% (din 5oC in 5oC) sunt:
Folosind extrapolarea se calculeaza:
\begin{align}\frac{R_{s_{20.65.1000ppm.NH_4}}}{R_{s_{20.33.1000ppm.NH_4}}} = 0,9458\end{align}
si pentru oricare T (intre 0-50oC) si H (intre 0-99%) masurate de senzorul DTH11, se poate calcula valoarea raportului (Rs_T_H_100ppm_NH4)/(Rs_20_33_100ppm_NH4) ≝ Z
Prin acelasi trationament ca mai devreme, se obtine:
\begin{align}\frac{R_{s_{T.H.1000ppm.NH_4}}}{R_{0_{MQ135}}} = \frac{R_{s_{T.H.nedeterminat}}}{R_{s_{20.65.nedeterminat}}} = f\end{align}
Iar ceea ce vom folosi in program este:
\begin{align}R_{s_{20.65.nedeterminat}} = \frac{R_{s_{T.H.nedeterminat}}}{f}\end{align}
unde f=z/0,9458, iar z=(Rs_T_H_1000ppm_NH4)/(Rs_20_33_1000ppm_NH4).
Calibrarea senzorului (determinarea valorii rezistentei R_0_MQ)
Pentru a calcula C[ppm] mai este nevoie de rezistentele senzorilor MQ R_0_MQ2, respectiv R_0_MQ135, ce pot fi obtinute prin masuratori facute in aer curat, in absenta altor gaze poluante, la temperatura T si umiditate H: . \begin{align}R_{0_{MQ2}} = R_{s_{20.65.1000ppm.H_2}} = R_{s_{T.H.aercurat}} \frac{0,9471}{9,83∙z}\end{align}
\begin{align}R_{0_{MQ135}} = R_{s_{20.65.1000ppm.NH_4}} = R_{s_{T.H.aercurat}} \frac{0,9458}{3,6∙z}\end{align}
Pentru determinarea R_0_MQ se parcurg pasii:
a) Se considera cunoscuta temperatura T si umiditatea H la momentul masuratorii deoarece se foloseste un senzor DHT11, care ne furnizeaza aceste valori.
b) Se masoara tensiunea Vout de la iesirea senzorului in aer curat si conform (1) si (2) se calculeaza valoarea rezistentei senzorului la temperatura T si umiditatea H, notata Rs_T_H_aercurat:
\begin{align}R_{s_{T.H.aercurat}} =R_L∙\frac{1023}{k_{out}-1}\end{align} unde: RL_MQ2=4,7KΩ si RL_MQ135=20KΩ
c) Se inlocuiesc in ultimele 2 formule valorile calculate pentru Z si Rs_T_H_aercurat si se determina valoarea R_0_MQ2, respectiv R_0_MQ135.
Pentru acesti pasi, am scris un program ce afla aceste 2 valori: R_0_MQ2, respectiv R_0_MQ135.
Rezultatele obtinute sunt: [Vezi sectiunea Rezultate Obtinute]
Determinarea ecuatiilor concentratiilor gazelor sensor MQ-2 Determinarea ecuatiilor concentratiilor gazelor sensor MQ-135
In documentatia tehnica a senzorului Shart GP2Y1010AU0F este dat un grafic al dependentei tensiunii de iesire 𝑉𝑜𝑢𝑡 a senzorului de densitatea de particule mici din componenta fumului (o vom nota cu d). Am aproximat graficul cu doua drepte iar dupa inversarea axelor am obtinut ecuatia d=g(Vout). Mai jos este descris algoritmul folosit.
Pentru a usura calculele, vrem sa exprimam densitatea particulelor mici in functie de valoarea tensiunii de iesire V_out a senzorului: Graficul acestei functii, obtinut prin inversarea axelor, este cel din figura.
Acest grafic poate fi aproximat cu 2 drepte, care se intersecteaza in punctul (x,y) = (3.58, 0.52), determinat cu aplicatia WebPlotDesigner.
Dreapta 1:
(x1,y1) = (0.59, 0)
(x2,y2) = (3.58, 0.52)
Dreapta 2:
(x1,y1) = (3.66, 0.8)
(x2,y2) = (3.58, 0.52)
Determinam ecuatiile celor doua drepte, folosind doua puncte (x,y) de fiecare dreapta:
D =
a∙Vout+b pentru Vout=0,59÷3,58V
m∙Vout+n pentru 3,58V < Vout < 5V
unde a=0.174; b=-0.102; m=3.5; n=-12.01
Consideram tensiunea Vout=0,59V tensiunea in aer curat, cand nu exista particule mici in aer. Deci pentru orice valoare 0 < Vout < 0,59V , densitatea particulelor va fi 0.
Rezulta:
D =
0 pentru Vout=0÷0.59V
0.174∙Vout-0.102 pentru Vout=0,59÷3,58V
3.5∙Vout-12.01 pentru 3,58V < Vout < 5V
Deoarece se foloseste convertorul CAD incorporat in placa Arduino, care este un CAD pe 10 biti, exista doar 1024 valori distincte intre 0 si 5V (treapta de 4.89mV) pentru Vout:
Vout=kout/1023∙5V=kout∙4,89mV
unde kout=120÷1023
Principalele caracteristici:
Conform Documentatiei Tehnice a senzorului, ciclul de functionare a LED-ului IR are o Perioada T=10ms, controlata de pinul de control starii led-ului infrarosu.
Pe acest pin se va simula un semnal PWM (Pulse Witdh Modulation).
Ciclul de functionare al LED-ului IR este urmatorul:
Aceast feature, scris in Python si ruland pe calculatorul la care este conectata placuta, preia informata transimisa de Arduino pe interfata Seriala USART si prelucreaza datele pentru a le reprezenta sub forma grafica. Astfel, se face un grafic cu valorile recente.
Pentru realizarea comunicatiei cu placa Arduino, am folosit biblioteca serial.
Pentru realizarea celor 4 grafice:
am folosit biblioteca matplotlib.pyplot care permite realizarea graficelor.
In plus, pentru a putea realiza graficele live, fiind actualizate de cate ori se transmite un mesaj pe interfata Seriala, am folosit matplotlib.animation.
Pentru a usura implementarea, am folosit cateva biblioteci externe:
Wire.h - Biblioteca ce faciliteaza scrierea pe un LCD
LiquidCrystal_I2C.h - Biblioteca ce permite comunicatia cu LCD-urile prin protocolul I2C
dht.h si biblioteca driver Adafruit Unified Sensor - Biblioteca ce usureaza comunicatia cu senzorul de temperatura si umiditate DTH
Pragurile de alerta alese:
Alarma de senzitivitate SMALL:
Daca minim 1 din acestea sunt peste prag ⇒ dau alarma
Alarma de senzitivitate NORMAL:
Daca minim 2 din acestea sunt peste prag ⇒ dau alarma
Alarma de senzitivitate BIG:
Daca minim 3 din acestea sunt peste prag ⇒ dau alarma
Rezultatul calibrarii senzorilor MQ-2 si MQ-135:
Configuratia fizica a proiectului:
Video demonstrativ:
Alarma curenta, desi semnalizeaza corect prezenta fumului de tigara, nu este insa ideala deoarece poate da si alarme false in prezenta spirtului, alcoolului, produselor chimice de curatat etc. Acest lucru este cauzat de faptul ca senzorii din familia MQ au selectivitate scazut si nu sunt specializati numai pe un singur gaz, ci reactioneaza la mai multe intr-o oarecare masura. Prin urmare, o alarma imbunatatita ar presupune sa se coreleze cat mai multi senzori de acest tip pentru a incerca sa se limiteze situatiile de alarma falsa. Ideal insa ar fi sa se foloseasca alt tip de senzori mai specializati, dar aceastia ori nu sunt specific compatibili cu Arduino (desi pot fi facuti evident sa functioneze cu un set-up diferit), ori sunt foarte scumpi (ex: senzorii infrarosu, dedicati unui anumit tip de gaz).
Abordarea aleasa de mine pentru a imbunatati performanta senzorilor MQ a fost aceea de a adauga senzorul Sharp_GP2Y1010AU0F care detecteaza corect prezenta particulelor mici din componenta fumului si care nu reactioneaza in prezenta altor gaze.
Important este carui public ii este adresat produsul:
https://pythonprogramming.net/live-graphs-matplotlib-tutorial/
https://matplotlib.org/3.5.0/gallery/subplots_axes_and_figures/subplots_demo.html
http://www.mikeburdis.com/wp/notes/plotting-serial-port-data-using-python-and-matplotlib/
http://gas-sensor.ru/pdf/combustible-gas-sensor.pdf
https://global.sharp/products/device/lineup/data/pdf/datasheet/gp2y1010au_e.pdf
https://www.makerguides.com/character-i2c-lcd-arduino-tutorial/
http://davidegironi.blogspot.com/2017/07/mq-gas-sensor-correlation-function.html#.YnV_k-hBxPa http://davidegironi.blogspot.com/2014/01/cheap-co2-meter-using-mq135-sensor-with.html#.YnV_1ehBxPZ
http://davidegironi.blogspot.com/2017/08/#.YnWAbuhBxPZ
https://ro.onetransistor.eu/2019/02/senzorii-de-temperatura-si-umiditate.html https://technobyte.org/interfacing-arduino-dht11-temperature-humidity-sensor/