프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

자리비움 계기판 만들기

2014-12-15 13:46:38

개요

개요

일하다보면 동료나 부하직원이 급하게 필요할 경우가 있어서 찾을때가 많다.




하지만 급하게 불렀더니 자리에 없고 어디에 갔는지도 모른다면 괜시리 짜증이 솟구치게 된다.




이때 이런 동료나 부하직원 또는 필요하게 급한 같은 단체 내의 사람의 상태를 확인할 수 있는 계기판이 있다면
그나마 이 사람이 자리에 있는지 없는지, 없다면 언제 자리를 비웠는지 확인할 수 있을 것이다.
비록 어디로 떠났는지는 알 수 없지만 자리에 있는지 여부만 알고 있더라도 급하게 그 자리에 가서 찾는 헛수고는 덜 수 있을 것이다.

이번에는 방석에 압력센서를 달아 사람이 자리에 있는지 여부를 파악하고 zigbee통신을 통해 이 상태를 서보모터와 lcd로 전송하여
상태값을 시각적으로 표현해 주는 계기판을 만들어 보자.


동영상


필요한 사전 지식

서보모터 제어하기
알람 시계 만들기
 - SWrtc를 통해 LCD에 시간 띄우기를 볼 수 있습니다.
알람 방석 만들기 - 방석에 압력센서를 달아 데이터를 전송하는 방법을 볼 수 있습니다.



부품 목록

NO 부품명 수량 상세설명
1 아두이노 2 오렌지 보드
2 서보모터 1 서보모터 mini
3 zigbee 모듈 2 Digi international Xbee S1
4 zigbee 쉴드 2  
5 LCD 1 3.75mm 64x16 Dot Matrix LED Display
6 가변 저항기 1 HC-SR04
7 압력센서 1  
8 9v 건전지 1  
9 브레드 보드 1 DC 5V
10 점퍼 케이블 1  

부품명 아두이노 서보모터 zigbee 모듈 zigbee 쉴드 LCD
부품 사진  
부품명 가변 저항기 압력센서 9v 건전지 브레드 보드 점퍼 케이블
부품 사진

하드웨어 making

브레드 보드

방석




계기판



계기판의 화살표는 서보모터의 날개에 붙여서 사용하게 된다. 계기판의 원판과 화살표는 하드보드지를 통해 만들었다.




계기판 뒷부분에는 서보모터가 있으며 스카치테이프로 고정하였다.
고정된 서보모터를 통해 날개를 제어하여 화살표를 움직이게 된다.




시간을 나타내는 LCD는 브레드보드에 점퍼케이블로 연결하였다. 
LCD위에는 현재 시간을 나타내고 밑에는 마지막으로 자리를 비운 시간을 나타내게 된다.




방석을 구성하는 모듈이다. 기존에 만들었던 알람방석에서 피에조부저를 빼고 Zigbee쉴드를 부착한 모습과 같다.
여기에서는 USB커넥터를 통해 전원을 공급하고 있지만 건전지를 통해 전원을 공급하게 된다.



소프트웨어 coding

방석

