디지털 기기와 정보에 주의를 빼앗기지 않고 몰입을 도와주는 아날로그같은 디지털 제품을 제공하기로 한다. 현대 사회에서 어떤 세대에 있어서도 몰입의 즐거움을 갖는 일은 어려운 일이다. 친구와 노는 시간에도, 식당에서도, 학습이나 여행같은 일상에서도, 가족 모임에서도 디지털 기기와 정보의 아웃소싱에 의지하는 일은 사실 권장되는 일이기조차 하다.
Arduino pomodoro clock
포모도로 기법(Pomodoro Technique)은 시간 관리 방법론으로 1980년대 후반 '프란체스코 시릴로'(Francesco Cirillo)가 제안했다. 타이머를 이용해서 25분간 집중해서 일을 한 다음 5분간 휴식하는 방식이다. '뽀모도로'는 이탈리아어로 토마토를 뜻한다. 프란체스코 시릴로가 대학생 시절 토마토 모양으로 생긴 요리용 타이머를 이용해 25분간 집중 후 휴식하는 일처리 방법을 제안한데서 그 이름이 유래했다.
정확히 25분이 되면 알람이 울리고 다시 5분이 지나면 알람이 울리도록 프로그래밍한다. 아래 소스코드는 시작 프로그램으로 4-digit 7-segment에 1초 단위로 시간을 표시하는 코드다. 여기서부터 시작하기로 한다. 참고로 이전에 올린 4-digit 7-segment 코드는 그대로 실행되니 참고하기 바란다.
필요한 구성품과 기능을 아래에 설명한다.
구성품 | 기능 |
아두이노 우노 | 마이크로 컨트롤러, 개발은 아두이노 IDE 스케치에서 개발한다. 시간을 측정하고, 다루는 방법을 이해하고 있다면 어렵지 않다 |
4-digit 7-segment | 숫자 4개를 표시할 수 있는 7-segment |
사운드 센서 | LED가 번쩍이는 게 거슬려 소리로 보여주기도 하고 끄기도 한다. 익숙하면 디스플레이는 없어도 되고 소리로 안다. 여기서는 구현하지 않음. |
부저 혹은 스피커 | 25분과 5분을 알람으로 알려준다. |
점퍼 케이블/브레드 보드 | 연결할 때 필요한 점퍼 케이블과 브레드 보드 |
전체 연결도
아래 전체 소스코드를 첨부하고 코드 각 부분 설명을 추가합니다.
//25분 1500초
//5분 300초
#define buzzer 10
//a,b,c,d,e,f,g 상태값
const byte segValue[10][7] = {
{1,1,1,1,1,1,0}, //0
{0,1,1,0,0,0,0}, //1
{1,1,0,1,1,0,1}, //2
{1,1,1,1,0,0,1}, //3
{0,1,1,0,0,1,1}, //4
{1,0,1,1,0,1,1}, //5
{1,0,1,1,1,1,1}, //6
{1,1,1,0,0,0,0}, //7
{1,1,1,1,1,1,1}, //8
{1,1,1,1,0,1,1} //9
};
const byte segPin[8]={7,3,A3,A1,A0,6,A4,A2}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임
const byte digitPin[4] = {8,5,4,A5}; //segment 위치 핀
const byte interruptPin = 2;//인터럽트핀
extern volatile unsigned long timer0_millis; //타이머변수
boolean state = true; //false //처음 타이머 동작 제어
unsigned long readTime=0; //현재시간
int d1 = 0; //1의 자리
int d2 = 0; //10의 자리
int d3 = 0; //100의 자리
int d4 = 0; //1000의 자리
bool minute_25_complete = 0;
void setup() {
Serial.begin(9600);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), switchFn, FALLING);
for(int i=0;i<8;i++){
pinMode(segPin[i], OUTPUT);
}
for(int j=0;j<4;j++){
pinMode(digitPin[j], OUTPUT);
digitalWrite(digitPin[j], HIGH);
}
pinMode(buzzer, OUTPUT);
}
void loop() {
if(state==true){ //스위치 상태가 true일때 카운트
readTime = millis()/1000; //get 1 second value
d1 = readTime%10; //1의 자리
d2 = (readTime/10)%10; //10의 자리
d3 = (readTime/100)%10; //100의 자리
d4 = (readTime/1000)%10; //1000의 자리
}
//Serial.println(readTime);
/*Serial.print(d4);
Serial.print("\t");
Serial.print(d3);
Serial.print("\t");
Serial.print(d2);
Serial.print("\t");
Serial.println(d1);*/
//digit 0 display
segOutput(3,d1,0);
segOutput(2,d2,0);
segOutput(1,d3,0);
segOutput(0,d4,0);
//digit 0 no display
//if(readTime>=0)segOutput(3,d1,0); //1의 자리
//if(readTime>=10) segOutput(2,d2,0); //10의 자리
//if(readTime>=100) segOutput(1,d3,0); //10의 자리
//if(readTime>=1000) segOutput(0,d4,0); //10의 자리
if(readTime == 1500)
{
alarm_25();
minute_25_complete = 1;
}
if((minute_25_complete == 1) && (readTime == 1800))
{
alarm_25();
timer0_millis=0;
minute_25_complete = 0;
}
}
void alarm_25()
{
for(int i=0; i<10; i++) { //do this 255 times
analogWrite(buzzer, i); //raise the voltage sent out of the pin by 1
delay(100); //wait 10 milliseconds to repeat
}
analogWrite(buzzer, 0);
}
//스위치 버튼 인터럽트 결과 처리
void switchFn(){
state=!state;
if(state==true){ // false
timer0_millis=0; //타이머 변수 리셋
minute_25_complete = 0;
}
}
//LED 초기화
void segClear(){
for(int i=0;i<8;i++){
digitalWrite(segPin[i], LOW);
}
}
//LED 출력
void segOutput(int d, int Number, int dp){
segClear();
digitalWrite(digitPin[d], LOW);
for(int i=0;i<7;i++){
digitalWrite(segPin[i], segValue[Number][i]);
}
digitalWrite(segPin[7], dp);
delayMicroseconds(1000);
digitalWrite(digitPin[d], HIGH);
}
다른 부분은 그대로 각 기능을 그대로 이해하시면 되고, 25분이 지나는 순간 알람을 울려주고 다시 5분이 지나면 알람을 한 번 더 울려주고 타이머 시간을 리셋하는 부분에 주의합니다. 아래 코드입니다.
if(readTime == 1500) //업무에 집중
{
alarm_25();
minute_25_complete = 1;
}
if((minute_25_complete == 1) && (readTime == 1800)) // 5초 놀기
{
alarm_25();
timer0_millis=0;
minute_25_complete = 0;
}
25분이 되면 25분이 울렸다는 알람이 울리고, 플래그 minute_25_complete = 1로 해줍니다. 시간은 연속적으로 증가하니 다시 5분이 지나면 플래그를 0로 만들고, 타이머 카운터를 리셋해서 0으로 만들어 주고 다시 1초 카운터가 증가합니다. 테스트 할 때는 업무 집중시간을 10초 휴식을 15초로 해서 아래 코드처럼 변경 후 테스트 하세요. 물론 인터럽트 버튼도 테스트 해서 다시 시작하나 확인하시면 됩니다.
if(readTime == 10) //업무에 집중
{
alarm_25();
minute_25_complete = 1;
}
if((minute_25_complete == 1) && (readTime == 15)) // 5초 놀기
{
alarm_25();
timer0_millis=0;
minute_25_complete = 0;
}
readTime 값은 millis( ) 함수에서 받아 온 값을 1000으로 나눈 값이니 1초 값입니다. 1초값을 인쇄하고 위에서 계산한 각
자리값을 확인하는 코드인데 주석처리하였습니다.
//Serial.println(readTime);
/*Serial.print(d4);
Serial.print("\t");
Serial.print(d3);
Serial.print("\t");
Serial.print(d2);
Serial.print("\t");
Serial.println(d1);*/
아래 코드는 표시할 숫자가 0일 경우 0을 표시하지 않는 코드가 if~~ 코드이고 위 4줄은 강제로 0도 표시해 주는 코드입니다. 편한 대로 사용하시면 됩니다.
//digit 0 display
segOutput(3,d1,0);
segOutput(2,d2,0);
segOutput(1,d3,0);
segOutput(0,d4,0);
//digit 0 no display
//if(readTime>=0)segOutput(3,d1,0); //1의 자리
//if(readTime>=10) segOutput(2,d2,0); //10의 자리
//if(readTime>=100) segOutput(1,d3,0); //10의 자리
//if(readTime>=1000) segOutput(0,d4,0); //10의 자리
아두이노 가변 저항 7-segment 에 표시하기 smart knob
4 Digit 7 Segment Display 아두이노 제어
참고
아두이노 Delay를 사용한 pomodoro 시계 만들기
'개발자 > Arduino' 카테고리의 다른 글
아두이노 전체 라이브러리 5103개 (1) | 2022.10.01 |
---|---|
4 digit 7 segment up down 카운터 만들기 (0) | 2022.05.02 |
아두이노 7 Segment LED 숫자 표시 (0) | 2022.04.13 |
아두이노 DHT11 온도 습도 센서 실습 (0) | 2022.04.11 |
Arduino Uno로 ATtiny13 프로그래밍 (0) | 2022.04.07 |
아두이노 우노 보드와 브레드 보드 고정 아크릴 받침 (0) | 2022.04.07 |
아두이노 가변 저항 7-segment 에 표시하기 smart knob (0) | 2022.04.04 |
아두이노 dht22 온도 습도 센서 테스트 (0) | 2022.04.04 |
더욱 좋은 정보를 제공하겠습니다.~ ^^