Skocz do zawartości

Czujnik jakości powietrza


Pomocna odpowiedź

CO2 naturalnie występuje w atmosferze w stężeniu około 400ppm. W tym programie przyjęli że 397.13ppm. Na tej podstawie wyliczono resztę parametrów.

Do kalibracji czujników na gazy znajdujące się naturalnie w powietrzu w znanych stężeniach nie potrzebujesz specjalnego gazu kalibracyjnego.

W profesjonalnych miernikach powietrze używane jest do kalibracji czujnika tlenu (są wyjątki). Przyjmuje się że wynosi 20.9%.

Nie da się tej metody zastosować do gazów które naturalnie nie występują w powietrzu w stałych stężeniach (np metan propan butan CO H2S itp itd...)

Radzę ci zapoznać się z podstawami pomiaru stężeń gazów oraz procedurą kalibracji czujników.

Na YouTube wpisz "Gas Detector Calibration" i oglądaj jak wygląda kalibracja, jak się podłącza butlę z gazem kalibracyjnym itd. Poszukaj informacji o pomiarze stężenia gazów. Zapoznaj się z właściwościami fizycznymi gazów któe chcesz mierzyć. Inaczej marnie widzę twoją pracę inżynierską.

 

Link do komentarza
Share on other sites

Jeśli chodzi o stricte kalibrowanie czujnika to wszystkie wyliczenia rozumiem już bardzo dobrze. Wiem po co są te wzory i co z ich pomocą obliczam. Problemy mam jeszcze ze zrozumieniem miary PPM. Wiem, że to ilość cząstek na milion, jednakże nie rozumiem dlaczego niektóre gazy wykrywamy w różnych zakresach PPM. W czujniku MQ-3 amoniak ma zakres 10-300 ppm, benzen 10-1000 ppm a alkohol 10-300 ppm. Czemu nie jest skonstruowane to tak, że wszystkie gazy są w tym samym zakresie (powiedzmy 10-1000)? 

Ponadto doszedłem do wniosku, że czujniki te, żeby choć trochę dokładniejsze w wykrywaniu muszę podłączyć z zewnętrznego zasilania, gdyż wymagają 1500mA, a na wyjściu VCC jest 500mA. 

Link do komentarza
Share on other sites

30 minut temu, Krst0 napisał:

Jeśli chodzi o stricte kalibrowanie czujnika to wszystkie wyliczenia rozumiem już bardzo dobrze. Wiem po co są te wzory i co z ich pomocą obliczam. Problemy mam jeszcze ze zrozumieniem miary PPM. Wiem, że to ilość cząstek na milion, jednakże nie rozumiem dlaczego niektóre gazy wykrywamy w różnych zakresach PPM. W czujniku MQ-3 amoniak ma zakres 10-300 ppm, benzen 10-1000 ppm a alkohol 10-300 ppm. Czemu nie jest skonstruowane to tak, że wszystkie gazy są w tym samym zakresie (powiedzmy 10-1000)? 

Ponadto doszedłem do wniosku, że czujniki te, żeby choć trochę dokładniejsze w wykrywaniu muszę podłączyć z zewnętrznego zasilania, gdyż wymagają 1500mA, a na wyjściu VCC jest 500mA. 

Czujniki różnie reagują chemicznie z różnymi gazami. Najczęściej jeden czujnik może być wykorzystywany tylko do detekcji jednego gazu. Np czujnik może wykrywać gazy palne (metan, propan, butan, ibutan), jak go skalibrujesz na metan, to będzie prawidłowo pokazywał tylko ten jeden gaz. Dla pozostałych gazów również będą jakieś wskazania ale nie będą one miarodajne. Aby mierzył poprawnie inny gaz musisz go ponownie skalibrować na inny gaz.

W twoim przypadku możesz tak napisać oprogramowanie, że będziesz wybierać w menu kalibracyjnym rodzaj gazu a następnie dokonać kalibracji. Dla każdego gazu potrzebujesz oddzielny gaz kalibracyjny o stężeniu będącym w zakresie czujnika. Program powinien wyliczać i zapamiętywać dane kalibracyjne dla każdego gazu osobno. Następnie w użytkowaniu miernika przed pomiarem wybierasz gaz jaki chcesz mierzyć tak aby program wiedział jak przeliczać spadek napięcia na czujniku na stężenie gazu. Czujnik MQ-3 nie wskaże ci jaki gaz wykrył, to ty masz to wiedzieć co mierzysz i odpowiednio musisz skonfigurować oprogramowanie.

