반응형

【 아두이노모듈#7】 TM1637 (100초) 시계 만들기 #1


 지난시간 TM1637 FND (4 Digit Display) 모듈의 함수들을 이용해서 다양하게 컨트롤 해보았다. 이제 활용도가 높은 시계를 만들어보려 한다. 

 우선, 프로그래밍 연습겸 , 조금 쉽게 접근하기 위해서 100초까지 카운트 되어 넘어가는 100초 시계부터 만들어 보도록 하자. (TM1637Display.h 사용)



▶ 선수 학습 :

 

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

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


▶ TM1637 세부 스팩 


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



▶ 실습 목표 :  

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

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

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



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



▶ 실습 절차  : 


1.   필요한 라이브러리 등을 '라이브러리 매니저'등을 통해서 설치한다. ( TM1637Display.h )

2.   해당하는 라이브러리가 몇 가지 존재하므로 이에 맞는 라이브러리를 다운 받아 사용하여야 한다. 
(여기서는 'TM1637Display.h' 사용)
  ★ <TM1637.h> 와 <TM1637Display.h> 헤더는 서로 다른 헤더이다. 아두이노 IDE에서 사용가능한 함수 들의 정의가 서로 다를 수 있으니 구분해서 사용해야 한다. 여기에서는 <TM1637Display.h>를 사용하고 있으며, 만약, 프로그램 작성후 실행시 라이브러리 관련 에러가 날 경우 거의 대부분 "TM1637Display.h" 를 두 개(두 군데) 이상 중복 설치되어 나타나는 에러 이므로, 
아두이노 IDE 에러메세지 창에서 사용하고 있지 않은 헤더 파일을 직접 삭제 하면 문제는 해결 된다.)

※ 라이브러리 다운로드 방법 : 
   1. 첨부파일로 다운로드 가능. 
   2. 아두이노 IDE에서 라이브러리 매니저 화면에서 'tm1637Display'로 검색 후 설치 하기.


3. '깃허브' 에서 'tm1637' 검색으로 다운로드 가능
   링크 연결 : https://github.com/avishorp/TM1637 
    

3.   CLK 포트는 8번핀, DIO포트는 9번핀을 사용하였으며, 필요시 다른 포트로 변경한다면, 아래 프로그램의 포트 번호를 수정해주면 된다. 

4. 1분은 60초, 60분은 1시간의 개념은 여기서는 구현하지 않고, 시간값을 추출하는 함수에서 초 2자리, 분 2자리의 데이터를 추출하여 FND의 분과 초 자리에 각각 출력 해보는 형태로 프로그래밍 한다. 
5. 이것이 이루어 지면, 다음 회차에 60단위로 작동하는 시계를 쉽게 구현할 수 있을 것이다. 


▶ 프로그램 코드 및 설명 : 


/* TM1637Display .h  라이브러리  완벽마스터하기  */

/* 100초 시계 구현 하기  (알고리즘 공부)             */

#include <Arduino.h>

#include <TM1637Display.h>

#define CLK 8

#define DIO 9

TM1637Display display(CLK, DIO);

int Sec1, Sec2, Min1, Min2, Tm1, Tm2 = 0;

unsigned long previousTime, currentTime;

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

uint8_t segto;


void setup ( ) {

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

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

 Serial.begin(9600);

}

void loop ( )  {

 currentTime = millis()/1000;   // 최하 단위를 초로 바꾸어 줌

 Sec2 = currentTime%10;    // 현재시간값에서 초단위 '일의 자리'만 저장   

 Sec1 = (currentTime/10)%10;  // 현재시간값에서 초단위 '십의 자리'만 저장

 Min2 = (currentTime/100)%10;// 현재시간값에서 분단위 '일의 자리'만 저장

 Min1 = (currentTime/1000)%10;//현재시간값에서 분단위 '십의 자리'만저장

  data[0]=display.encodeDigit(Min1);    // FND 분단위 십의 자리

  data[1]=display.encodeDigit(Min2);   // FND 분단위 일의 자리   

  data[2]=display.encodeDigit(Sec1);     // FND 초단위 십의 자리

  data[3]=display.encodeDigit(Sec2);    // FND 초단위 일의 자리

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

  display.setSegments(data);

  display.setSegments(&segto,1,1);

  delay(500);

  display.setSegments(data);         //도트가 깜빡이게 하기 위해 반복 출력

  delay(500);

}


▶ 참고 자료 :  

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




▶ 실행영상 :  

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



▶ 아두이노 파일다운 :

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

TM1637_100Sec_Watch.zip



▶ 라이브러리 다운(TM1637Display) :

TM1637-master.zip



반응형