'hydrogen'에 해당되는 글 2건

  1. 2019.10.12 Hardware | 공기질 측정용 MiCS-6814 센서를 사용해 보자 - 1 26
  2. 2019.08.13 Hardware | ZP07-MP901 공기질 측정 센서

Hardware | 공기질 측정용 MiCS-6814 센서를 사용해 보자 - 1

|

1. 공기


사람이 건강하게 살아가는데 필요한게 뭘까 라고 생각했을 때, 육체적 관점에서 보면 아래와 같다고 생각합니다.


- 깨끗한 공기

- 깨끗한 물

- 오염되지 않은 먹거리

- 쾌적한 주거 환경

- 충분한 수면

- 충분한 운동


예전에는 당연한 것이였지만, 이 시대에 와서는 가장 돈을 많이 들여야 하는 항목들이 되었습니다.

과거로 회기하는데 드는 비용이죠.


자고로, 산업혁명이 일어나 지구가 오염되기 전 상황으로 되돌아 가는 것이, 육체적인 건강한 삶 되겠습니다. (나의 생각)

나만 잘한다고 되는건 아니라 요원하긴 하지만...


이 arduino 나 sensor 를 가지고 노는 이유도, 전자적인 지식을 습득해 나가는 것에 대한 희열 말고도,

위의 "건강한 삶을 보낼 수 있는 환경" 에 대한 추구가 다른 주된 이유이기도 합니다.


그래서, "깨끗한 공기" 가 목적이지만, 그 이전에 현재 "어떤 공기" 속에서 살고 있는지 알아보고 싶어졌습니다.

일전에 공기질의 척도만 나타내 주는 센서를 가지고 놀아본 적이 있습니다.


* Hardware | ZP07-MP901 공기질 측정 센서

https://chocoball.tistory.com/entry/Hardware-ZP07-MP901-air-quality-sensor


다만 위의 센서는 공기의 성분까지는 알려주지 못해 그닥 쓸모가 없었죠.





2. 센서


기체를 알아보는 sensor 는 꽤 많이 나와 있습니다. 대표적으로는 MQ series 가 있지요.





이 MQ 시리즈를 이용하면 왠만한건 다 잡아 낼 수 있을 것 같습니다.


다만, 이 MQ 시리즈의 단점이 히터를 통해서 기체를 태우고 그에 따른 반응으로 측정을 하는 방법인지라,

가스나 화기를 취급하는 곳에서는 발화의 원인이 될 수 있습니다. 그래서 인화 물질을 취급하는 공장이나 병원에서는 사용되지 못합니다.


그러던 중, MiCS-6814 라는 센서의 존재를 알게 됩니다.



이 센서는 metal oxide = 기체에 의한 금속 산화도 에 따른 저항 값을 가지고 측정하므로, MQ 시리즈보다는 더 안전합니다.


SGX-CMOS-Gas-Sensor-MiCs-6814.pdf

pollutant-visualizer.pdf


잡아낼 수 있는 기체들은 다음과 같다고 하네요.


• Carbon monoxide CO 1 – 1000ppm

• Nitrogen dioxide NO2 0.05 – 10ppm

• Ethanol C2H5OH 10 – 500ppm

• Hydrogen H2 1 – 1000ppm

• Ammonia NH3 1 – 500ppm

• Methane CH4 >1000ppm

• Propane C3H8 >1000ppm

• Iso-butane C4H10 >1000ppm


하나의 센서 chip 으로 많은 성분을 잡아 낼 수 으며, 소형인지라,

MQ 시리즈를 구입해서 실험 해보기 보단, 이놈으로 결정하였습니다.




3. Grove - Multichannel Gas Sensor


MiCS-6814 를 활용하기 위해 가장 좋은 방법은,

MiCS-6814 를 활용한 breakout board 인 Grove 사의 Multichannel Gas Sensor 를 구입하는 것 입니다.


* Grove - Multichannel Gas Sensor

http://wiki.seeedstudio.com/Grove-Multichannel_Gas_Sensor/



Arduino 와의 통신도 I2C로 이루어 지며, 센서의 3개 측정값 - CO, NH3, NO3 - 의 조합으로 다른 기체도 유추해 놓는것 같습니다.