Jeszcze jedna uwaga:
TLV-TWA dla benzenu to 0.5ppm - do tego stężenia możesz pracować 8h/dzienie 5 dni w tygodniu
TLV-STEL dla benzenu to 2.5ppm - przy tym stężeniu maksymalny czas ekspozycji to 15 min.

TLV-TWA dla amoniaku to 25ppm - do tego stężenia możesz pracować 8h/dzienie 5 dni w tygodniu
TLV-STEL dla amoniaku to 35ppm - przy tym stężeniu maksymalny czas ekspozycji to 15 min.

Jak więc widzisz, zanim twój czujnik wykryje benzen, już będzie za późno. Uważaj także z gazami kalibracyjnymi. Używaj w dobrze wentylowanym pomieszczeniu i stosuj odpowiednie środki ochronne.

Polecam zapoznać się z powyższymi właściwościami gazów które zamierzasz mierzyć. Koniecznie poczytaj też MSDS dla każdego z gazów które chcesz mierzyć.

Benzen, Amoniak, CO, H2S są bardzo niebezpieczne i ich wdychanie nawet w bardzo niskich stężeniach może być fatalne w skutkach. Nie tylko dla ciebie, ale również dla osób postronnych.

 

Edytowano przez MR1979
Link do komentarza
Share on other sites

Osobiście z czujnika MQ-2 wyliczał tylko CO, a z czujnika MQ-135 CO2, czyli nie będę musiał tego samego czujnika ponownie kalibrować pod konkretny gaz, ale też doprecyzuję od razu, żeby być pewien co i jak. 

Mając w tym momencie MQ-2, który ma możliwość mierzenia LPG, propanu, CO itd. muszę skalibrować czujnik pod jakiś gaz (powiedzmy CO), z którego wychodzi mi danego R0 i na podstawie wykresu odczytuję wartość PPM, ale gdy jeszcze chcę do tego wyświetlić wartość LPG również na nowo muszę wyliczać R0? (Wydaje mi się, że wartość jest ta sama, bo obliczam ją na podstawie znanej wartości PPM powietrza, a różni się jedynie wykres funkcji czyli parametr a i b). 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

2 minuty temu, Krst0 napisał:

Osobiście z czujnika MQ-2 wyliczał tylko CO, a z czujnika MQ-135 CO2, czyli nie będę musiał tego samego czujnika ponownie kalibrować pod konkretny gaz, ale też doprecyzuję od razu, żeby być pewien co i jak. 

Mając w tym momencie MQ-2, który ma możliwość mierzenia LPG, propanu, CO itd. muszę skalibrować czujnik pod jakiś gaz (powiedzmy CO), z którego wychodzi mi danego R0 i na podstawie wykresu odczytuję wartość PPM, ale gdy jeszcze chcę do tego wyświetlić wartość LPG również na nowo muszę wyliczać R0? (Wydaje mi się, że wartość jest ta sama, bo obliczam ją na podstawie znanej wartości PPM powietrza, a różni się jedynie wykres funkcji czyli parametr a i b). 

Faktycznie, wartość będzie ta sama, ale to ty musisz wskazać programowi z którego wykresu skorzystać żeby przeliczyć Rs/Ro na ppm.

Link do komentarza
Share on other sites

(edytowany)

Napisałem kod dla czujników MQ-2 i MQ-135. Jednakże mam wrażenie, że sensor MQ-135 nie działa prawidłowo. Testuję program jedynie dla niego w tym momencie i nawet w momencie w którym wydycham na niego powietrze jego wartość niezbyt się zmienia. Mam wrażenie, że właściwie jest taka sama. Czujnik był już podłączony do zasilania przez 48h także to też nie jest powód problemu. Tu jest mój kod:

//MQ-2 wejście analogowe
#define mq2_pin A1
#define mq135_pin A0
#define mq2_RL 5
#define mq135_RL 1
#define mq2_air_factor 9.8
#define mq135_air_factor 3.7
float mq2_R0 = 0.0;
float mq135_R0 = 0.0;
float co_PPM = 0.0;
float co2_PPM = 0.0;

