DIY 공기질 모니터 직접 만들기: PM2.5, CO2, VOC, 오존, 온습도 측정 with 아두이노
여러분이 숨쉬는 공기의 질이 어떤지 궁금해본 적 있으신가요? 아니면 사무실에서 왜 가끔 졸음이 오는지, 밤새 잤는데도 아침에 왜 피곤한지 의아했던 적 있으신가요? 열악한 공기질은 많은 부정적 건강 영향을 초래할 뿐 아니라 피로, 두통, 집중력 저하, 심박수 증가 등을 유발할 수 있습니다. 공기질을 모니터링하는 것이 여러분이 생각하는 것보다 더 중요할 수 있습니다. 그래서 이 튜토리얼에서는 PM2.5, CO2, VOC, 오존뿐만 아니라 온도와 습도까지 측정할 수 있는 우리만의 공기질 모니터를 만드는 방법을 배워보겠습니다.
아래 영상을 시청하거나 작성된 튜토리얼을 읽어보세요.
개요
각 공기질 파라미터가 우리에게 어떻게 영향을 미치는지와 센서들이 어떻게 작동하는지 설명하겠습니다. 이 프로젝트의 두뇌는 아두이노 프로 미니 보드로, 2.8인치 넥시온 터치 디스플레이와 결합해 괜찮은 사용자 인터페이스를 제공합니다.
모든 센서들의 측정값을 실시간으로 볼 수 있고, 특정 센서를 클릭하면 지난 24시간 동안의 해당 센서 값들을 볼 수 있습니다. 디스플레이 밝기를 낮추거나 완전히 끌 수 있는 디밍 기능도 있습니다. 예를 들어 밤동안 침실 공기질을 추적하고 싶을 때 편리합니다.
밤에는 화면을 끄고, 다음 날 각 센서별 값을 개별적으로 확인할 수 있습니다.
어쨌든 이제 제작 전 과정을 안내하고 모든 것이 어떻게 작동하는지 설명하겠습니다. 이 영상이 끝나면 여러분도 직접 만들 수 있을 것입니다. 시작해볼까요.
PM2.5 센서 – PMS5003
이 장치에는 네 가지 주요 공기질 센서가 있습니다. 공기 중 지름 2.5마이크론 정도의 미세먼지(PM2.5)를 측정하기 위해 PMS5003 센서를 사용합니다. 입자상 물질은 폐 깊숙이, 혈류, 뇌까지 침투해 많은 건강 문제를 일으킬 수 있어 가장 해로운 형태의 대기 오염입니다.
이 센서는 레이저 산란 원리로 작동합니다. 센서에 팬이 있어 제어된 기류를 만들어 환경 입자들이 초점이 맞춰진 레이저 빔을 통과하게 합니다.
입자들이 빛 산란을 일으키고 이는 포토다이오드로 감지된 후 마이크로프로세서의 도움으로 PM 농도로 변환됩니다. 이 센서 결과가 꽤 신뢰할 만하며 PM2.5 외에도 PM1과 PM10 값도 출력할 수 있습니다.
CO2 센서 – MH-Z19
다음으로 CO2(이산화탄소) 측정을 위해 MH-Z19 센서를 사용합니다. 사람들이 호흡하면서 이산화탄소를 배출하므로 실내 CO2 농도는 쉽게 매우 높아질 수 있습니다. CO2는 고농도에서 위험할 뿐 아니라 졸음, 피로, 생산성 저하 등을 유발할 수 있습니다.
이 센서는 비분산 적외선(NDIR) 원리로 공기 중 CO2를 측정합니다. 적외선 소스가 측정하려는 공기로 채워진 튜브를 통해 빛을 보냅니다. 적외선 소스 반대편에는 광학 필터와 IR 검출기가 있어 통과하는 IR 빛의 양을 측정합니다.
측정 중인 공기에 존재하는 CO2 기체 분자들은 특정 대역의 IR 빛을 흡수하면서 일부 파장은 통과시킵니다. 따라서 방출된 빛의 양과 검출기가 받은 IR 빛의 양 차이에 따라 CO2 농도가 계산됩니다. 이 센서 결과도 꽤 정확합니다.
VOC 및 오존 센서 – MP503 및 MQ-131
VOC와 오존 측정을 위해 MP503과 MQ-131 가스 센서를 사용합니다. 이들은 가열 금속 산화물 센서로, 작동 원리는 표적 가스 존재 시 저항 변화 감지에 기반합니다.
특정 전류가 금속 기판을 통과하고, 존재하는 가스 양에 따라 저항이 변합니다.
MQ131 센서의 표적 가스는 오존뿐으로, 일반 가정에서는 특정 공기 청정기, 페이셜 스티머, 자외선을 발생시키는 살균 램프 등에서 발생할 수 있습니다.
반면 MP503 센서는 알코올, 연기, 아이소부탄, 메타날 등 여러 표적 가스를 가집니다. VOC는 휘발성 유기 화합물을 뜻하며, 세제, 청소제, 방향제, 페인트, 화장품 등 우리가 매일 사용하는 제품들에서 발생하는 유기성 배출물입니다. VOC는 두통, 눈 자극, 피부 반응, 어지러움 등 많은 부정적 건강 영향을 일으킬 수 있습니다.
DIY 아두이노 공기질 모니터 – 회로도
자, 이제 회로도를 보고 모든 것을 어떻게 연결해야 하는지 설명하겠습니다.
이 아두이노 공기질 모니터에 필요한 구성품은 아래 링크에서 구할 수 있습니다:
PMS5003 PM 센서 …………………….
MH-Z19 CO2 센서 ……………………..
MQ-131 오존 센서 …………………..
MP503 VOC 센서 ……………………….
DHT22 온습도 센서………….
넥시온 2.8″ 디스플레이 ……………………..
DS3231 RTC ………………………………….
아두이노 프로 미니………………..…….…..
거리/스페이서 너트 M3 ……………
미니 USB 커넥터 …………………….
핀 헤더 ………………………………….
2위치 스위치 …………………………
커패시터 값: 0.1uF 세라믹 및 10uF 전해질
트랜지스터 – 2N3904
스위치
공개: 이들은 제휴 링크입니다. 아마존 어소시에이트로서 자격 있는 구매로부터 수익을 얻습니다.
올바른 저항 값: R1 = 1K, R2 = 2K, R6=100K 또는 1M, R7=1K
PM2.5 센서는 시리얼 인터페이스로 아두이노와 통신합니다. 5V로 작동하지만 수신(RX) 로직 레벨은 3.3V에서 작동하므로 전압 분배기가 필요합니다. CO2 센서와 넥시온 디스플레이도 시리얼 통신을 사용합니다. VOC와 오존 센서 읽기에는 아두이노 아날로그 입력을 사용하고, DHT22 온습도 센서는 디지털 핀을 사용합니다.
두 트랜지스터는 센서 히터 활성화에 사용됩니다. 센서 값 저장 시 시간을 추적하기 위해 리얼타임 클락 모듈도 사용하며, I2C 통신을 사용합니다. 전체 장치는 미니 USB 커넥터를 통해 5V로 전원 공급됩니다.
참고: 2021년 업데이트 최고의 아두이노 스타터 키트 8가지
이제 모든 것을 연결해보면 많은 연결 때문에 꽤 지저분해집니다.
그래서 이 프로젝트에는 PCB가 확실히 필요합니다.
아두이노 공기질 모니터용 PCB 제작
이 프로젝트용 PCB 제작에 Altium Designer를 사용하겠습니다. 이가 이 영상의 후원사입니다.
Altium Designer는 진정한 통합 설계 환경을 만드는 데 전념한 수십 년의 혁신과 개발을 대표합니다. 힘과 사용 편의성 사이의 완벽한 균형을 이루며, 시장에서 가장 널리 사용되는 PCB 설계 솔루션으로 자리매김했습니다.
이제 Altium Designer로 이 프로젝트의 PCB를 어떻게 설계했는지 보여드리겠습니다. 프로젝트 회로도 제작으로 시작했습니다. Altium Designer에는 기본 전자 부품 내장 라이브러리가 있지만, 제조사에서 직접 부품을 검색할 수 있어 프로젝트 부품 조달이 매우 편리합니다.
예로 Manufacturer Part Search 기능을 사용해 미니 USB 커넥터를 찾았습니다. 여기서는 3D 모델, 풋프린트, 치수 등 부품 관련 데이터에도 쉽게 접근할 수 있습니다.
자체 부품 라이브러리를 만들 수도 있습니다. 이 프로젝트 대부분의 부품을 직접 만들었는데, 각 부품마다 나만의 3D 풋프린트를 만들어 마지막에 전체 PCB를 3D로 얻을 수 있도록 했습니다. PCB 풋프린트용 3D 모델을 만들려면 아무 CAD 소프트웨어나 사용해 .STEP 파일로 저장하고 Altium Designer로 가져오면 됩니다.
회로도를 완료한 후 PCB를 생성했습니다. 부품들을 원하는 대로 배치하고, Auto Route 기능을 한 번 클릭하는 것만으로 소프트웨어가 모든 트레이스를 자동 생성했습니다.
필요시 수동으로 생성하거나 조정할 수도 있습니다. 자동 라우팅이 트레이스를 어떻게 만들지 설계 규칙을 설정하고, 각 넷마다 다른 너비 설정 등도 가능합니다. 이 시점에서 PCB를 3D로 볼 수 있고 전체 PCB 어셈블리의 3D 파일을 내보내 나중에 케이스 설계에 사용할 수 있습니다.
어쨌든 Altium이 이런 교육 콘텐츠를 후원해주셔서 감사드립니다. 이 소프트웨어에 대해 더 알고 싶거나 체험해보고 싶다면 아래 링크를 확인하세요. 웹 기반 Altium 365 뷰어로 프로젝트 미리보기와 파일 확인도 가능합니다.
Altium Designer 무료 체험 – https://www.altium.com/yt/howtomechatronics Altium 365 뷰어: https://www.altium.com/viewer
Altium Designer 프로젝트 파일들:
프로젝트 파일, 라이브러리, 전자 부품 3D 모델 .STEP 파일을 포함한 Altium Designer 파일들:
PCB 거버 파일:
자, PCB를 완료한 후 거버 파일과 NC 드릴 파일들을 생성해 단일 압축 파일로 넣어 PCB 제조 주문 준비가 되었습니다.
JLCPCB에서 PCB를 주문했습니다. 여기서 압축 파일을 드래그 앤 드롭하면 우리 PCB에 대한 모든 시각적 정보를 얻을 수 있습니다.
원하는 속성들을 선택하고 합리적인 가격에 PCB를 주문합니다.
PCB 조립
며칠 후 PCB들이 도착했습니다. PCB 품질은 훌륭하고 모든 것이 설계와 정확히 일치합니다.
이제 PCB 조립을 시작할 준비가 되었습니다. 작은 부품들부터 납땜하기 시작했습니다. 저항들과 두 트랜지스터들입니다.
그런 다음 아두이노 프로 미니 보드를 제자리에 납땜할 수 있습니다. 하지만 먼저 핀 헤더들을 납땜해야 합니다. 모든 핀이 필요하진 않지만 A4, A5, DTR 핀 같이 필요한 것들은 빠뜨리지 않게 주의하세요. 또한 핀 레이아웃이 똑같은 정확한 아두이노 프로 미니 보드를 사용해야 합니다. 가끔 레이아웃이 다를 수 있습니다.
다음으로 DHT22 센서를 제자리에 끼웁니다. 이를 위해 먼저 핀들을 90도로 구부립니다. 납땜할 때 부품들을 고정하기 위해 블루택 접착제를 쓰기도 합니다.
이 프로젝트에 사용된 두 커패시터는 전원 공급 안정화용입니다. 보드 전원은 미니 USB 커넥터를 통해 5V가 공급됩니다.
전원 커넥터 바로 위에 두 스위치를 납땜합니다. 하나는 장치 켜기/끄기용이고, 다른 하나는 아두이노에 스케치 업로드할 때 사용합니다. 그런 다음 USB-UART 인터페이스, 디스플레이, PM2.5 센서용 핀 헤더들과 VOC, 오존, CO2 센서용 핀 헤더들을 제자리에 끼웁니다.
다음으로 DS3231 리얼타임 클락 모듈 납땜을 위해 다시 핀들을 90도로 구부립니다. 납땜 후 메인 PCB 전원이 꺼져도 시간을 유지하는 배터리를 끼웁니다. 이로써 PCB는 사실상 완료되었고, 이제 PM2.5 센서와 디스플레이를 PCB에 연결할 케이블들을 준비하면 됩니다. 센서와 함께 오는 케이블에 수 핀 헤더를 납땜해 PCB에 쉽게 연결할 수 있게 했습니다. 디스플레이를 PCB에 연결하기 위해 디스플레이 커넥터 뒷면에 네 선을 납땜해 PCB에 연결했습니다.
이제 공기질 모니터가 사실상 완성되었습니다. 이제 상자나 케이스를 만들어야 합니다. Altium Designer에서 전체 PCB 어셈블리의 3D 모델이 있으므로 CAD 소프트웨어로 가져와 케이스를 설계할 수 있습니다.
SOLIDWORKS로 두 부분과 몇 볼트/너트로 구성된 가장 단순한 케이스를 만들었습니다. PCB와 부품들이 드러나 보이는 게 마음에 들고 DIY 프로젝트를 자랑하기에도 좋은 투명 아크릴로 케이스를 만들기로 했습니다.
Thangs에서 이 DIY 공기질 모니터 3D 모델을 다운로드하거나 브라우저에서 탐색할 수 있습니다.
Thangs에서 3D 모델 다운로드.
공기질 모니터 케이스 만들기
사용할 아크릴은 4mm 두께로 디스플레이와 완벽하게 맞습니다. 현재 CNC 머신이 없어 심플한 금속 톱으로 수동으로 모양을 잘랐습니다.
디스플레이 개구부를 위해 먼저 드릴로 두 구멍을 뚫었습니다. 미니 톱날을 통과시켜 조심스럽게 모양을 잘라냈습니다. 심플한 줄로 모양을 다듬었습니다. 그런 다음 3mm 드릴로 PCB 고정과 두 아크릴 판 연결용 모든 구멍을 뚫었습니다.
이 시점에서 아크릴 보호 필름을 벗겼는데, 솔직히 꽤 만족스러운 과정입니다. PCB를 베이스 플레이트에 고정하기 위해 M3 볼트와 너트들을 사용했습니다. PM2.5 센서를 플레이트에 고정하기 위해 M2 볼트가 필요합니다.
다음으로 스페이서 너트들을 사용해 두 판을 결합했습니다. 암 스페이서 너트와 수 스페이서 너트 하나를 사용해 두 판 사이 원하는 거리를 쉽게 맞출 수 있었습니다.
이 케이스가 어떻게 나왔는지 개인적으로 정말 마음에 듭니다. 게다가 공기가 센서 주변으로 쉽게 순환할 수 있어 기능적입니다.
프로그래밍
자, 이제 장치에 전원을 공급하고 프로그램을 업로드할 수 있습니다. 미니 USB 커넥터로 공기질 모니터에 전원을 공급하며, 5V USB 어댑터, 5V 핸드폰 충전기, 보조배터리에서 5볼트를 얻을 수 있습니다.
아두이노 프로 미니 보드에 프로그램을 업로드하려면 프로그래밍 헤더에 연결할 USB-시리얼 UART 인터페이스가 필요합니다. 컴퓨터 USB에 연결하기 전에 먼저 장치 메인 전원을 켜야 합니다. 컴퓨터 USB에서 오는 전력은 500mA뿐이라 제대로 작동하기에 충분하지 않을 수 있기 때문입니다. 아두이노 스케치 업로드 시 PCB의 업로드 스위치도 켜야 합니다.
아두이노 코드와 넥시온 디스플레이 프로그램은 여기서 다운로드할 수 있습니다:
아두이노 프로 미니 보드에 스케치를 업로드하려면 아두이노 IDE에서 먼저 이 보드를 선택하고, 적절한 프로세서 버전을 선택하고, 포트를 선택하고, 프로그래밍 방식을 "USBasp"로 선택해야 합니다.
아두이노에 코드를 업로드한 후 넥시온 디스플레이에도 코드를 업로드해야 합니다. 넥시온 디스플레이는 내장 ARM 컨트롤러로 디스플레이를 자체적으로 제어합니다.
버튼, 텍스트, 이미지, 변수 등 모든 그래픽은 디스플레이 자체가 생성하고 제어합니다. 넥시온 디스플레이에는 이 모든 것을 만들 수 있는 전용 넥시온 에디터가 있습니다. 디스플레이와 아두이노는 시리얼 통신으로 단 두 선만으로 통신합니다. 아두이노는 센서 값들을 디스플레이로 보내고, 반대로 디스플레이는 필요할 때 아두이노로 데이터를 보냅니다.
디스플레이 프로그램 업로드를 위해 마이크로SD 카드가 필요합니다. 넥시온 에디터에서 출력된 .TFT 파일을 저장할 수 있습니다.
디스플레이에 카드 리더가 있어 전원이 꺼진 상태에서 마이크로SD 카드를 끼웁니다. 그런 다음 장치 전원을 켜면 프로그램이 디스플레이에 업로드됩니다. 이제 카드를 빼고 전원을 다시 켜면 공기질 모니터가 작동을 시작합니다.
코드 설명
각 센서용 라이브러리를 사용하며 다음 링크에서 찾을 수 있습니다: MHZ19, PMS, MQ131, DHT, DS3231. 각 센서에서 데이터를 어떻게 읽는지 더 잘 이해하려면 라이브러리 문서를 읽고 예제들을 실행해보는 것을 추천합니다.
MH-Z19와 PMS5003 센서 모두 시리얼 통신을 사용하므로 SoftwareSerial 라이브러리도 사용합니다. 아두이노와 넥시온 디스플레이도 시리얼 포트로 통신하는데, 이때는 기본 하드웨어 시리얼을 사용합니다.
아두이노가 센서들을 읽고 그 데이터를 넥시온 디스플레이로 보냅니다. 예시는 다음과 같습니다.
넥시온 디스플레이에 "tempV"라는 변수가 있고, 그 값을 업데이트하려면 "tempV.val=22" 같은 명령을 넥시온으로 보내야 합니다. 변수명, ".val", 값(예: 22) 순입니다. 코드 첫 두 줄이 이를 수행하고, 넥시온 디스플레이가 이 명령(사실상 모든 명령)을 받아들이려면 세 개의 고유한 "write" 명령을 보내야 합니다.
넥시온 디스플레이 프로그램에는 아두이노 코드 루프처럼 루프로 실행되는 타이머가 있어 디스플레이의 숫자들을 계속 업데이트합니다.
이 타이머 이벤트에는 각 센서 값에 따라 배경색을 변경하는 코드도 있습니다.
두 번째 페이지에는 아두이노에서 저장된 값들을 가져오는 파형이 있습니다. 아두이노 코드 자체에 주석으로 설명이 있으니 더 자세한 정보는 코드에서 확인할 수 있습니다.
시간과 Y축 값들도 아두이노에서 값을 가져옵니다.
파형 위와 메인 화면 숫자들 위에는 넥시온 에디터에서 "Hotspots"라고 불리는 투명한 객체들이 있는데, 이들은 버튼 역할을 합니다. 파형의 핫스팟을 누르면 Event 섹션에서 "page 0"으로 돌아가는 것을 볼 수 있습니다.
전반적으로 이 아두이노 공기질 모니터 프로그램이 이렇게 작동합니다. 물론 완전히 이해하려면 각 센서가 라이브러리와 어떻게 작동하는지, 넥시온 디스플레이가 어떻게 작동하는지 배우고 알아야 합니다.
VOC 센서의 경우 ppm이나 ppb 값이 아닌 이 센서로부터 로우 데이터만 읽습니다. 0~1024의 아날로그 값들입니다. 값이 높을수록 VOC 존재를 의미합니다.
오존 센서의 경우 더 정확한 출력을 위해 라이브러리 캘리브레이션 예제에 따라 setTimeToRead()와 setR0() 값을 올바르게 설정해야 합니다. 하지만 setTimeToRead가 길면 샘플링하는 동안 프로그램이 블록되어 다른 모든 것이 멈춥니다. 물론 이를 우회하는 방법들도 있습니다. 정말 필요하지 않다면 오존 센서는 사용하지 않는 것을 권장합니다.
이 영상을 즐기시고 새로운 것을 배우셨기를 바랍니다. 마음에 드셨다면 패트리온으로 지원해주세요. 아래 댓글 섹션에 자유롭게 질문해주시고 제 아두이노 프로젝트 모음도 확인해보세요.