Transcript PPT

유비쿼터스컴퓨팅및실습
SNS를 활용한 스마트 도어 시스템
TermProject Final Report
실습3조
Team : knocking on heaven’s door
CONTENTS
과제개요
개발 산출물 및 메뉴얼
아두이노 적재 코드
개발 기간 및 일정
업무분담 및 팀원별 소감
과제개요
“SNS를 활용한 스마트 도어 시스템”
아두이노를 통해 노크 패턴으로 문을 제어하고,
웹을 통해 원격지에서도 문을 모니터링 및 제어할 수 있다.
기술개발 산출물 및 메뉴얼
 노크 패턴 저장 기능
 노크 패턴 인식 기능
 알림 기능
 웹을 통한 관리 기능
기술개발 산출물 및 메뉴얼
■ 노크 패턴 저장 기능
 주인이 문에게 노크 패턴을 기억 시킨다.
 버튼을 누르는 동시에 저장 하고자 하는 패턴으로 문을 두드린다.
 정상적으로 패턴이 저장되면 LED가 번갈아 가며 깜박거린다.
기술개발 산출물 및 메뉴얼
■ 노크 패턴 인식 기능
 노크 패턴을 인식한다.
 저장해둔 패턴과 일치하면 빨간색 LED가 점등된다.
 저장해둔 패턴과 불일치하면 노란색 LED가 점등된다.
기술개발 산출물 및 메뉴얼
■ 노크 패턴 인식 기능
 노크 패턴을 인식해 문을 열고 닫는다.
 저장해둔 패턴과 일치하면 문고리가 작동한다.
 저장해둔 패턴과 불일치하면 문고리가 작동하지 않는다.
기술개발 산출물 및 메뉴얼
■ 관리 기능
 관리 웹페이지를 통해 문을 열고 닫을 수 있다.
 Open 버튼을 통해 제어
 아래 상태를 통해 방문자 유 무를 알 수 있다.
기술개발 산출물 및 메뉴얼
■ 알람 기능 – 일치 시에
 노크 패턴이 일치할 시에 문이 열린다.
 문이 열릴 시에 상태창에 ‘주인님 어서오세요!’ 라는 메시지가 뜬다.
기술개발 산출물 및 메뉴얼
■ 알람 기능 – 불일치 시에
 노크 패턴이 불일치할 시에 문이 열리지 않는다.
 노크 패턴이 틀릴 경우 문은 주인의 웹에 누군가 문을 두드린다고 알림.
아두이노 적재코드
■ 웹 설계 부분
get 방식으로 보내온 값 L이 1이라면 도어를 여는 부분
if(readString.indexOf("L=1")!=-1) {
Serial.println("==> L is 1");
triggerDoorUnlock();
} else {}
 노크 패턴이 일치하거나 웹을 통해 문을 열어줄 경우 L값이 1이 된다.
 L값이 1이 될 경우 triggerDoorUnlock()을 실행시킨다.
아두이노 적재코드
■ 웹 설계 부분
웹에 접속시 클라이언트에게 보여줄 부분
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head><title>Smart Door System</title></head>");
client.println("<body background='http://210.118.64.151:8080/TJSSMSite/img/ubbg.png'>");
client.println("<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>");
client.println("<form method='get' name='LED' action='/'>");
client.println("<input type=checkbox name=L value=1> OPEN<br>");
client.println("<input type=submit value=확인></form>");
client.println("<br />");
client.println("<div id='mentBox'></div>");
client.println("<script src='http://code.jquery.com/jquery-latest.js' type='text/javascript'></script>");
client.println("<script type='text/javascript'>");
client.println("function myajax() {");
 HTML 구조 부분 소스 코드