const int THRESHOLD = 50;
char ch = 'a'; char ch1 = 'b'; void setup() { Serial.begin(9600); //시리얼 통신 초기화 } void loop() { int sensorValue = analogRead(A0); //압력센서로 부터 데이터를 읽는다. if(sensorValue > THRESHOLD) { //값이 50 이상일 경우 Serial.write(ch); //계기판으로 데이터'a'를 전송 } else { Serial.write(ch1); //자리에 없을 경우 데이터 'b'를 전송 } delay(2000); }
방석에서는 압력센서를 통해 사람이 자리에 있는지 없는지를 파악하게 된다.
방석에서 전송되는 값은 THRESHOLD를 통해 값을 비교하여 계기판쪽으로 전송할 값을 정하게 된다.


계기판

#include <LiquidCrystal.h>
#include <core_build_options.h>
#include <swRTC.h>
#include <Servo.h> 

Servo myservo;
LiquidCrystal lcd(12,11,5,4,3,2);        //RS 핀, E핀, 데이터 핀 4개
String lcdString = "";                   //객체 선언 : 출력 할 글자 저장

swRTC rtc; //rtc선언

//방석에서 전송되는 데이터를 저장하는 변수 char temp; char ch = 'a'; //AM PM을 구분해 주는 함수 void Set_AMPM(int hour) { if(hour >=12) { lcd.print("PM"); } else { lcd.print("AM"); } lcd.print(hour%12, DEC); //시간 출력 } //10보다 작은수를 출력할때 앞에 0을 출력하게 하는 함수 void Set_lowThanTen(int time) { if(time < 10) { lcd.print("0"); lcd.print(time%10); } else lcd.print(time); } //알람이 울릴시간인지 체크하는 함수 void setup() { lcd.begin(16,2); //LCD 크기 지정, 2줄 16칸 lcd.clear(); //화면 초기화 rtc.stopRTC(); //정지 rtc.setTime(14,13,0); //시간, 분, 초 초기화 rtc.setDate(15, 12, 2014); //일, 월, 년 초기화 rtc.startRTC(); //시작 myservo.attach(9); //서보모터핀을 9번핀으로 선언 myservo.write(90); Serial.begin(9600); //시리얼 통신 초기화 } void loop() { int day; lcd.setCursor(0,0); //커서를 0,0에 지정 //1초 단위로 갱신하며 현재시간을 LCD에 출력 Set_AMPM(rtc.getHours()); lcd.print(":"); Set_lowThanTen(rtc.getMinutes()); lcd.print(":"); Set_lowThanTen(rtc.getSeconds()); //날짜를 LCD에 출력 lcd.print("["); Set_lowThanTen(rtc.getMonth()); lcd.print("/"); Set_lowThanTen(rtc.getDay()); lcd.print("]"); //세팅된 알람시간을 LCD에 출력 if(Serial.available()) { //방석으로 부터 데이터를 전송받는다 temp = ch; ch = Serial.read(); } if(ch == 'b') { //자리비움 일 때 if(temp == 'a') { //그 전 상태가 자리에 있었을 경우 LCD에 자리비울때의 시간을 표시
myservo.write(150); lcd.setCursor(0,1); lcd.print("Leave "); Set_AMPM(rtc.getHours()); lcd.print(":"); Set_lowThanTen(rtc.getMinutes()); lcd.print(":"); Set_lowThanTen(rtc.getSeconds()); } } else if(ch == 'a') { //자리에 있을 경우 if(temp == 'b') { //직전 상태가 자리비움 상태였을 경우 서보모터를 At work로 돌린다. myservo.write(30); } } //1초마다 LCD갱신 lcdString = ""; //문자열 초기화 lcd.print(" "); //전 글씨 삭제 delay(1000); }
계기판에서는 SWrtc를 사용해 시간을 LCD에 표현한다. 
기존 소스는 상당부분 알람 시계 만들기 에서 가져왔기 때문에 참고하면 좋다.

계기판에서는 시간을 LCD에 표현하면서 Serial.available()을 통해 반복적으로 zigbee통신을 통해 전송되는 데이터를 확인한다.
방석에서는 사람이 앉아있을 경우 'a'를 보내고 사람이 없을 경우 'b'를 보내게 된다.

'a'가 전송 될 경우에는 서보모터를 At work쪽으로 돌리게 되고
'b'가 전송 될 경우에는 서보모터를 Absence쪽으로 돌리게 된다.
이때 코드상에서는 이 직전에 전송된 데이터와 현재 데이터를 비교하게 된다.
직전에 전송된 데이터가 'a'이고 현재 전송된 데이터가 'b'일 경우 이 시점에 자리를 비우게 된 것이므로 이 때의 시간을 LCD에 표현하게 된다.
직전에 데이터가 'b'이고 현재 전송된 데이터 또한 'b'일 경우에는 계속적으로 자리를 비우고 있는 상태이기 때문에
계속적으로 서보모터를 Absence쪽으로 유지하게 된다.

수박쨈

아두이노, 서보모터, zigbee, 압력센서, LCD