과거 대학생 때 캡스톤 과제로 친구들과 조를 이뤄 진행했었던 기록이 있어 새로이 정리해 보니 기억이 새록새록 나네요.
이때 당시가 17년도였나..
아두이노를 이용하여 어떤걸 만들까 고민에 고민을 하던 차에,
실내 환경에 따라 환기를 위해 창문이 자동개폐가 되었으면 좋겠다는 아이디어로 결정이 났어요.
그럼 만들어봅시다 !
재료는 이 정도가 들었던 것 같네요.
재료 | 개수 |
아두이노 | 1EA |
NEMA 17 스테핑모터 | 1EA |
L29N 스테핑모터 아두이노 드라이버 | 1EA |
과학상자 톱니바퀴와 톱니레일 | 1EA |
아크릴판(큰사이즈) | 1EA |
우드락(큰사이즈) | 2EA |
하드보드지(큰사이즈) | 1EA |
아크릴 칼/본드/테이프 등 | 각 1EA |
센서 (온도/우적/가스) | 각 1EA |
아크릴 판을 창문 유리로 놓고, 아크릴 판 주위를 우드락 창 틀로 감싸서 아래처럼 수제작을 진행했어요.
그리고, 모터와 톱니바퀴를 이용해 창문이 열리고 닫힐 수 있도록 모터 레일을 연결했습니다.
모터의 회전 세기에 따라 창문에 힘을 받아서 움직일 수 있기 때문에,
창문과 창문틀 전체를 고정시킬 수 있도록 전체를 우드락으로 한번 더 감쌌어요!
과거 자료라 회로도에 대한 부분은 남아있는 게 없지만, 회로도 연결에 크게 어려운 부분은 없었던 걸로 기억해요.
연결되어 있는 센서의 저항 부분만 신경 써주셔서 연결해 주시면 무리 없이 동작하실 거예요.
다시 한번 우드락으로 전체를 감싸고 창문 아래 하드보드지를 통해 그 안에 아두이노와 연결된 센서들을 안 보이게끔 깔끔하게 넣어놓았고, 창문이 움직일 수 있게끔 모터 연결과 온/습도, 우적 센서를 창문에 연결하였습니다.
그럼 아래 자동창문개폐시스템의 프로토타입 결과를 보시죠.
- 이와이제
#include <Stepper.h>
const int TMP36_pin = A1; //온도
const int stepsPerRevolution = 200; //회전수 200/한바퀴
Stepper myStepper(stepsPerRevolution, 3, 4, 6, 7);
int ENA=8;
int ENB=5;
int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int ondo1 = 32;
int ondo2 = 30;
int gas1 = 400;
int gas2 = 200;
boolean window = false; //false -> 닫혀있는상태
//true -> 열려있는상태
const int gasPin = A0; // 가스
void setup()
{
myStepper.setSpeed(60);
Serial.begin(9600);
pinMode(enablePin, OUTPUT);
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
pinMode(ENA,OUTPUT); //
pinMode(ENB,OUTPUT);//
pinMode(2, INPUT);
digitalWrite(ENA,HIGH);//
digitalWrite(ENB,HIGH);//
}
void loop()
{
int sensorValue = analogRead(TMP36_pin);
float mVoltage = sensorValue * 5000.0/1024.0;
float temperatureC = (mVoltage - 500) / 10.0;
int value = digitalRead(2);
Serial.print("Now : ");
Serial.print(temperatureC);
Serial.println(" C");
Serial.println();
Serial.print("current gas : ");
Serial.println(analogRead(gasPin));
Serial.println();
Serial.print("Rain : ");
Serial.println(value);
Serial.print("Window : ");
if(window==false) Serial.println("Close");
else if(window==true) Serial.println("Open");
Serial.println("=============================================== ");
Serial.println();
if(window == false && value==1) //창문이 닫혀있고 비가 안오는 상태
{
if(temperatureC<=ondo2 && analogRead(gasPin)>=gas1)
{
sensor_open();
}
else if(temperatureC>=ondo1 && analogRead(gasPin)>=gas1)
{
sensor_open();
}
else if(temperatureC<=ondo2 && analogRead(gasPin)<=gas2)
{
// 동작안함
}
else if(temperatureC>=ondo1 && analogRead(gasPin)<=gas2)
{
sensor_open();
}
}
else if(window == false && value==0) //창문이 닫혀있고 비가 오는 상태
{
if(temperatureC<=ondo2 && analogRead(gasPin)>=gas1)
{
sensor_open();
}
else if(temperatureC>=ondo1 && analogRead(gasPin)>=gas1)
{
sensor_open();
}
else if(temperatureC<=ondo2 && analogRead(gasPin)<=gas2)
{
// 동작안함
}
else if(temperatureC>=ondo1 && analogRead(gasPin)<=gas2)
{
//동작안함
}
else
{
//동작안함
}
}
else if(window == true && value==1) //창문이열려있고 비가 안오는 상태
{
if(temperatureC<=ondo2 && analogRead(gasPin)>=gas1)
{
//동작안함
}
else if(temperatureC>=ondo1 && analogRead(gasPin)>=gas1)
{
//동작안함
}
else if(temperatureC<=ondo2 && analogRead(gasPin)<=gas2)
{
sensor_close();
}
else if(temperatureC>=ondo1 && analogRead(gasPin)<=gas2)
{
//동작안함
}
}
else if(window == true && value==0) //창문이열려있고 비가 오는 상태
{
if(temperatureC<=ondo2 && analogRead(gasPin)>=gas1)
{
//동작안함
}
else if(temperatureC>=ondo1 && analogRead(gasPin)>=gas1)
{
//동작안함
}
else if(temperatureC<=ondo2 && analogRead(gasPin)<=gas2)
{
sensor_close();
}
else if(temperatureC>=ondo1 && analogRead(gasPin)<=gas2)
{
sensor_close();
}
else
{
sensor_close();
}
}
delay(5000);
}
void sensor_open(){
Serial.println("open");
myStepper.step(stepsPerRevolution);
Serial.println("stop");
window = true;
Serial.print("Window Status : ");
Serial.println(window);
Serial.println();
}
void sensor_close()
{
Serial.println("Close");
myStepper.step(-stepsPerRevolution);
window = false;
Serial.print("Window Status : ");
Serial.println(window);
Serial.println();
}