본문 바로가기

개발자/Arduino

아두이노 포모도로 시계 만들기

반응형

 

 

 

디지털 기기와 정보에 주의를 빼앗기지 않고  몰입을 도와주는 아날로그같은 디지털 제품을 제공하기로 한다. 현대 사회에서 어떤 세대에 있어서도 몰입의 즐거움을 갖는 일은 어려운 일이다. 친구와 노는 시간에도, 식당에서도, 학습이나 여행같은 일상에서도, 가족 모임에서도 디지털 기기와 정보의 아웃소싱에 의지하는 일은 사실 권장되는 일이기조차 하다. 

 

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분을 알람으로 알려준다.
점퍼 케이블/브레드 보드 연결할 때 필요한 점퍼 케이블과 브레드 보드

 

전체 연결도

 

아두이노 포모도로 시계 만들기 2022-04-10

 

 

아래 전체 소스코드를 첨부하고 코드 각 부분 설명을 추가합니다.

 

//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

 

아두이노 가변 저항 7-segment 에 표시하기 smart knob

가변저항 값이 약간 오차가 생기는 이유를 찾고 있다. 가변저항 값을 읽어 표시하는 코드 //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}, /..

fishpoint.tistory.com

아두아노 millis()함수 시간 다루기

 

아두아노 millis()함수 시간 다루기

​ 오늘은 아두이노 프로그래밍에서 자주 사용하는 millis( ) 함수에 대해 알아보겠습니다. millis 함수 레퍼런스를 참조는 이곳을 참고하시면 되고 여기서는 millis 함수를 사용해 읽은 값을 다루는

fishpoint.tistory.com

4 Digit 7 Segment Display 아두이노 제어

 

4 Digit 7 Segment Display 아두이노 제어

시계, 숫자 표시 등 활용 분야가 많은 7 segment 제어를 실습한다. 시계 알람 설정을 다이얼 노브를 사용하여 설정하는 방법을 알아보는 중이다. 회로 연결도는 아래와 같다. 여기서 부저는 연결하

fishpoint.tistory.com

 

 

참고

아두이노 Delay를 사용한 pomodoro 시계 만들기

Tone 함수에 대해 참고

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^