거기에 정확하지는 않지만, 어느정도 calibration 도 잡혀 있을 것이구요.


다만, 항상 그렇 듯, 가격이 문제 입니다. 요즘은 팔지도 않거니와, 실 구매 가격은 약 10만원 정도.

나중에 혹시 PCB 라도 꾸며서 만들 수 있으면 만들어 보고자, 여기에 회로 관련 정보를 올려 놓습니다.


Grove-Multichannel_Gas_Sensor_v1.0_sch.pdf

Grove-Multichannel_Gas_Sensor_v1.0_eagle_files.zip

1143_Datasheet-MiCS-6814-rev-8.pdf


* Firmware (Seeed-Studio/Mutichannel_Gas_Sensor)

https://github.com/Seeed-Studio/Mutichannel_Gas_Sensor




4. 구입


눈물을 뒤로 하고, AliExpress 로 향합니다.


* 1pcs CJMCU- MICS-6814 Air Quality CO VOC NH3 Nitrogen Oxygen Gas Sensor

- https://www.aliexpress.com/item/32762216430.html



저를 위로해 주는 기교적 착한 가격. 거진 3만원돈 이지만, 과감하게 투자해 봅니다. (6개월 고민... ㅠㅠ)



대단한건 아니지만, 도착했을 시 꽤 기뻤습니다. 이제야 이런 고급진 센서 써보는구나~ 라고.



정말 단순한 구조. 레귤레이터도 없어...



뒷면입니다.





5. 연결


어떻게 arduino 와 연결하여, 각 기체의 값을 알아낼까 찾아보던 중 아래 사이트를 발견합니다.


* Wiring MiCs 5524 / 6814 CMOS MEMS Gas Detection Sensor

https://www.14core.com/wiring-mics-5524-6814-cmos-mems-gas-detection-sensor/



걍 analog pin 에 직결하라고 하네요?

제가 구매한 breakout 보드에는 MOSFET 도 없고 그렇지만, 일단 아래 소스를 가지고 돌려 봅니다.


int NH3 = 0;
int NO2 = 1;
int CO = 2;

void setup() {
	pinMode(NH3, OUTPUT);
	pinMode(NO2, OUTPUT);
	pinMode(CO, OUTPUT);
	
	Serial.begin(9600);
	Serial.println("MiCS 6814 simple test");
}
 
void loop() {
	int sense_val_1 = analogRead(NH3);
	int sense_val_2 = analogRead(NO2);
	int sense_val_3 = analogRead(CO);
	
	Serial.print("NH3 : ");
	Serial.print(sense_val_1);
	Serial.print(" \t NO2 : ");
	Serial.print(sense_val_2);
	Serial.print(" \t CO : ");
	Serial.println(sense_val_3);
	
	delay(1000);
}


Serial Monitor 로 값을 확인해 보고, EXCEL 로 그래프를 그려 봅니다.



음... 뭔가 알아보기 힘드네요. 각 기체의 값이 서로 비슷하게 나와버립니다.






6. 저항을 추가하여 연결


아래 사이트에서 이 아저씨가 한 작업은,

측정값이 현실적으로 되려면 analog pin 에 입력되는 값은, 3.3V 를 저항을 거쳐서 연결하라고 합니다.

(이론적으로는 50K ohm 이 좋으나, 제품으로 나오는 저항은 47K ohm 이 제일 가까운 값)


* ESP32, PMS5003, BME280, MICS6814 Sensor Build

http://kstobbe.dk/2019/02/16/esp32-pms5003-bme280-mics6814-sensor-build/



또한, 아래 arduino forum 에서는, 각 단자에 47K ohm 통해 연결하는 전원은 3.3V 보단, 5V 를 먹이라고 하네요.

아마도 MiCS-6814 구동 전압이 5V 임을 감안하면, 동일한 입력 값이 좀더 예민한 값의 도출에 좋다는 이야기 같습니다.

(솔직히 잘 모름)


* CJMCU-6814 adapter board with MICS-6814 CO/NH3/NO2-sensor

https://forum.arduino.cc/index.php?topic=619992.0