아두이노 적재코드
■ 웹 설계 부분
웹에 접속시 클라이언트에게 보여줄 부분
if(polling==1) {
client.println("$('#mentBox').html('<h3>주인님 어서오세요!</h3>');");
polling = 2;
} else if(polling == 0){
client.println("$('#mentBox').html('<h3>똑똑똑! 손님이 왔습니다! 문을
여시겠습니까?</h3>');");
polling = 2;
} else{
client.println("$('#mentBox').html('<h3>No knock</h3>');");
}
 Polling 변수를 이용하여 패턴 일치에 따라 나오는 메시지를 설정.
 Polling 변수는 일치 할 경우 1, 불일치일 경우 0, 아무것도 아닌 경우 2로 설정
아두이노 적재코드
■ 아두이노 부분
동작 구현부분
knockSensorValue = analogRead(knockSensor);
if(digitalRead(programSwitch) == HIGH){
programButtonPressed = true;
digitalWrite(redLED,HIGH);
}
else {
programButtonPressed = false;
digitalWrite(redLED, LOW);
}
if(knockSensorValue >= threshold){
listenToSecretKnock();
}
 센서의 값을 읽어 스위치가 눌리면 빨간 LED를 켜주고 빨간 LED가 켜져 있지 않으면 꺼준다.
 이 센서의 범위가 3값 이상이면 listenToSecretKnock() 함수를 실행시켜준다.
아두이노 적재코드
■ 아두이노 부분
listenToSecretKnock()
void listenToSecretKnock(){
Serial.println("Knock Starting");
int i = 0;
for(i = 0; i < maximumKnocks; i++){
knockReadings[i] = 0;
}
int currentKnockNumber = 0;
int startTime = millis();
int now = millis();
digitalWrite(greenLED, LOW);
if(programButtonPressed == true){
digitalWrite(redLED, LOW);
}
delay(knockFadeTime);
digitalWrite(greenLED, HIGH);
if(programButtonPressed == true){
digitalWrite(redLED, HIGH);
}
do {
knockSensorValue =
analogRead(knockSensor);
if (knockSensorValue >= threshold){
Serial.println("knock");
now = millis();
knockReadings[currentKnockNumber]
= now - startTime;
currentKnockNumber++;
startTime = now;
digitalWrite(greenLED, LOW);
if(programButtonPressed == true){
digitalWrite(redLED, LOW);
}
delay(knockFadeTime);
digitalWrite(greenLED, HIGH);
if (programButtonPressed == true){
digitalWrite(redLED, HIGH);
}}
now = millis();
}
while((now-startTime < knockComplete)
&& (currentKnockNumber
< maximumKnocks));
if (programButtonPressed==false){
if (validateKnock() == true){
polling = 1;
triggerDoorUnlock();
} else {
Serial.println("Secret knock failed.");
<중략>
polling = 0;
}
} else validateKnock();
Serial.println("New lock stored.");
<중략>
}
}
}
 노크가 시작되고 노크되는 시간차를 이용하여 패턴을 배열에 저장
 비밀번호가 유효하다면 문을 열어주고 유효하지 않다면 문을 열어주지 않는다.
 단계별로 LED를 통해서 정상 작동 되는지 확인 할 수 있다. (중략부분)
아두이노 적재코드
■ 아두이노 부분
TriggerDoorUnlock
void triggerDoorUnlock(){
Serial.println("Door unlocked!");
int i=0;
digitalWrite(lockMotor, HIGH);
digitalWrite(greenLED, HIGH); // And the green LED too.
delay (lockTurnTime); // Wait a bit.
digitalWrite(lockMotor, LOW); // Turn the motor off.
// Blink the green LED a few times for more visual feedback.
for (i=0; i < 5; i++){
digitalWrite(greenLED, LOW);
delay(100);
digitalWrite(greenLED, HIGH);
delay(100);
}<중략>
 비밀번호가 맞을 시에 문을 열어주는 함수이다.
아두이노 적재코드
■ 아두이노 부분
validateKnock()
boolean validateKnock(){
<중략>
for (i=0;i<maximumKnocks;i++){
if (knockReadings[i] > 0){
currentKnockCount++;}
if (secretCode[i] > 0){
secretKnockCount++;
}
if (knockReadings[i] >
maxKnockInterval){
maxKnockInterval = knockReadings[i];
}}
if (programButtonPressed==true){
for (i=0;i<maximumKnocks;i++){
secretCode[i]= map(knockReadings[i],0,
maxKnockInterval, 0, 100);
}
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
delay(1000);
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, HIGH);
delay(50);
for (i = 0; i < maximumKnocks ; i++){
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
if (secretCode[i] > 0){
delay( map(secretCode[i],0, 100, 0,
maxKnockInterval));
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, HIGH);
}
delay(50);
}
return false;
}
if (currentKnockCount !=
secretKnockCount){
return false;
}
 비밀번호가 유효한지 판단하는 함수
 각 노크 노드의 시간을 정하여 유효시간을 결정
 이를 통해서 노크의 패턴을 확인한다.
