에어 서퍼: 아두이노 메가 2560 기반 DIY 공기질 모니터링 시스템
부품 및 소모품
| 아두이노 메가 2560 | ×1 |
| 3.2인치 TFT 실드 (메가 2560 직결형) | ×1 |
| MH-Z19 CO2 센서 (UART/PWM) | ×1 |
| SI7021 온습도 센서 (I2C) | ×1 |
| DS18B20 방수 온도 센서 (외부용) | ×1 |
| DS1307 RTC 모듈 (I2C) | ×1 |
| LM2596 DC-DC 강압 모듈 (가변 전압) | ×1 |
| 항공 커넥터 GX12-3핀 (외부 센서용) | ×1 |
| 스테인리스 버튼 3개 (LED 내장), 포토레지스터, LED 3개 (CO2 상태 표시) | 각종 |
앱 및 온라인 서비스
프로젝트 배경
토목 엔지니어로서 환기 시스템의 중요성을 잘 알고 있습니다. 기존 CO2 모니터는 온도만 표시되어 아쉬웠고, 고가 장비는 부담되어 직접 제작했습니다. 아두이노로 펌프 스테이션 제어 경험이 있어 자신있게 도전했습니다.
베이스 하드웨어
10인치 대형 화면은 예산 초과라 3.2인치 TFT(480x320)를 메가 2560에 직결했습니다. 배선이 간편하지만 저가 디스플레이는 색상 반전, 백색 점 등 문제가 있어 코드에서 색상 보정과 정오/자정 화면 새로고침으로 대응했습니다.
센서 구성
MH-Z19 CO2 센서 (가장 비쌈, 약 $20)
저가형 중 신뢰성 높고 자동 보정 기능 내장. 24시간 후 외부 공기(400ppm) 기준으로 자가 보정됩니다. UART 통신 사용.
SI7021 실내 온습도 센서
I2C 인터페이스, 산업용 고정밀, 트러블 없이 잘 작동.
DS18B20 외부 온도 센서
스테인리스 캡슐 타입, 1-Wire 통신, 4.7kΩ 풀업 저항 필수.
DS1307 RTC
I2C로 시간 유지. 배터리 백업으로 전원 차단 시에도 시간 보존.
표시 및 인터페이스
- CO2 농도별 LED: 녹색(400-800ppm), 주황(800-1200ppm), 적색(1200ppm 이상)
- 버튼 3개: 좌(시 설정), 중(분 설정), 우(텍스트 색상 변경)
- 포토레지스터: 주변 밝기에 따라 버튼/상태 LED 밝기 자동 조절
전원 회로
19V/15V 어댑터만 있어 LM2596으로 7V로 강압해 아두이노에 공급. 12V 직결 시 발열 심해 7V로 낮추니 안정적.
외부 온도 센서는 항공 커넥터와 전화선으로 연장.
케이스 제작기
3D 프린터 없이 폴리머 클레이 → 6mm 합판(전동 톱 필요) → 3mm 합판(커터칼로 절단 가능)으로 시행착오 끝에 완성. 아크릴 페인트 도색으로 마감.
비용 내역 (약 $55.5 / 31,550원)
| 아두이노 메가 2560 | $8.27 |
| TFT 3.2" | $8.00 |
| MH-Z19 CO2 | $20.00 |
| SI7021 | $2.00 |
| DS18B20 캡슐 | $1.14 |
| RTC DS1307 | $0.55 |
| 기타 (버튼, 커넥터, 전원, 합판 등) | $15.55 |
전체 코드
주요 라이브러리: UTFT, RTClib, SparkFunHTU21D, OneWire, DallasTemperature, SoftwareSerial
#include <Wire.h>
#include <RTClib.h>
#include <SoftwareSerial.h>
#include <SparkFunHTU21D.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <UTFT.h>
#define ONE_WIRE_BUS 9
#define GREENLED 5
#define YELLOWLED 7
#define REDLED 8
#define BUTTONLED 11
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
UTFT myGLCD(CTE32HR, 38, 39, 40, 41); // TFT 핀 설정
HTU21D myHumidity;
RTC_DS1307 rtc;
byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; // MH-Z19 읽기 명령
unsigned char response[9];
unsigned int ppm = 0;
unsigned long time = 0;
int photocellReading = 0;
int hourupg = 0, minupg = 0;
float humd = 0, temp = 0;
int tcolor = 0;
int Z = 0; // LED 밝기
boolean Reset = false;
void setup() {
myGLCD.InitLCD();
myGLCD.clrScr();
myGLCD.fillScr(VGA_WHITE); // 색상 반전 보정
myGLCD.setBackColor(VGA_WHITE);
Serial3.begin(9600); // MH-Z19용 UART
sensors.begin();
myHumidity.begin();
rtc.begin();
pinMode(GREENLED, OUTPUT);
pinMode(YELLOWLED, OUTPUT);
pinMode(REDLED, OUTPUT);
pinMode(BUTTONLED, OUTPUT);
pinMode(2, INPUT_PULLUP); // 시 버튼
pinMode(3, INPUT_PULLUP); // 분 버튼
pinMode(4, INPUT_PULLUP); // 색상 버튼
Z = 0;
}
void loop() {
co2(); // CO2 읽기
photosensor(); // 조도 읽기 & LED 밝기 조절
dateandtime(); // 시간 설정 버튼 처리
th(); // 온습도 읽기
if (digitalRead(4) == LOW) { tcolor++; if (tcolor >= 13) tcolor = 0; }
drawmain(); // 화면 그리기
lamps(); // 상태 LED 제어
screenreset(); // 정오/자정 화면 새로고침
}
// 주요 함수들: co2(), th(), photosensor(), drawmain(), lamps(), dateandtime(), screenreset()
// 코드 전문은 원본 참조 (MH-Z19 CRC 체크, UTFT 그래픽 그리기 등 포함)
회로도
요약
CO2, 실내/외 온도, 습도, 시간을 한 화면에 표시하는 실용적인 공기질 모니터. 저가 부품으로 고가 상용 제품 수준의 기능을 구현했습니다. 3D 프린터 없이도 합판과 커터칼로 케이스 제작 가능.