CO2 농도 측정: 졸음 유발 배수 발견하기
부품 및 소모품
| 부품 | 수량 |
| 안디움 안두이노 와이파이 (Andium Anduino WiFi) | 1 |
| 아두이노 듀 (Arduino Due) | 1 |
| CO2 센서 (Cozir NDIR 타입) | 1 |
앱 및 온라인 서비스
프로젝트 소개
동기
오후 회의 중 졸음이 쏟아지거나 하품이 멈추지 않나요? 3시간 강의 중 졸고 있나요? 수면 부족 탓도 있지만, 실내 환기 불량으로 인한 고농도 이산화탄소(CO2)가 원인일 수 있습니다! 이 NDIR CO2 센서는 UART 시리얼 인터페이스로 정확한 CO2 농도 측정이 가능합니다. 기존 센서는 예열 시간과 전력 소모가 컸으나, 이 센서는 LED와 적외선 검출기를 사용해 3.3V, 평균 1.5mA 미만으로 동작합니다. 광학 분산 기술 등을 사용하며 Cozir 데이터시트 참조 바랍니다.
시작하기
필요한 것: 아두이노 듀/제로, 안두이노 와이파이 실드, Cozir CO2 센서, 점퍼 와이어 몇 개.
연결 간단: 센서 10핀 중 4개만 사용. 3.3V→3V3, GND→GND, Rx(DIO19)→Tx, Tx(DIO18)→Rx (UART 크로스 연결). DIO0/DIO1은 시리얼 모니터용으로 예약. Serial1 사용 (나머지 UART 3개 중 아무거나 가능).
주의: 센서는 3.3V TTL이므로 5V 시스템과 통신 시 로직 레벨 시프터 필수.
아두이노 없이 센서 테스트 시: PuTTY 등 시리얼 터미널로 9600 baud, 8N1, CR/LF 전송 설정 후 직접 명령 전송 가능.
센서 캘리브레이션
질소 가스(CO2 0ppm)로 제로 포인트 캘리브레이션이 최선이지만, 신선한 공기(약 450ppm)로도 충분히 정확. 실외에서 예제 스케치의 calibrateFreshAir() 주석 해제 후 실행. 'G' 명령 전송으로 캘리브레이션 수행. NYC 14층 실외 공기도 기준점으로 사용 가능 (실내 임계값은 1000ppm 단위이므로 오차 허용).
클라우드에 CO2 데이터 발행 (Adafruit IO)
Adafruit IO 연동 예제 스케치 제공. WiFi 연결, MQTT로 Adafruit IO 접속, 1분마다 CO2 농도 읽어 피드 발행. LCD에 현재/이전 값 표시. Anduino 라이브러리 필요 (GitHub 참조).
마무리
이 센서는 매우 민감해 환기 잘 되는 방에서도 인원 수에 따른 CO2 농도 변화 추적 가능. "미분방정식 때문이 아니라 환기 때문이야!"라며 교수님께 증명해보세요. 수업을 해변으로 옮길 때입니다!
코드
초기 테스트 스케치 (캘리브레이션 포함)
char buffer[20] = {0}; int c = 0;
void setup() {
Serial.begin(9600); while(!Serial){};
Serial1.begin(9600); while(!Serial1){};
Serial.println("Begin reading CO2 Levels");
// setOperatingMode(CZR_STREAMING);
// setOperatingMode(CZR_POLLING);
// calibrateFreshAir();
}
void loop() {
delay(10000);
c = Request("Z");
Serial.print("CO2 : "); Serial.println(c); Serial.println("");
}
int Request(char* s) {
buffer[0] = '\0'; int idx = 0;
Command(s); delay(250);
while(Serial1.available()) buffer[idx++] = Serial1.read();
buffer[idx] = '\0';
uint16_t rv = 0;
switch(buffer[1]) {
case 'T': rv = atoi(&buffer[5]); if (buffer[4] == 1) rv += 1000; break;
default: rv = atoi(&buffer[2]); break;
}
return rv;
}
void Command(char* s) { Serial1.print(s); Serial1.print("\r\n"); }
uint16_t calibrateFreshAir() { return Request("G"); }
void setOperatingMode(uint8_t mode) { sprintf(buffer, "K %u", mode); Command(buffer); }
Adafruit IO 발행 스케치 (일부)
#include
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include "AnduinoLCD.h"
// WiFi, Adafruit IO 설정 상수 정의...
// loop()에서 1분마다 Request("Z")로 CO2 읽고 carbonDioxide.publish()로 발행
// LCD에 현재/이전 값 표시 (displayCo2 함수)
// WiFi/Adafruit 연결 함수, Request/Command/calibrateFreshAir/setOperatingMode 함수 포함
라이브러리
Anduino: 안디움(안두이노) 실드용 아두이노 라이브러리. 아두이노를 안디움 노드로 변환. https://github.com/andium/Anduino