struct GasData{
  float x0;
  float f_x0;
  float x1;
  float f_x1;
  float slope;
  float shift;
};
GasData co_data = {200, 5.1, 10000, 1.35};
GasData co2_data = {10, 2.35, 200, 0.8};

void CalculateParameters(){
  co_data.slope = log10(co_data.f_x1/co_data.f_x0)/log10(co_data.x1/co_data.x0);
  co2_data.slope = log10(co2_data.f_x1/co2_data.f_x0)/log10(co2_data.x1/co2_data.x0);
  
  co_data.shift = log10(co_data.f_x1) - co_data.slope * log10(co_data.x1);
  co2_data.shift = log10(co2_data.f_x1) - co2_data.slope * log10(co2_data.x1);  
}

float CalibrationMQ(int pin, float RL, float air_factor, int samples, int interval){
  float adc_value = 0.0;
  float RS = 0.0; 
  float RZero = 0.0;

  Serial.println("Obliczanie wartosci R0 czujnika");
  for(int i = 0; i < samples;  i++){
    adc_value = analogRead(pin);
    RS += ((float)RL * (1023.0 - adc_value) / adc_value);
    if(i % (samples/10) == 0)
      Serial.print("=");
    delay(interval);
  }
  Serial.println();
  
  RZero = (RS / samples) / air_factor;
  return RZero;
}

float GetPPMValue(struct GasData data, int pin, float RL, float R0, int samples, int interval){
  float adc_value = 0.0;
  float RS = 0.0;
  float RS_R0_Ratio = 0.0;
  
  for (int i = 0; i < samples; i++){
    adc_value = analogRead(pin);
    RS += ((float)RL * (1023.0 - adc_value) / adc_value);
  	delay(interval);
  }
  RS /= samples;
  RS_R0_Ratio = RS / R0;
  float PPM_value_in_log = (log10(RS_R0_Ratio) - data.shift) / data.slope;
  float PPM_value = pow(10, PPM_value_in_log);
  return PPM_value;
}

void setup(){
  Serial.begin(9600);
  //Obliczanie parametrów a oraz b dla krzywej funkcji z wykresu dla CO.
  CalculateParameters();
  
  /*Serial.println("Kalibracja mq-2");
  mq2_R0 = CalibrationMQ(mq2_pin, mq2_RL, mq2_air_factor, 50, 500);
  Serial.println("Skalibrowano mq-2");
  Serial.print("mq2_R0: ");
  Serial.println(mq2_R0);
  */
  Serial.println("\nKalibracja mq-135");
  //mq135_R0 = CalibrationMQ(mq135_pin, mq135_RL, mq135_air_factor, 50, 500);
  Serial.println("Skalibrowano mq-135");
  Serial.print("mq13_R0: ");
  Serial.println(mq135_R0);
}

void loop()
{
  //co_PPM = GetPPMValue(co_data, mq2_pin, mq2_RL, mq2_R0, 5, 50);
  co2_PPM = GetPPMValue(co2_data, mq135_pin, mq135_RL, mq135_R0, 50, 50);
  //Serial.print("CO: ");
  Serial.println(analogRead(mq135_pin));
  //Serial.print(" PPM, CO2: ");
  //Serial.print(co2_PPM);
  //Serial.println(" PPM");
}

Może ktoś widzi jakiś błąd w rozumowaniu? Oczywiście w tym kodzie teraz nie przeliczam na wartość PPM a testuję czujnik MQ-135 po dmuchaniu na niego. Czujnik ten reaguje na CO2, czyli w wydychanym powietrzu powinno być CO2, a więc output na wyjściu analogowym powinien rosnąć a tymczasem niezależnie od tego czy dmucham na niego czy nie czujnik ten wskazuje na głównie w przedział między 180-220. Dodam, że układ sprawdzony jest kilkukrotnie. Oczywiście zakładam również, że problemem może być brak stałego napięcia 5V a podpięcie układu pod zasilanie Arduino 5V, jednakże myślę, że wartość na wyjściu analogowym powinna rosnąć (niekoniecznie dawać dobry wynik). 

