2015년 2학기 아두이노 프로젝트 - 자동문
포스트
취소

2015년 2학기 아두이노 프로젝트 - 자동문

#include <LiquidCrystal.h> 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //LCD Key Shield의 pin 설정
int lcd_key = 0;
int adc_key_in = 0;
#define DC_N 13 //DC Motor의 pin 설정
#define DC_P 12
#define DC_En 11
#define PSD A1 //PSD Sensor
#define CDS A5 //CdS Sensor
#define LED 22 //LED
#define SWITCH 23 //스위치


int distance = 15; 
//15cm 이하의 거리에 물체가 접근하면 PSD Sensor로 문을 개폐

void setup()
{
 lcd.begin(16, 2); // LCD Key Shield의 행수, 열수 지정 
 pinMode(10,OUTPUT); // 백라이트
 digitalWrite(10, 1);
 Serial.begin(9600); //시리얼 모니터로 거리값을 출력
 pinMode(DC_N, OUTPUT); //Setting OUTPUT mode
 pinMode(DC_P, OUTPUT); //Setting OUTPUT mode
 pinMode(DC_En, OUTPUT); //Setting OUTPUT mode 
 pinMode(CDS, INPUT);
 pinMode(LED, OUTPUT);
 pinMode(SWITCH, INPUT_PULLUP);
 IdleScreen();
}

void loop() 
{
 float Dist = 0;
 float Read = 0;

 Read = ((float)analogRead(PSD))*5/1023;
 Dist = 1/(Read * 0.0434 - 0.0046);

 if(Dist > 80)
 Dist = 80; //Max.Distance
 if(Dist < 15)
 Dist = 15; //Min.Distance
 Serial.print("Distance : ");
 Serial.println(Dist);
 
 if(digitalRead(SWITCH)==0) //수동개폐
 {
 OpenDoor();
 }
 else if(Dist<=distance) //센서 인식
 {
 OpenDoor();
 }
 else
 {
 MotorStop();
 }
}

void Direction_rotation(int Mode, int Speed)
{
 if(Mode)
 {
 digitalWrite(DC_N, LOW);
 digitalWrite(DC_P, HIGH);
 analogWrite(DC_En, Speed); //Motor Speed
 }
 else
 {
 digitalWrite(DC_N, HIGH);
 digitalWrite(DC_P, LOW);
 analogWrite(DC_En, Speed); //Motor Speed
 }
}
void MotorStop()
{
 digitalWrite(DC_N, HIGH);
 digitalWrite(DC_P, HIGH);
}
void NameScreen()
{
 lcd.clear();
 lcd.setCursor(0,0); 
 lcd.print("JNUECE 151807");
}
void IdleScreen() //아무 동작도 없을 시 LCD Key Shield 에 표시할 적절한 대기 화면
{ 
 lcd.clear();
 lcd.setCursor(0,0); 
 lcd.print("Automatic Door");
 lcd.setCursor(0,1);
 lcd.print("JNUECE 151807");
}
void DeveloperInfo() 
{
 lcd.clear();
 lcd.setCursor(0,0); 
 lcd.print("Jung Hoe Hyeong");
 lcd.setCursor(0,1);
 lcd.print("commania.kr");
}
void LightOn()
{
 if(analogRead(CDS)>=330)
 digitalWrite(LED, LOW);
 else
 digitalWrite(LED, HIGH);
 delay(100);
}
void OpenDoor() //문 열기
 {
 LightOn();
 NameScreen();
 Direction_rotation(1, 70);
 lcd.setCursor(0,1); 
 lcd.print("Door Opened"); 
 delay(1000);
 MotorStop();
 delay(5000);
 Direction_rotation(0, 70);
 lcd.setCursor(0,1);
 lcd.print("Door Closed"); 
 delay(1000);
 MotorStop();
 delay(2000);
 DeveloperInfo();
 delay(2000);
 IdleScreen();
 digitalWrite(LED, LOW);
 }

long Distance(long time, int flag){
 long distance;
 if(flag)
 distance = time / 29 / 2;
 else
 distance = time / 74 / 2;
 return distance;
}
This post is licensed under CC BY 4.0 by the author.

아두이노 리눅스에서 사용하기

ZOTAC ZBOX ID83 + 해킨토시, 핵미니 만들기 프로젝트

Comments powered by Disqus.