Arduino 기반 실내 공기질 및 쾌적도 센서 키트
필요한 부품 및 소모품
| Arduino Nano R3 |
1개 |
| DHT11 온습도 센서 (3핀) |
1개 |
| 공기질 센서 (MQ135) |
1개 |
| 0.96" I2C OLED 디스플레이 |
1개 |
필요한 도구 및 기계
- 납땜 인두 (일반)
- 3D 프린터 (일반) - 선택 사항
앱 및 온라인 서비스
프로젝트 소개
좋은 잠을 자고 일어났는데도 몸이 무겁고 피곤하게 느껴진 적 있으신가요? 이는 밤새 밀폐된 방 안의 공기질이 나빠져서일 수 있습니다.
이 프로젝트는 저비용 공기질 모니터로, MQ135 공기질 센서를 사용하여 실내 공기질을 측정하고 DHT11 센서로 온도와 습도를 측정하여 OLED 디스플레이에 표시합니다. 재미있으면서도 실용적인 작은 프로젝트입니다.
배선
연결 방법:
- Arduino D2 → DHT11 OUT 핀
- Arduino A0 → MQ135 AO 핀
- Arduino A5 → OLED SCL 핀
- Arduino A4 → OLED SDA 핀
코딩
코드 실행을 위해 다음 라이브러리를 설치해야 합니다:
- Adafruit_SSD1306.h
- Adafruit_GFX.h
- DHT.h
코드에는 두 가지 주요 함수가 있습니다: sendSensor()와 air_sensor().
air_sensor() 함수는 공기질 센서에서 아날로그 값을 읽어(gasLevel = analogRead(sensor);) 해당 gasLevel에 따른 공기질 등급을 정의합니다. sendSensor() 함수는 dht 라이브러리로 온도와 습도 데이터를 측정하여 OLED에 표시합니다.
중요: MQ135 센서 보정
air_sensor() 함수에서 본인의 센서에 맞는 gasLevel 값으로 보정이 필요할 수 있습니다. MQ135 센서에 5V 전원을 공급하고 깨끗한 환경에서 최소 24시간 동안 예열(버닝)하세요. 이 과정은 센서가 출하 시 오염되어 있을 수 있기 때문에 필수적이며, 버닝을 통해 센서가 스스로 정화되어 더 정확한 결과를 제공합니다.
이후 센서를 회로에 연결하고 외부 공기가 좋은 곳으로 가서 본인 환경에 맞는 적절한 값을 튜닝하세요.
코드
Arduino 공기질 모니터
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeMonoOblique9pt7b.h>
#include <DHT.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define sensor A0
#define DHTPIN 2
#define DHTTYPE DHT11
int gasLevel = 0;
String quality = "";
DHT dht(DHTPIN, DHTTYPE);
void sendSensor() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
display.setTextColor(WHITE);
display.setTextSize(1);
display.setFont();
display.setCursor(0, 43);
display.println("Temp :");
display.setCursor(80, 43);
display.println(t);
display.setCursor(114, 43);
display.println("C");
display.setCursor(0, 56);
display.println("RH :");
display.setCursor(80, 56);
display.println(h);
display.setCursor(114, 56);
display.println("%");
}
void air_sensor() {
gasLevel = analogRead(sensor);
if(gasLevel < 181){
quality = " GOOD!";
} else if (gasLevel > 181 && gasLevel < 225){
quality = " Poor!";
} else if (gasLevel > 225 && gasLevel < 300){
quality = "Very bad!";
} else if (gasLevel > 300 && gasLevel < 350){
quality = "ur dead!";
} else{
quality = " Toxic";
}
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(1,5);
display.setFont();
display.println("Air Quality:");
display.setTextSize(1);
display.setCursor(20,23);
display.setFont(&FreeMonoOblique9pt7b);
display.println(quality);
}
void setup() {
Serial.begin(9600);
pinMode(sensor, INPUT);
dht.begin();
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c)) {
Serial.println(F("SSD1306 allocation failed"));
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(50, 0);
display.println("Air");
display.setTextSize(1);
display.setCursor(23, 20);
display.println("Quality monitor");
display.display();
delay(1200);
display.clearDisplay();
display.setTextSize(2);
display.setCursor(20, 20);
display.println("BY Abid");
display.display();
delay(1000);
display.clearDisplay();
}
void loop() {
display.clearDisplay();
air_sensor();
sendSensor();
display.display();
}
커스텀 파트 및 인클로저
프로젝트용으로 설계한 3D 인클로저입니다. 하지만 3D 프린터가 없어도 종이 상자 등 다양한 재료로 직접 인클로저를 만들 수 있습니다.
회로도
회로도 이미지 참조