Tested the sensor with the code and schematic. Connected 47k to 3 gases and 5v rather than 3v. The results seem to reflect well to CO. Have not tested NO2 and NH3.


바로 따라해 봅니다.



Serial Monitor 에서 측정된 값이구요.



EXCEL 에서 그래프화 해 봤습니다.

오오오오오, 뭔가 나오네요.



가능한 24시간동안 예열하도록 안내가 되어 있듯이, 예열 구간동안 특정 값으로 꾸준히 변화되는 것을 알 수 있습니다.

위의 빨간 표시한 부분은, 시험삼아 숨을 한번 불어본 구간입니다. 변화를 잘 감지하는군요!



하룻밤 측정해본 결과 입니다.

각 기체의 상관 관계와 실내 공기 내에서의 NH3, NO2, CO 의 값은 이정도인 듯 합니다.




7. 15bit ADC + 저항을 추가하여 연결


Arduino 내장 10 bit ADC 를 가지고 측정한 결과 보다는 15 bit ADC 가 훨씬 정확합니다.

아래 포스트 이후로, 향후 모든 측정값은 더 높은 ADC 를 통하라고 배웠습니다.


* Hardware | ADS1115 16bit 4채널 ADC 를 사용해 보자

https://chocoball.tistory.com/entry/Hardware-ADS1115-16bit-4channel-ADC


ADS1115 이 입력값을 받구요.



소스를 ADS1115 용으로 살짝 수정해 줍니다.

#include "Wire.h"
#include "Adafruit_ADS1015.h"
 
Adafruit_ADS1115 ads(0x48);
 
void setup(void) {
    Serial.begin(115200);
    ads.begin();
}
 
void loop(void) {
    int16_t adc1; // CO
    int16_t adc2; // NH3
    int16_t adc3; // NO2
     
    adc1 = ads.readADC_SingleEnded(1);
    adc2 = ads.readADC_SingleEnded(2);
    adc3 = ads.readADC_SingleEnded(3);

    Serial.print("NH3 : ");
    Serial.print(adc2);
    Serial.print(" \t NO2 : ");
    Serial.print(adc3);
    Serial.print(" \t CO : ");
    Serial.println(adc1);
     
    delay(1000);
}


Serial Monitor 에서 확인한 값 들 입니다.

확실히 뭔가 엄청나게 숫자가 불어나 있습니다.



EXCEL 을 통해서 그래프화 시켜 봅니다.



패턴은 47K ohm 저항 꼽고 측정할 때와 비슷하게 나왔습니다.


다만, 높은 ADC 를 통하여 해상도는 좋아졌지만,

어떤 기준값으로 나누어야 할지 알지 못하기 때문에, trend 만 알 수 있지 정확한 수치화까지는 진행하지 못했습니다.




8. Next Step


이런 공기질 측정에서의 수치화는 calibration 인데,

그렇게 하려면 실제 실험실 환경을 통해서, 실제 기체를 가지고 기준을 잡아야 합니다.


위의 방법이 현실적으로 불가능 하기에,

다음에 할 것으로는 Grove - Multichannel Gas Sensor 의 breakout 을 만들어서 (아님 구입해서),

제조사인 SeeedStudio 의 경험이 녹아들어가 있는 firmware 와 소스코드를 가지고 수치화 해보는 것 이겠습니다.


공기 질에 관한 센서는 몇 개가 더 있습니다. 계속 놀아보도록 하지요.

To Be Continued...


And

Hardware | ZP07-MP901 공기질 측정 센서

|

1. 공기 질


예전 80년대 개그 프로그램 중, 스위스 공기를 깡통에 넣어 파는 일화가 있었습니다.

사실 확인이 안되니, 서울 공기를 넣어서 파는 사기를 개그로 풀어놓은 내용이었던걸로 기억해요.


그 당시 꼬꼬마였던 저는, 그 당시 상상을 뛰어넘는 내용이라 아직도 그 이미지를 강하게 기억하고 있습니다.

하긴, 물을 사먹는 시대가 온다는 예전 이야기가 현실로 된 지금은, 공기도 사먹는 날이 올지 모르겠습니다.


현실적으로 PM2.5 라는 단어가 바짝 친근해진 요즈음, 공기의 질을 신경써야 하는 시대가 온건 확실해 보입니다.






