반응형

【 아두이노모듈#4】 TM1637 4Digit Display #1. Stop Watch만들기 


 오늘은 TM1637 FND (4 Digit Display)를 이용해서 스톱워치 를 만들어 보려한다. 아두이노 프로그램 내용은 'Frankie.Chu'의 내용을 이용하여 작성하였다.

 이 모듈은 TM1637 이라는 칩이 핵심역할을 하며, FND 4개로 구성되어 있고, 시계 표시를 위한 포인트도 있으며, 다양한 형태로 디스플레이가 가능한 장점이 있다. 사이즈 또한 작고 컴팩트 하며, 전원핀을 포함해서 4개의 핀으로 제어(I2C통신)가 가능하기 때문에 회로 구성이 매우 간결해진다.


▶ 선수 학습 :

 

   없음.


▶ TM1637 이용한 스톱워치 회로. 






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



▶ 실습 목표 :  


 - 시리얼 모니터 창을 통해 스톱워치 기능을 동작 구현 하라. 

 (S : 시작  ,   P : 멈춤  ,   W : 시간 저장하기  , L : 저장한 시간 보여주기 ,  R : 리셋 ) 


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



▶ 실습 절차  : 


1.   회로 도면을 보면서 부품들을 연결한다.

2.   해당하는 라이브러리가 몇 가지 존재하므로 이에 맞는 라이브러리를 다운 받아 사용하여야 한다. (여기서는 'TM1637.h' 사용)

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


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

3.   아래 프로그래밍을 돌려보고 라이브러리 에러가 나지 않으면 라이브러리 설치가 잘 된 것이며, 프로그램 내용이 길어 차분하게 잘 작성하도록 한다. 

4. 실행이 되면 아래와 같은 시리얼 모니터 창을 열어 명령어를 입력 하여 작동이 잘 되는지 확인 한다.





▶ 프로그램 코드 및 설명 : 


/* TM 1637 이용한 스톱 워치 만들기 */


#include<IRremote.h>

#include <EEPROM.h>

#include <TimerOne.h>

#include <avr/pgmspace.h>

#include "TM1637.h"

#define ON 1

#define OFF 0

int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};

unsigned char ClockPoint = 1;

unsigned char Update;

unsigned char microsecond_10 = 0;

unsigned char second;

unsigned char _microsecond_10 = 0;

unsigned char _second;

unsigned int eepromaddr;

boolean Flag_ReadTime;

#define CLK 8        

#define DIO 9

TM1637 tm1637(CLK,DIO);


void setup ( ) {

  Serial.begin(9600);

  tm1637.set(BRIGHT_TYPICAL); 

  tm1637.init();

  Timer1.initialize(10000);      

  Timer1.attachInterrupt(TimingISR);  

  Serial.println("Please send command to control the stopwatch:");

  Serial.println("S - start");

  Serial.println("P - pause");

  Serial.println("L - list the time");

  Serial.println("W - write the time to EEPROM ");

  Serial.println("R - reset");  

}


void loop ( ) {

char command;

command = Serial.read();


switch(command)    {

    case 'S':
        stopwatchStart();
        Serial.println("Start timing...");

    break;


    case 'P':
        stopwatchPause();

Serial.println("Stopwatch was Paused");

    break;


    case 'L':

readTime();

    break;


    case 'W':

saveTime();

Serial.println("Save the time");
break;


    case 'R':

stopwatchReset();

Serial.println("Stopwatch was reset");

break;

 

   default:

break;

  }

  if(Update == ON)   {

    TimeUpdate();

    tm1637.display(TimeDisp);

  } 

}


void TimingISR ( ) {

 microsecond_10 ++;

  Update = ON;

  if(microsecond_10 == 100){

    second ++;

    if(second == 60)

    {

      second = 0;

    }

    microsecond_10 = 0;  

  }

  ClockPoint = (~ClockPoint) & 0x01;

  if(Flag_ReadTime == 0)

  {

    _microsecond_10 = microsecond_10;

    _second = second;

  } 

 } 


void TimeUpdate (void)

{

  if(ClockPoint)tm1637.point(POINT_ON); 

  else tm1637.point(POINT_ON); 

  TimeDisp[2] = _microsecond_10 / 10;

  TimeDisp[3] = _microsecond_10 % 10;

  TimeDisp[0] = _second / 10;

  TimeDisp[1] = _second % 10;

  Update = OFF;

}

void stopwatchStart( )     // timer1 on

{

  Flag_ReadTime = 0;

  TCCR1B |= Timer1.clockSelectBits; 

}


void stopwatchPause ( )  

{

  TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12));

}


void stopwatchReset ( )

{

  stopwatchPause();

  Flag_ReadTime = 0;

  _microsecond_10 = 0;

  _second = 0;

  microsecond_10 = 0;

  second = 0;

  Update = ON;

}


void saveTime( )

{

  EEPROM.write(eepromaddr ++,microsecond_10);

  EEPROM.write(eepromaddr ++,second);

}


void readTime ( )

{

  Flag_ReadTime = 1;

  if(eepromaddr == 0)   {

    Serial.println("The time had been read");

    _microsecond_10 = 0;

    _second = 0;

    }

  else {

  _second = EEPROM.read(-- eepromaddr);

  _microsecond_10 = EEPROM.read(-- eepromaddr);

  Serial.println("List the time");

  }

  Update = ON;

}


▶ 실행영상 :  

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




▶ 아두이노 파일다운 :

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




반응형