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 를 손 보면 될것 같기도 한데, 귀찮아서 여기서 분석은 그만하기로 해요.
그래프가 빠지면 서운하니 그려 봤습니다.
갑짜기 그래프가 치솟는 것은 워낙 샤워 페이퍼 강도가 쎄서 그런것 같구요,
한번 반응하기 시작 하면, 완전히 그 단계를 벗어날 때 까지 유지하면서 값을 변경하는 것 같습니다.
즉, 실시간으로 민감하게 반응하기 보단, 충분히 그 상황으로 바뀌어야 반응하는 듯 합니다.
이 센서의 감도와 반응 형태를 보고, 그 환경에 맞게 활용하는 것이 중요해 보이네요.
오늘도 잘 놀았습니다.
'Hardware' 카테고리의 다른 글
Hardware | 555 chip 알아보기 - 1 (0) | 2019.08.26 |
---|---|
Hardware | ESP-01 or ESP8266 사용기 - 5 (2) | 2019.08.14 |
Hardware | ADS1115 16bit 4채널 ADC 를 사용해 보자 (6) | 2019.08.12 |
Hardware | Digital Compass - HMC5883L 사용기 - 3 (0) | 2019.08.10 |
Hardware | Arduino 를 DIY 해보자 - 2 (0) | 2019.08.04 |