#include <Stepper.h>
#include <Wire.h> // i2C 통신을 위한 라이브러리
#include <LiquidCrystal_I2C.h> // LCD 1602 I2C용 라이브러리
#include <DHT.h> // 온습도 센서 사용을 위한 라이브러리
#define DHTPIN A1 // 온습도 센서 핀 지정
#define DHTTYPE DHT11 // DHT 타입 지정
...
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);
}
...
...
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);}
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();
} // 문 열기
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 미만이므로 창문이 열린다.
( : 공기가 좋을 때 자동으로 문이 열림.)
LCD 화면에 온도, 습도, 현재 미세먼지 값을 보여준다.
성냥에 불을 붙이고 끌 때 나오는 연기로 미세먼지를 재현했다.
미세먼지 값이 100을 넘으면 문이 닫힌다.
( : 공기가 안좋을 때 자동으로 문이 닫힘. )
자세한 동작 과정은 영상에서 볼 수 있다.
미세먼지 스마트 창문 영상