Edit 1:

Sprawdziłem również reakcję na alkohol i dzieje się to samo. Jakby żadnej reakcji. 

Edit 2:

Musiał powstać jakiś błąd, zresetowanie płytki pomogło.

Edytowano przez Krst0
Rozwiązanie problemu
Link do komentarza
Share on other sites

(edytowany)

Zamierzam zasilać układ z baterii dołączonej w zestawie dla kursu elektroniki I i mam teraz takie pytanie. Jest tam stabilizator napięcia 5V, który daje maksymalny prąd wyjściowy 1,5 A co by było odpowiednie (bo nie za małe). Mam też dokumentację techniczną czujnika MQ-2, która mówi, że pobór prądu jest równy 150mA (specyfikacja - current draw: 150mA). Dobrze rozumiem, że jeśli puszczę prąd bezpośrednio ze stabilizatora na czujnik to spalę sensor? Natężenie muszę dodatkowo rezystorami zmniejszyć? Czy w ogóle źle rozumiem pojęcie current draw.

Edytowano przez Krst0
Link do komentarza
Share on other sites

Witam po przerwie,

czytanie wszystkich danych z czujników udało mi się zrobić i wszystkie dane nie bez problemów są wyświetlane w serial monitorze. W tym momencie pracuję nad wyświetleniem danych na stronie internetowej stworzonej przez serwer z modułu ESP8266-12E. W tym miejscu pojawia się problem.

Od kilku dni wertuję internet w poszukiwaniu informacji w jaki sposób to zrobić. Praktycznie wszędzie do tej pory widziałem jak ludzie korzystają z tego czujnika jak ze zwykłego Arduino (wgrywają na nie oprogramowanie i dopiero tam wykonują wszystkie polecenia związane z obsługą czujnika - AT, itd.). Znalazłem też kilka rozwiązań, że można połączyć ten moduł z Arduino (Maker Uno), ale nie posiadałem w swoim IDE bibliotek z jakich oni korzystali i po wgraniu zewnętrznych bibliotek z githuba również sposób ten nie działał. Z tego co udało mi się dowiedzieć z jakiegoś forum to biblioteki te były wykorzystywane gdy próbuje się programować ten moduł, a nie poprzez Arduino.

Natomiast ostatnio natknąłem się na połączenie Arduino z ESP-01 i stąd moje pytanie czy takie rozwiązanie ma prawa bytu w przypadku ESP-12E. Mam tu na myśli takie rozwiązanie udostępnione na stronie botlanda. Zastanawia mnie również jedno w przypadku tego rozwiązania: piny RX i TX modułu są podłączone do pinów 2 oraz 3 Arduino, a RX i TX na Arduino są oznaczone jako piny 0 oraz 1 i stąd rodzi się moje pytanie czemu moduł ten jest podłączony poprzez piny 2 i 3, a nie 0 i 1. Czy ma to znaczenie w takim przypadku. Jeśli to nie ma znaczenia to czy jest możliwość podłączenia tego pod piny 4 oraz 5? Pewnie głupie pytania, ale nie chciałbym uszkodzić modułu testując go w ten sposób bez posiadania pewności.

Link do komentarza
Share on other sites

23 minuty temu, Krst0 napisał:

Od kilku dni wertuję internet w poszukiwaniu informacji w jaki sposób to zrobić

https://arduino-esp8266.readthedocs.io/en/latest/installing.html

Pierwszy wynik w googlu po zapytaniu "esp8266 install arduino"

Dla ESP-12E w menu ustawiasz "Generic ESP8266" (czy jakoś tak), reset method "no dtr, no sync" (bo resetujesz go ręcznie), 4 Mb flash, a układ partycji taki jak Ci odpowiada.

Link do komentarza
Share on other sites

Okej, rozumiem, że instalacji mogę dokonać różnymi sposobami (poprzez Arduino IDE, poprzez klonowanie repo itd.). Wybierając wariant przez instalację poprzez ustawienia w Arduino IDE, jedyne czego nie rozumiem z tej instrukcji to co trzeba zrobić na koniec po całej instalacji, w sensie jak skorzystać już z tego rozwiązania.

Cytat

Don’t forget to select your ESP8266 board from Tools > Board menu after installation.

