반응형

【 아두이노모듈#8】 TM1637 (분:초) 시계 만들기 #2

 

 지난시간 TM1637 FND (4 Digit Display) 모듈을 이용하여 100초까지 카운트 되는 초시계를 만들어 보았다.  

 이번 시간에는 현재의 시계처럼, 1시간 단위로 넘어갈 수 있도록 코딩을 통해 제어해 보고자 한다. 

 

▶ 선수 학습 :

  1. (모듈#4TM1637 4Digit Display #1 (TM1637 기본 참고 강좌클릭
  2. (모듈#5)  TM1637 Data shift 하기#2 (숫자 출력 참고 강좌클릭

  3. (모듈#6)  TM1637 4Digit 마스터하기#3 (모듈함수사용 참고 강좌클릭

  4. (모듈#7100초 시계만들기#4  (시간 카운트 참고 강좌클릭
  5. (모듈#9 TM1637 "시:분" 시계만들기#4  (시간 카운트 참고 강좌클릭

 

▶ TM1637 세부 스팩 

 

  TM1637 모듈은, CATALEX 사,  Grove 사,  두 회사제품이 판매되고 있고, 두 제품 상호간 라이브러리 코드 내용이 조금 다르기 때문에, 코드를 컴파일 할 때, 프로그램 내용에 따라 에러가 날 수 있다.  이때는 해당 제품에 사용되지 않는 명령어(함수)를 찾아 내어 수정하면 된다. (여기서는 CATALEX 사 제품을 이용하였다)

 

▶ 실습 목표 :  

  1. [ 아두이노의 현재시간값 함수를 사용해 볼 수 있다 

 2. [ 시간데이터값에서, 초 2자리, 분 2자리 등의 데이터를 추출해서 FND모듈의 각 자리에 출력 해 볼 수 있다. ]

 3. [ 시계표시를 위한 '도트'를 컨트롤 할 수 있다.]

 4. [ 시간을 60초 단위, 60분 단위로 코딩할 수 있다.]

 
▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)

 

▶ 실습 절차  : 

1.   필요한 라이브러리 등을 '라이브러리 매니저' 혹은 구글링으로 찾아 다운받을 수 있다. 필요한 라이브러리는  ( TM1637Display.h ) 이다!  (단, 2번 내용을 참고하여 여기 게시글 제일 아래에 제시하는 라이브러리를 받아 사용하면 최소한 라이브러리 문제는 발생하지 않음!)
 
2.   해당하는 라이브러리가 몇 가지 존재하므로 이에 맞는 라이브러리를 다운 받아 사용하여야 한다. 
(여기서는 'TM1637Display.h' 사용)
  ★ <TM1637.h> 와 <TM1637Display.h> 헤더는 서로 다른 헤더이다. 아두이노 IDE에서 사용가능한 함수 들의 정의가 서로 다를 수 있으니 구분해서 사용해야 한다. 여기에서는 <TM1637Display.h>를 사용하고 있으며, 만약, 프로그램 작성후 실행시 라이브러리 관련 에러가 날 경우 거의 대부분 "TM1637Display.h" 를 두 개(두 군데) 이상 중복 설치되어 나타나는 에러 이므로, 
아두이노 IDE 에러메세지 창에서 사용하고 있지 않은 헤더 파일을 직접 삭제 하면 문제는 해결 된다.)
또한, 같은 이름의 <TM1637Display.h> 이라도, 실제 파일의 용량을 체크해 보면 용량이 다른 경우가 있을 수 있다. 그 이유는 파일 속에 명령어 등이 더 추가가 되거나 전반적인 명령어 내용이 아예 다를 수 있다.  따라서 둘 중 하나는 실행이 안 될 수 있다.  
 
3.   CLK 포트는 8번핀, DIO포트는 9번핀을 사용하였으며, 필요시 다른 포트로 변경한다면, 아래 프로그램의 포트 번호를 수정해주면 된다. 
 
4. 이전 프로그램에서는 99까지 그대로 카운트 되도록 놔두었으나, 이제 59초에서 60초가 되면, 초부분을 00으로 리셋시키고, 1분씩 증가시켜보자. 또한 60분이 되면 시간 값을 1증가 시키고, 24시가 되면 00으로 리셋을 시켜 보자. 

▶ 프로그램 코드 및 설명 : 

/* 분:초 시계 만들기 코드입니다  */
#include <TM1637Display.h>
#include <TimeLib.h>
#define CLK 8
#define DIO 9
int Sec1, Sec2, Min1, Min2, Tm1, Tm2 = 0;
unsigned long previousTime, currentTime;
TM1637Display display(CLK, DIO);

void setup() {
 previousTime = millis();     // 현재의 시간을 입력 받음
 display.setBrightness(0xF);                
 Serial.begin(9600);
}

void loop()  {
  currentTime = millis();  
  if (currentTime - previousTime > 1000) {   // 1초 이상 경과 체크
    previousTime = currentTime;
    Sec2++;                     // ‘초단위’  1의 자리 값을 1 증가
      if(Sec2 == 10) {          // 10초가 되면 초단위 10의 자리 증가
        Sec2 = 0;
        Sec1++;
      }
  }
  if (Sec1 == 6 && Sec2 == 0) {  //만약 증가시킬 Sec1이 ‘6’이고, 
    Sec1 = 0;                    // Sec2가 ‘0’이라면 , 초단위 변수들을 ‘0’
    Sec2 = 0;                    // 으로 리셋 후,  분단위 일의 자리   
    Min2++;                      //  60초가 되었으므로 1분 증가
  }
  if(Min2 ==10) {                //  9분에서 10분이 될 때의 처리
    Min2 =0;
    Min1++;
  }
  if (Min1 == 6 && Min2 ==0) {    // 초단위와 마찬가지로 분단위 처리
    Sec1 = 0; 
    Sec2 = 0;
    Min1 = 0;
    Min2 = 0;
    Tm2++;                        // 60분이 되었으므로 1시간 증가
  }
  if (Tm2 == 10) {                // 9시에서 10시가 될 때의 처리
    Tm2 = 0;
    Tm1++;
  }
  if (Tm1 == 2 && Tm2 ==4) {      //24시간이 되면 모두 0시0분0초로 처리
    Sec1 = 0; 
    Sec2 = 0;
    Min1 = 0;
    Min2 = 0;
    Tm1  = 0;
    Tm2  = 0;     
  }
  uint8_t data[] = { 0x0, 0x0, 0x0, 0x0 }; // 초기값으로 00:00 셋팅
  uint8_t segto;
// 아래 4줄은 분:초 시계용 코드 입니다.
  data[0]=display.encodeDigit(Min1);     
  data[1]=display.encodeDigit(Min2);
  data[2]=display.encodeDigit(Sec1); 
  data[3]=display.encodeDigit(Sec2); 

/* 만약 시:분 시계로 변경하려면 아래 주석 4줄을 활성화 하세요 (분:초) 코드 4줄은 비활성 시키기
  data[0]=display.encodeDigit(Tm1);   
  data[1]=display.encodeDigit(Tm2);
  data[2]=display.encodeDigit(Min1); 
  data[3]=display.encodeDigit(Min2); 
*/
  segto = 0x80 | display.encodeDigit(Min2);      // 분:초 시계용
//  segto = 0x80 | display.encodeDigit(Tm2);     // 시:분 시계용
  display.setSegments(data);
  display.setSegments(&segto,1,1);               // 도트 ‘:’ 켜고
  delay(500);
  display.setSegments(data);                     // 깜빡이게 하기
  delay(500);
}

/* 0~ 60, 1~ 60 단위로 넘어가는 시계 구현*/

/* 4Digit FND2자리에 분, 또다른 2자리에 초 배치 */

#include <TM1637Display.h>

#define CLK 8

#define DIO 9

int Time, Minute;

int cont = 0;

int Sec1, Sec2, Min1, Min2;

unsigned long previousTime, currentTime;

 

TM1637Display display(CLK, DIO);

void setup ( ) {

 previousTime = millis();       // 현재의 시간을 입력 받음

 display.setBrightness(0xF);  // 최대 밝기 (1~7 밝기 조절)

 Serial.begin(9600);

/*    Sec1 = 5;   // 초기 시간 값을 설정할 경우

    Sec2 = 2;

    Min1 = 3;

    Min2 = 1;

*/

 

}

 

void loop ( )  {

currentTime = millis();    // 현재 시간값을 받아 currentTime에 저장

  if (currentTime - previousTime >= 1000) {// 1초 이상 경과 체크

    previousTime = currentTime;    // 현재시간 업데이트

    Sec2++;                          // ‘초단위  1의 자리 값을 1 증가

      if(Sec2 == 10) {            // 10초가 되면 초단위 10의 자리증가

        Sec2 = 0;

        Sec1++;

      }

  }

 

 // 만약 증가시킬 Sec1이 ‘6’이고Sec2 ‘0’이라면 초단위 

 // 변수들을 ‘0’으로 리셋 ,  분단위 일의 자리변수(min2)를 

// 1증가 시켜 줌.  분단위 변수가 10분이 될 때 체크

  if (Sec1 == 6 && Sec2 == 0) {

 

    Sec1 = 0;                            

    Sec2 = 0;                           

    Min2++;                              

  }

  if(Min2 ==10) {                     

    Min2 =0;

    Min1++;

  }

 

  if (Min1 == 6 && Min2 ==0) { //초단위와 마찬가지로 분단위처리

    Sec1 = 0;

    Sec2 = 0;

    Min1 = 0;

 

    Min2 = 0;     

}

 uint8_t data[] = { 0x0, 0x0, 0x0, 0x0 }; //초기값으로00:00셋팅

 uint8_t segto;

 data[0]=display.encodeDigit(Min1);

 data[1]=display.encodeDigit(Min2);

 data[2]=display.encodeDigit(Sec1);

 data[3]=display.encodeDigit(Sec2);

 

 segto = 0x80 | display.encodeDigit(Min2);  // ‘초시계‘:’도트

 display.setSegments(data);

 display.setSegments(&segto,1,1); // 도트 ‘:’ 켜고

 delay(500);

 display.setSegments(data);        // 깜빡이게 하기

 delay(500);

 

 }

 

▶ 참고 자료 :  

※ FND의 내부 구조 및 숫자 출력 함수 사용법 등은 앞의 선수학습 게시글을 참조할 것.

 

 
▶ 실행영상 :  

(전체화면 보기로 보세요)

 

▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

TM1637_Watch_Time_Min_Sec.zip
0.00MB

 

TM1637-master.zip
1.36MB

▶ 라이브러리 추가 하는 방법
① 라이브러리 추가 하려면, 위 파일을 다운로드 받고 압축을 풀어 아두이노 라이브러리 폴더에 폴더 그대로 복사해 넣거나,  폴더 위치는 보통 아두이노가 설치된 문서 폴더 아래에 있습니다.     예시)    C:\문서\Arduino\libraries
② 압축을 풀지 않은 상태에서,  아두이노 IDE 메뉴 ≫ 스케치 ≫ 라이브러리 추가하기 ≫ .ZIP 라이브러리 추가 ≫ 메뉴에서 라이브러리 압축파일을 선택해 주면 추가됩니다.

반응형