미세먼지 나빠요
1장에서 언급 되었지만 아두이노 캠프의 최종 목표는 미세먼지를 측정기를 만드는 것이다. 이번장에서는 드디어 미세먼지를 측정하는데 사용할 먼지센서를 사용해 볼 것이다.
준비물
Sharp GP2Y1014AU0F 먼지센서
150ohm 저항
220uF 커패시터 (uF 는 마이크로 패럿이라고 읽는다)
이미 미세먼지에 대해서는 언론을 통해 많이 접해 보았을 것이다. 구체적으로는 잘 모르더라도 이름만으로 추측해 보아도 미세먼지는 먼지보다 작을거 같고 초미세 먼지는 미세먼지보다 작을 것 같다. 그리고 먼지라고 하니 몸에 안좋을 거 같다.
일단 미세먼지는 PM10 먼지를 말한다. PM10 이란 직경 10㎛ 이하의 먼지를 말한다. 그리고 초미세먼지는 직경 2.5㎛ 이하의 먼지를 말한다. 너무 작은 단위라 감이 안 올 수 있는데 머리 카락의 직경은 100㎛ 이다. 미세먼지는 머리카락보다 10배 작다. 초 미세먼지는 머리카락보다 40배 작은 사이즈이다. 눈으로는 볼 수 없는 크기의 먼지들이라고 보면 된다. 세계보건기구에서는 경유자동차에서 배출되는 초미세먼지를 1급 발암물질로 지정한 바 있다. 초미세먼지가 몸속에 들어가면 먼지가 몸속을 돌아 다니면서 호흡기 질환이나 암을 일으키게 되니 초미세먼지가 많은 날에는 조심하는 것이 좋다.
미세먼지를 측정하는 방법에는 여러가지 방법이 있다. 우선 가장 좋은 방법은 전문 장비를 이용하는 방법이다. 가격이 비싸고 크기가 크지만 측정값이 정확하다. 정부기관이나 연구소 등에서는 이러한 장비를 사용하는데 여과지에 공기를 통과 시켜 여과지의 중량의 변화를 측정한다. 하지만 개인이 사용하기에는 비싸고, 보관이 어려우며, 측정이 번거롭다. 그래서 가정용 미세먼지 측정기나 공기청정기에 내장된 미세먼지 측정기는 보통 LED 나 레이저를 이용하는 방식을 사용한다. 빛을 공기중에 통과 시켜서 빛을 감지하는 센서에 얼마나 빛이 도달하는지로 미세먼지의 정도를 측정하게 된다. 빛을 이용하다 보니 먼지가 아닌것이 센서에 들어 온다거나 다른 빛에 영향을 받을 수도 있기 때문에 정확도는 조금 떨어 질 수 있다. 하지만 정확도가 조금 떨어질 뿐 간단히 측정하는데에는 큰 무리가 없다. 게다가 가격도 저렴하고 크기도 작기 때문에 비교적 손쉽게 구할 수 있고 휴대에도 용이하다.
자 미세먼지와 측정기의 원리에 대해 간단히 알아 보았으니 이제 직접 미세먼지 측정기를 만들어 보도록 하자. 이번 실습에 사용할 먼지센서는 Sharp GP2Y1014AU0F 먼지센서이다. 센서의 가격은 7천원 정도로 저렴한 것이 장점이다. 중국쇼핑몰을 이용하면 4천원 정도에도 구입 할 수 있다.
먼지센서가 준비 되었다면 다음과 같이 회로를 구성해 보도록 하자.
150ohm 저항과 220uF 커패시터를 연결 했는데 커패시터는 이번에 처음 사용해 본 부품이다. 커패시터는 일종의 소형 보조배터리이다. 이것을 이용하면 전원을 안정적으로 공급할 수 있게 된다. 먼지센서의 원리가 LED 를 반복적으로 껐다가 켰다가를 반복하면서 먼지의 양을 측정하게 되는데 이것을 자연스럽게 하기 위한 부품이라고 보면 된다.
이 정도만 연결해도 Arduino IDE 에서 먼지의 농도를 측정 해 볼 수 있긴 하다. 하지만 눈으로 확인 하기에는 LCD 만한 것이 없다. 위에서 구성한 회로에 LCD 회로를 추가로 연결 해 볼 것이다.
아래는 지난번 LCD1602 를 구성했던 회로도이다. 보기만 해도 복잡하다.
아래는 LCD1602와 먼지센서를 모두 함께 연결한 모습이다.
이 회로도를 구성하는 것은 다소 어려울 수 있다. 하지만 일단 최선을 다해 연결 해 보자. 이정도 회로도를 직접 연결 해 보고 나면 다른 회로 연결이 상대적으로 쉬워 보일 것이다.
혹시 회로 구성에 실패 하더라도 좌절하지 말자. 앞으로 더 쉽게 연결하는 방법에 대해서도 알려 줄 것이다. 지금 하는 과정은 일종의 훈련이라고 생각하자.
연결을 다 하고 나면 아래와 같은 모습이 될 것이다.
아두이노 보드에 업로드 할 소스코드는 다음과 같다. 회로도를 잘 구성 하였고 코드를 정확히 입력하였다면 위의 사진 처럼 먼지센서 값이 측정되는 것을 볼 수 있을 것이다.
LCD 연결이 복잡하다 보니 LCD 가 제대로 나오지 않을 수도 있다. 그럴 때는 과감하게 LCD 회로를 포기해도 좋다. 위의 코드에서 Serial output 부분을 볼 수 있는데, Arduino IDE 의 Serial Monitor 기능을 통해 측정된 값을 확인 해 볼 수 있다. Tools -> Serial Monitor 을 열어 보자.
다음과 같이 측정된 값이 1초 마다 한줄씩 출력 되는 것을 볼 수 있다.
계산공식은 http://www.howmuchsnow.com/arduino/airquality/ 사이트에 올라온 공식이다. 블로그 저자가 상용 미세먼지 센서를 이용해서 Sharp 먼지센서와 비교해서 측정값을 튜닝해서 만든 공식이다. 어느 정도 믿고 사용해도 좋다고 볼 수 있다.
다만 먼지센서 자체에도 튜닝 기능(offset 조정 나사가 있음)이 있고 여러가지 변수가 있다 보니 측정값이 정확한 편은 아니다. 평상시의 미세먼지 농도를 알아 두고 평상시 보다 높아 지면 공기가 안좋았다고 판단하는 것이 좋다. 저가 센서에 너무 큰 기대는 하지 말도록 하자. 좀 더 정확한 값을 구하고 싶다면 더 비싼 센서를 구해서 사용하도록 하자. 다만 센서 하나만 몇만원이 넘어 가는 편이다.
코드가 점점 복잡해 지고 어려워 보일 수 있다. 약간의 부연 설명을 덧붙여 본겠다. 가볍게 읽고 넘어 가자. 이해가 안된다면 그냥 넘어 가도 좋다.
int ledPower = 10; // Sensor Pin 3 - D10
앞서 나왔지만 // 뒤는 주석이니 신경 쓰지 않아도 좋다.
int ledPower = 10; 은 ledPower 라는 변수(저장공간)에 10이라는 값을 저장한다는 의미이다. int 는 정수형 값을 저장한다는 의미이다. 저장공간이니 어쩌니 하는 이야기가 나왔는데 이해가 안된다면 넘어 가자. 그냥 앞으로 나올 코드에서 ledPower 가 보이면 거기에는 10 이라는 값을 사용한다고 이해하면 된다.
먼지센서의 ledPower 선은 아두이노의 10번 핀에 연결 되어 있다. 그것을 코드에서 읽기 좋게 하기 위해 선언한 것이라고 보면 된다. int ledPower = 10; 을 지우고 ledPower 부분을 10으로 바꿔주어도 동일하다고 보면 된다.
float offTime = 9680;
int 가 아니고 float 이 보인다. int 는 정수이고 float 은 소수점이 들어가는 숫자를 저장할 때 사용한다. 아래에서 delayMicroseconds(offTime); 함수에 들어가는 값이 float (소수값)이 들어가는 함수라서 float 으로 선언한 것이다.
digitalWrite(ledPower, LOW);
digitalWrite(ledPower, HIGH);
는 LED 실습에서 보았듯이 ledPower (10번) 핀에 전원을 LOW (끄기), HIGH (켜기) 할 때 사용한다. 특이한 점은 먼지센서의 구조상 LOW 로 전원을 끌 때 LED 가 켜지고, HIGH 로 전원을 켤 때 LED 가 꺼지는 구조이다. 이 부분에 대해 궁금한 사람은 풀업, 풀다운 에 대해서 검색해 보도록 한다.
Serial.begin(9600);
Serial 모니터에 값을 출력하기 위한 초기화 작업이다. 9600 이라는 숫자가 보이는데 Serial Monitor 을 띄우면 숫자값을 설정 하는 부분이 보이는데 그 설정값과 동일한 값을 넣어 주면 된다.
먼지센서의 값을 읽어 오는 부분에 대해 좀 더 보자.
센서의 LED 를 켜고 잠깐 기다렸다가 (0.28ms) analogRead 로 센서의 값을 읽어 들인다. (0.28ms 인 이유는 Spec 문서에서 측정이 잘 될 때 까지 기다려야 하는 권장 값이기 때문이다.)
그리고 센서의 LED 를 끈다.
그리고 센서의 값을 계산공식을 이용해서 사람이 알아 볼 수 있는 값으로 변환시킨다.
다음 내용은 생략 했지만 다음 부분은 계산된 값을 Serial Monitor 와 LCD 에 출력하는 내용이다. Serial.print 는 Serial Monitor 에 출력하는 것이다. lcd.print 는 lcd 에 출력하는 것이고 사용법은 거의 비슷하니 이미 print 를 사용해 봤다면 출력 대상이 바뀌는 것일 뿐이라는 것을 알 수 있을 것이다.
센서에 대한 자세한 스펙은 Specification 문서를 보면 된다. 그 문서를 보면 값을 측정 할때 왜 LED 를 켰고 잠깐 기다렸다가 측정을 하고 계산 공식을 왜 저렇게 사용하는지 이해하는데 도움이 될 것이다. 자세히 알고 싶다면 자세히 읽어 보도록 하고 아니면 적당히 보고 넘어 가도 좋다.