int totaltimeDifferences=0;
int timeDiff=0;
for (i=0;i<maximumKnocks;i++){ //
Normalize the times
knockReadings[i]=
map(knockReadings[i],0,
maxKnockInterval, 0, 100);
timeDiff = abs(knockReadings[i]secretCode[i]);
if (timeDiff > rejectValue){ //
Individual value too far out of whack
return false;
}
totaltimeDifferences += timeDiff;
}
if
(totaltimeDifferences/secretKnockCo
unt>averageRejectValue){
return false;
}
개발 기간 및 일정
일시
내용
1주차 (5/13 ~ 19)
아이디어 회의 및 주제 선정
2주차 (5/20 ~ 26)
아두이노 회로 설계 및 하드웨어 구성
3주차 (5/27 ~ 6/2)
하드웨어 프로그래밍
4주차 (6/3 ~ 9)
SNS 연동 및 프로그래밍
5주차 (~6/17)
테스트 및 시연준비 (최종 마무리)
업무분담
서버 & 연동
이지은
최재건
송용권
정찬희
아두이노 & 기구제작
팀원별 소감
성명
내용
정찬희
늘 소프트웨어만 제작하던 컴퓨터 공학부라는 특성에서 벗어나 직접적으로 움직이고
사용될 법한 것을 만들게 되어 감회가 새로웠습니다. 수업 중에 배운 것을 통해 직접
무엇을 만든다는 것에 보람을 느꼈고 동시에 하드웨어 적인 부분들이 쉬운 것이 아님을
알게 되었습니다. 또한 수업 중에 배운 것만으로 만드는 것들이 실생활에 사용 될 수
있다는 것이 이제 곧 취업 문을 두드릴 상황에 있어서 자신감을 가지게 하는 계기가 되어
기쁩니다. 모쪼록 너무 고생한 우리 조원들에게 감사의 말씀을 드리고 싶습니다.
최재건
유비쿼터스를 배우면서 센서네트워크에 흥미를 가지게 되었습니다. 마이크로프로세서에
관심이 많아 아드이노를 배우기 위해 이 수업을 들었습니다. 텀프로젝트를 하기 시작하였
고 문을 열기위해 아두이노 킷에 있는 피에조 부저를 이용하여 노크를 받아들였고, 이에
따라서 패턴도 바꾸고 시간 차이를 가지고 패턴을 만들 수 있는 것에 깨달았고, 웹 부분에
서는 아직 미숙한 점이 많았기에 배우는게 더많은 텀프로젝트 이었던 것 같습니다. 앞으로
도 더 많은 아이디어를 활용하여 개발할 수 있었으면 좋겠습니다.
송용권
유비쿼터스 과목을 통해 처음 접해본 아두이노를 이용하여 프로젝트를 진행하게 된것이
흥미로웠습니다. 노크를 통해 문을 열 수 있는 “문”을 만드는 주제를 설정하고 나서 과연
할 수 있을까? 하는 걱정을 많이 했지만 ‘아두이노’라는 도구와 팀원간의 협력으로 프로젝
트를 진행해 나갔습니다. 비록 처음 생각했던 것처럼 Web부분이 완벽하게 완성되지 않았
지만 만족할 만한 결과를 만들어 내어 성취감을 느꼈습니다.
이지은
먼저 유비쿼터스 과목을 통하여 아두이노를 접하고, 프로젝트를 진행할 수 있어서 기뻤습
니다. 평소 웹에 관심이 많아서 아두이노에 웹 서버를 올릴 수 있다는 것이 흥미롭게 다가
왔고, 이번 프로젝트를 통하여 직접 구현할 수 있어서 좋았습니다. 예전에 이미지를 불러
오고 CSS, Javascript를 사용하는 것을 테스트했을 땐 가능했기 때문에 먼저 웹 클라이언
트를 개발했지만, 도어 소스와 통합하면서 엄청나게 많은 제약이 생겨 개발한 웹 클라이언
트를 적용하지 못해서 매우 아쉽습니다. 생각보다 간단한 웹 부분이 되어버렸지만 웹으로
아두이노를 제어할 수 있게 되었고, 시행착오를 겪으며 많은 것을 배울 수 있었습니다. 아
쉬움과 동시에 배우는 즐거움을 느낄 수 있었던 프로젝트였습니다.
Thank you