[Arduino] 미세먼지 측정과 자동 창문 제어 - 결과

Doodung·2021년 8월 23일
0
post-thumbnail

코드

1. 초기설정

#include <Stepper.h>
#include <Wire.h> // i2C 통신을 위한 라이브러리
#include <LiquidCrystal_I2C.h> // LCD 1602 I2C용 라이브러리
#include <DHT.h> // 온습도 센서 사용을 위한 라이브러리
#define DHTPIN A1 // 온습도 센서 핀 지정
#define DHTTYPE DHT11 // DHT 타입 지정
...

2. 루프

void loop(){
digitalWrite(sensor_led, LOW); // LED 켜기
delayMicroseconds(sampling); // 샘플링해주는 시간.
int count=0;
dust_value = analogRead(dust_sensor); // 센서 값 읽어오기
delayMicroseconds(waiting); // 너무 많은 데이터 입력을 피해주기 위해 잠시 멈춰주는 시간.
digitalWrite(sensor_led, HIGH); // LED 끄기
delayMicroseconds(stop_time); // LED 끄고 대기
recent_dust = (0.17 * (dust_value * (5.0 / 1024)) - 0.1) * 1000; // 미세먼지 값 계산
five_dust[4] = recent_dust; // 새로운 미세먼지 값 입력
total_dust = five_dust[4]; // 5개의 미세먼지 값을 저장할 변수

for(int i=0; i<4; i++)
{
total_dust += five_dust[i];
five_dust[i] = five_dust[i+1]; // 0~4번째까지 미세먼지 값 저장을 위해 4번째 배열 비워주기
}

if(five_dust[0] != 0)
{
dustDensityug = total_dust / 5;
Serial.print("Dust Density [ug/m^3]: "); // 시리얼 모니터에 미세먼지 값 출력
Serial.println(dustDensityug);
}

...

3. 창문 개폐 조건

...
if(dustDensityug <= 30.0) // 대기 중 미세먼지가 좋음 일때 파란색 출력
light(0, 0, 255);
else if(30.0 < dustDensityug && dustDensityug <= 80.0) // 대기 중 미세먼지가 보통 일때 녹색 출력
light(0, 255, 0);
else if (80.0 < dustDensityug && dustDensityug <= 150.0) // 대기 중 미세먼지가 나쁨 일때 노란색 출력
light(255, 80, 1);
else // 대기 중 미세먼지가 매우 나쁨 일때 빨간색 출력
light(255, 0, 0);
if(window == false && dustDensityug<100) //창문이 닫혀있고 미세먼지 좋은 상태
{sensor_open();}
else if(window == false && dustDensityug>=100) //창문이 닫혀있고 미세먼지 안 좋은 상태
{}
else if(window == true && dustDensityug<100) //창문이열려있고 미세먼지 좋은 상태
{}
else if(window == true && dustDensityug>=100) //창문이열려있고 미세먼지 안 좋은 상태
{sensor_close();}
delay(500);}

4. 창문 오픈 함수 (모터 시계 방향 회전)

void sensor_open(){
Serial.println("open");
int i;
i = 1;
while(i<=3)
{myStepper.step(stepsPerRevolution); // 시계 반대 방향으로 회전
i++;}
Serial.println("stop");
window = true;
Serial.print("Window Status : ");
Serial.println(window);
Serial.println();
} // 문 열기

5. 창문 클로즈 함수 (모터 시계 반대방향 회전)

void sensor_close()
{
Serial.println("Close");
int i;
i = 1;
while(i<=3){myStepper.step(-stepsPerRevolution); // 시계 방향으로 회전
i++;} 
window = false;
Serial.print("Window Status : ");
Serial.println(window);
Serial.println();
}// 문 닫기
...

최종 결과 사진, 영상

미세먼지 값 100 미만. 창문이 열리고 있는 상태

초기 설정값은 창문이 닫힌 상태다. 측정된 미세먼지 농도는 100 미만이므로 창문이 열린다.
( : 공기가 좋을 때 자동으로 문이 열림.)
LCD 화면에 온도, 습도, 현재 미세먼지 값을 보여준다.

미세먼지 값이 100을 넘어 문이 닫히고 있는 상태

성냥에 불을 붙이고 끌 때 나오는 연기로 미세먼지를 재현했다.
미세먼지 값이 100을 넘으면 문이 닫힌다.
( : 공기가 안좋을 때 자동으로 문이 닫힘. )

문이 완전히 닫힌 상태 -> 이후에 미세먼지 농도가 좋아지면 다시 자동으로 열린다.

자세한 동작 과정은 영상에서 볼 수 있다.
미세먼지 스마트 창문 영상


보완점 및 향후 계획

1. 보완할 점

  • 더 좋은 미세먼지 측정기를 사용하여 미세먼지 값을 바로 읽어 들일 수 있도록 한다.
  • 미세먼지 측정기의 회로 중 한 개의 연결 불량으로 평상시 상태 (미세먼지 좋음 일 때)일 때 측정 값의 오류가 발생했다. 이후에 이를 보완해야 한다.

2. 향후 계획

  • 앱인벤터로 블루투스를 통한 창문 수동 제어 어플리케이션 제작을 한다.
  • 미세먼지뿐만 아니라 초미세먼지 측정도 가능하게 기능을 추가시킨다.
  • 습도 측정으로 비가 오는 날에 창문을 자동으로 닫게끔 기능을 추가시킨다.
profile
반가워요!

0개의 댓글