프로젝트

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

알람방석 만들기

2014-09-25 16:54:01

개요

대부분 책상앞에 앉아서 컴퓨터와 함께 업무를 보는 직장들은 일하다보면 목이나 어깨가 뻐근하고 다리와 옆구리에 살이 찌는것을 느낄것입니다.
앉아서 정신없이 일하다보면 점심시간이고 또 퇴근할 시간이 다가오죠.



잠깐이라도 일어날 수 있게 알람을 울리는 방석이 있으면 내가 얼마나 앉아있었는지 체크가 가능하고 잠깐이라도 서서 몸을 풀어줄 수 있을 것입니다.
여기서는 알람을 울리게 피에조 부저를 사용했지만, 피에조부저가 시끄럽다면 LED나 여타 다른 OUTPUT장치로 대체하여 사용해도 무방합니다.



동영상

필요한 사전지식

압력 센서
피에조 부저

부품 목록

NO 부품명 수량 상세설명
1 아두이노 1 아두이노 pro mini
2 압력 센서 1  
3 피에조 부저 1  
4 점퍼 케이블 10  
5 220Ω 저항 1  
6 리튬배터리 1 3.7v

부품명 아두이노  압력 센서 피에조 부저 점퍼 케이블 220Ω 저항 리튬 배터리
파트
 

하드웨어 making

브레드보드


전자회로도



하드웨어부분은 납땜을 통해 각각의 모듈들을 연결해 준다. 모듈의 연결은 위 회로도와 같이 하고 방석에 부착하는 방법은 방석을 살짝 찢고 모듈들을 넣을 수도 있고, 방석에 아랫부분에 설치할 수도 있고 사용자의 편의대로 부착하면 된다.



소프트웨어 coding

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

swRTC rtc; 

int piezo = 3; //피에조부저의 핀번호 설정
int afk_minutes, afk_seconds;
boolean sit = false;

void setup() {
//rtc세팅 rtc.stopRTC(); rtc.setTime(0,0,0); rtc.setDate(1,1,2000); Serial.begin(9600); //시리얼통신 초기화 pinMode(piezo, OUTPUT); } void loop() { int sensorValue = analogRead(A0); //압력센서에서 값을 읽어온다
//압력센서의 Output값이 100이상일 경우 앉은걸로 간주하고 타이머를 시작한다. if(sensorValue > 100) { Serial.println("sitdown"); rtc.startRTC(); //rtc시작(시간 측정) sit = true; //앉아있는 상태로 변경 }

//압력센서의 측정값이 계속 100이상이고 앉아있는 상태일 경우 while루프 반복 while(sensorValue > 100 && sit) { delay(1000); sensorValue = analogRead(A0); //압력센서의 값을 읽어온다 Serial.print(rtc.getMinutes(), DEC); Serial.print(":"); Serial.println(rtc.getSeconds(), DEC)
//잠깐 자리에서 비웠을 때(1분이내로 자리를 비울 경우) if(sensorValue < 100) { //앉아있다가 압력센서의 값이 100이하로 떨어진 경우 afk_minutes = rtc.getMinutes(); //일어난 시간을 저장 afk_seconds = rtc.getSeconds(); while(sensorValue < 100 && sit) { delay(1000); sensorValue = analogRead(A0); Serial.println(rtc.getSeconds());
//3분이 지나면 자리를 떠난것으로 간주 if(afk_minutes+3 == rtc.getMinutes() && afk_seconds == rtc.getSeconds()) { sit = false; //상태를 false로 변환 Serial.println("away"); rtc.stopRTC(); //rtc정지 및 시간 초기화 rtc.setTime(0,0,0); rtc.setDate(1,1,2000); } } }
//50분이 지났을 경우 if(rtc.getMinutes() == 50) {
//압력센서의 값이 100이상일 경우 피에조부저를 울린다 while(sensorValue > 100) { Serial.println("standUP!!"); buzz(piezo); sensorValue = analogRead(A0); }
//자리에서 일어났을 경우 피에조부저의 소리를 끄고 rtc를 다시 초기화 시킨다 Serial.println("INITIALIZE"); analogWrite(piezo, 0); rtc.stopRTC(); //정지 rtc.setTime(0,0,0); //시간, 분, 초 초기화 rtc.setDate(1,1,2000); //일, 월, 년도 초기화 sit = false; } } } void buzz(int pinNum) { analogWrite(pinNum, 64); delay(1000); analogWrite(pinNum, 128); delay(1000); }
압력센서의 값을 기준으로 앉아 있는지 서 있는지 구분한다. 구분하는 기준은 절대값 100으로 수치를 정했지만 사용자가 원하는 값으로 변경하여 사용해도 된다.
압력센서의 측정값이 100 이하 였다가 100을 넘게 되면 방석에 앉은걸로 간주하고 SWrtc를 통해 시간을 측정하게 된다. 

//잠깐 자리에서 비웠을 때(1분이내로 자리를 비울 경우)
    if(sensorValue < 100) { //앉아있다가 압력센서의 값이 100이하로 떨어진 경우
      afk_minutes = rtc.getMinutes(); //일어난 시간을 저장
      afk_seconds = rtc.getSeconds();
      while(sensorValue < 100 && sit) {
        delay(1000);
        sensorValue = analogRead(A0);
        Serial.println(rtc.getSeconds()); 
//3분이 지나면 자리를 떠난것으로 간주 if(afk_minutes+3 == rtc.getMinutes() && afk_seconds == rtc.getSeconds()) { sit = false; //상태를 false로 변환 Serial.println("away"); rtc.stopRTC(); //rtc정지 및 시간 초기화 rtc.setTime(0,0,0); rtc.setDate(1,1,2000); } } }
앉아있다가 자리를 잠깐 비울 수 있으므로 자리를 비우고 3분 동안은 자리를 떠나지 않은 것으로 간주하였다. 3분 이내에 방석에 다시 앉게 되면 rtc의 시간은 계속 이어져서 측정하게 되고 3분이 지나서 자리에 돌아올 경우에는 시간은 다시 초기화되서 측정된다.

   if(rtc.getMinutes() == 50) {
//압력센서의 값이 100이상일 경우 피에조부저를 울린다 while(sensorValue > 100) { Serial.println("standUP!!"); buzz(piezo); sensorValue = analogRead(A0); }
//자리에서 일어났을 경우 피에조부저의 소리를 끄고 rtc를 다시 초기화 시킨다 Serial.println("INITIALIZE"); analogWrite(piezo, 0); rtc.stopRTC(); //정지 rtc.setTime(0,0,0); //시간, 분, 초 초기화 rtc.setDate(1,1,2000); //일, 월, 년도 초기화 sit = false; }
50분이 지났을 경우에는 현재 압력센서의 반환값이 100이 넘는지 확인 후 100이 넘을 경우 피에조부저를 통해 압력센서의 반환값이 100이하로 떨어질 때까지 알람을 울리게 된다. 
자리에서 일어나서 압력센서의 반환값이 100이하일 경우 알람을 멈추게 되고 시간을 다시 0분 0시 0초로 초기화한다.




수박쨈

아두이노, 압력 센서, 피에조 부저, SWrtc