Mam przez to teraz rozumieć, że po instalacji zamiast wybierać płytkę Arduino Uno od teraz mam ustawić płytkę ESP8266 czy wtedy pominąć ten krok i zrobić tak jak napisałeś, żeby ustawić gdzieś w menu.

I jeszcze co z tymi pinami RX i TX? 🤔

Link do komentarza
Share on other sites

19 minut temu, Krst0 napisał:

po instalacji zamiast wybierać płytkę Arduino Uno od teraz mam ustawić płytkę ESP8266

A co masz, ESP czy Arduino?

20 minut temu, Krst0 napisał:

czy wtedy pominąć ten krok i zrobić tak jak napisałeś

A co ja napisałem?

 

Link do komentarza
Share on other sites

(edytowany)

Dziękuję Ci za pomoc, ale na przyszłość też nie musisz się tak unosić jak w ostatniej odpowiedzi. Zastanawiałem się tylko czy po prostu dobrze to wszystko zrozumiałem czy może jednak trzeba inaczej to zrobić, bo jednak coś jest dla mnie niejasne. Ale i tak dziękuję Ci za pomoc.

Edytowano przez Krst0
Link do komentarza
Share on other sites

3 minuty temu, Krst0 napisał:

na przyszłość też nie musisz się tak unosić jak w ostatniej odpowiedzi

Przestań doszukiwać się jakichś uniesień których nie ma tylko zacznij czytać ze zrozumieniem. Jeśli ja piszę że masz wybrać płytkę ESP, a ty pytasz czy masz wybrać ESP czy tak jak napisałem... wybacz, ale zamiast obrażać się i tupać nóżkami po prostu zapytaj jeśli czegoś nie rozumiesz. Bo dla mnie takie pytanie jest też trudne do zrozumienia...

Link do komentarza
Share on other sites

(edytowany)

Rozwiązanie to mogę dopiero przetestować najwcześniej w piątek, bo dopiero wtedy będę miał dostęp do mojego Arduino. Jednakże im dłużej patrzę na to rozwiązanie tym bardziej mam wątpliwości. Odpaliłem sobie Arduino IDE, żeby zobaczyć całą tą konfigurację bez wgrywania programu do Arduino (bo akurat nie mam go dostępnego pod ręką). Zrobiłem wszystko według instrukcji i teraz tu pojawia się u mnie dylemat, bo jak widzę moje pytania podejrzewam, że mogły być dość nieprecyzyjne i przez to nie do końca jestem pewien odpowiedzi na nie.

Oto co chcę osiągnąć: a więc do Maker Uno mam podpięte różne czujniki. Do Maker Uno chcę również podłączyć ESP-12E, żeby móc odczytane dane z czujników wyświetlić na stronie wygenerowanej przez ESP-12E z pomocą komend AT.

Główne pytanie: czy jest możliwość obsługi takiego modułu WiFi poprzez jakieś biblioteki? Czy muszę instalować jakiś soft z zewnątrz? Szukałem informacji i jak były jakieś rozwiązania to dla korzystania z modułu WiFi jako głównego kontrolera na którym jest całe oprogramowanie do obsługi wszystkich czujników. A ja chcę, żeby dane zbierał Maker Uno i za pomocą ESP-12E wyświetlał je.

Oto moje wątpliwości co do rozwiązania zaproponowanego przez @ethanak:

  1. Czy do mojego modułu ESP-12E muszę wgrać najpierw oprogramowanie obsługujące Arduino IDE (update softu) i dopiero mając podłączony sam ten moduł ustawić to co w tamtej poradzie zostało powiedziane.
  2. Jeśli wykonanie punktu 1. z moich wątpliwości nie jest konieczne (update softu) to po podłączeniu modułu ESP-12E do Arduino w programie ustawiam płytkę w końcu dla Arduino czy Generic ESP8266 (proszę po prostu o odpowiedź, bo odpowiedź poprzez pytanie mnie całkowicie zagubiła, bo z jednej strony korzystam przecież z Arduino, a z drugiej strony mam już podłączoną płytkę ESP do zestawu Arduino).

W razie kolejnych odpowiedzi i niejasności będę dopytywał na bieżąco

Edytowano przez Krst0
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.