2. ZP07-MP901 센서


우연한 기회에 이 센서를 얻을 기회가 생겼습니다.

사실은 다른 공기질 측정 센서를 구입했는데, 이게 배달 되어 왔죠.



그때 당시에는 정보가 하나도 없어서, 사용을 못 하고 있다가,

이와 비슷한 센서인 ZP01-MP503 를 기준으로 만든 소스코드를 일전에 발견하여 이번에 사용해 보게 되었습니다.



도착은 이런 비닐 속에 포장되어 왔습니다.

배송 보내준 사람이 얼마나 일을 하기 싫었는지 상상하기 어렵지 않았습니다.



PCB 뒷면에는 컨트롤러 칩이 있고, 윗면에는 센서가 부착되어 있습니다.



ZP07-M901 은 ZP01-M503 보다는 좀더 복잡하게 부품들이 실장되어 있어서, 한단계 위의 제품인 듯 합니다.

아래 사진이 ZP01-M503 입니다.






3. 사양


스펙은 다음과 같습니다.


ZP07-MP901 Air Quality Module V1.1.pdf



위의 PDF 사양서에서 표기되어 있습니다만, 이 센서의 사용에 있어서 주의점 들이 몇가지가 있습니다.



사용전에 예열을 5분정도 꼭 하라고 합니다.

공기질 측정용 센서들은 대부분 센서를 가열하여 공기를 내부에서 태워서 측정하는 듯 합니다.


그래서, 휘발성 물질이 많은 곳에서는 사용을 금하라고 되어 있습니다.


한가지 아쉬운 것은, 측정은 다음 물질들이 가능하나, 공기중의 각 성분 비율을 보여주지 못하고,

밀도 측정을 통한 공기질 좋다/나쁘다 만을 알려줄 수 있습니다.


---------------------------------

formaldehyde, benzene, carbon monoxide, ammonia, hydrogen,alcohol, smoke of cigarette, essence & etc.

---------------------------------


온갖 안좋은 것들을 감지할 수 있군요.





4. 연결


Arduino 와의 연결은 다음과 같이 합니다.


 ZP07-MP901 | Arduino Nano
---------------------------
    VCC     |     5V
    GND     |     GND
     A      |     D8
---------------------------

공기 질의 결과 척도는 A pin 에서 digital 로 output 됩니다.

B pin 은 공장에서 사용하는 pin 으로, 측정시 사용되지 않습니다.



실재로는 빵판을 사용하지 않고 pin 들을 바로 연결했습니다.






5. 소스


ZP07-M503 (사실 이런 제품은 없슴) 용 소스 이지만, ZP07-M901 에서 완벽하게 동작합니다.


* Arduino test air quality class module ZP07-MP503 test

https://www.cnblogs.com/aiyauto/p/7388926.html


이 센서는 A pin 에서 오는 신호의 주기에 따라서 구분을 합니다.



그래서 아래 소스를 보면, 대부분이 시간의 delta 값을 찾는것으로 되어 있습니다.


//
// Author: Aiyauto
// VERSION: 0.0.1     
// Date:2017/08/16
// PURPOSE: ZP07_MP503 Air Quality Module Detection Example for Arduino
// 
 
int airQuality;  // Air quality level 0-10 
 
void setup() {
   Serial.begin(9600);
}

void loop() {
  airQuality = ZP07_MP503(8);
  Serial.print("   Current air quality rating: ");
  Serial.println(airQuality);
}
 
int ZP07_MP503(int pinA) {
  
  /* Initial */
  pinMode(pinA, INPUT);
  unsigned long millisTimes = millis();
  unsigned long startMillisTimes = millisTimes;
  
  unsigned long stopMillisTimes;
  signed long deltaMillisTimes = millisTimes - startMillisTimes;
  bool turnState = false;
  bool pinAstate = digitalRead(pinA);
  bool pinAstateLast = pinAstate;
  int result;
  
  /* test read status */
  while (true) {
    pinAstate = digitalRead(pinA);  // Read pin status
    
    if(pinAstate != pinAstateLast) {
      if (turnState == true ) {
        stopMillisTimes = millis();
        if (pinAstate == false ) {
          deltaMillisTimes = stopMillisTimes - startMillisTimes;
        } else {
          deltaMillisTimes = 98 - stopMillisTimes + startMillisTimes;
        }
        
        result = (deltaMillisTimes + 5 ) / 10;  // computation result is rounded
        break;  // out of the loop
      }
      if (turnState == false ) {
        startMillisTimes = millis();  // refresh the current time
        turnState = true; // update flag
      }
      pinAstateLast = pinAstate;
    }
    
    millisTimes = millis();
    deltaMillisTimes = millisTimes - startMillisTimes;
    if ( deltaMillisTimes > 100 ) { // The result is judged, the timeout jumps out of loop
      if (pinAstate == true) {  // air quality level 10
        result = 1;
      }
      if (pinAstate == false) { // air quality level 0
        result = 0;
      }
      
      break;
    }
  }
  
  // Serial.print(" pinAstate:");
  // Serial.print(pinAstate);
  // Serial.print(" , Air Quality Rating:");
  // Serial.print(result);
  // Serial .print(", deltaMillisTimes:");
  // Serial.println(deltaMillisTimes);
  
  return result;  // return air quality level result
}





6. 결과


위의 소스에서 pinAstate 및 deltaMillisTimes 도 표시하도록 조금 변경해서 측정해 봤습니다.

물론 전원 연결하고 5분 뒤에 말이죠.


...
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:1, deltaMillisTimes:11
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:11
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:11
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:9
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:9
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:9
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:9
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
...


위는 센서에 대해 숨을 내쉬었더니 값의 변화가 있었습니다.

그럼 더 쎈건 없을까... 주변을 보던 중, 땀났을 때 몸을 닦는 샤워 페이퍼를 발견합니다.

저번 출장갔을 때, 하나 사다 놓은 것.


몸에 문지르면, 땀도 제거하고 몸이 깨끗해 짐을 느끼게 해주는 물티슈 같은 것 입니다.



성분을 확인 해봤습니다.



에탄올, 멘톨, PPG-6데실테트라데세스-20, 디이소스테아린산PEG-20글리세린, 향료 가 들어 있다고 합니다.

나름 자극도 쎄고, 알콜 냄새가 강하게 나므로, 센서에서 뭔가 반응이 올 듯 합니다.



샤워 타월 한장을 꺼내서 몸좀 닦고 센서 코앞에 갔다 댑니다.


음? 처음에는 왜이리 반응이 안오지? 했습니다.

뭔가 잘못 되었나?


한~~ 참을 있으니 반응이 오는군요.



이렇게 반응이 늦어서 괜찮을까 싶을 정도로 늦습니다.

그래도 뱉어 내는 값은 나름 정확한 듯 합니다.


센서의 스펙 대로라면, delta time = 0ms 가 공기질 좋음 인데, 현실적으로 0ms 의 delta time 을 만들어 낼 수 없으므로,

101ms 이상을 공기질 제일 좋은 0 으로 설정한 것 같습니다.


스펙상으로는 100ms 에서 제일 나쁜 10이 설정되어 있습니다만, 이미 101ms 이상에서 0을 설정해 놨으므로,

이 소스를 가지고는 0~9 까지만 확인할 수 있겠네요.


90ms 대를 10으로 하면 될 것 같은데, 90ms 대의 값이 이 소스를 가지고 도출되지 않더군요.

Source code 를 손 보면 될것 같기도 한데, 귀찮아서 여기서 분석은 그만하기로 해요.


그래프가 빠지면 서운하니 그려 봤습니다.



갑짜기 그래프가 치솟는 것은 워낙 샤워 페이퍼 강도가 쎄서 그런것 같구요,

한번 반응하기 시작 하면, 완전히 그 단계를 벗어날 때 까지 유지하면서 값을 변경하는 것 같습니다.


즉, 실시간으로 민감하게 반응하기 보단, 충분히 그 상황으로 바뀌어야 반응하는 듯 합니다.

이 센서의 감도와 반응 형태를 보고, 그 환경에 맞게 활용하는 것이 중요해 보이네요.


오늘도 잘 놀았습니다.


And
prev | 1 | next