【 아두이노모듈#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 : 리셋 )
▶ 실습 회로도면 :
(이미지 클릭하면 확대 가능)
▶ 실습 절차 :
※ 라이브러리 다운로드 방법 :
▶ 프로그램 코드 및 설명 :
/* 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;
}
(전체화면 보기로 보세요)
▶ 아두이노 파일다운 :
(다운받아서 압축을 풀어 사용하세요)
'아두이노 > 3. 아두이노 모듈' 카테고리의 다른 글
【 아두이노모듈#6】 TM1637 4Digit Display #3. 마스터하기 (4) | 2019.03.06 |
---|---|
【 아두이노모듈#5】 TM1637 4Digit Display #2. Data shift 하기 (0) | 2019.03.04 |
【 아두이노 모듈#3】 IR 리모컨으로 3개의 LED 켜기 IR실습 #3 (2) | 2019.02.22 |
【 아두이노 모듈#2】 IR-적외선 모듈( KY-022) 다루기 #2 (0) | 2019.02.21 |
【 아두이노 모듈#1】 IR-적외선 모듈( KY-022) 다루기 / 리모컨 #1 (2) | 2019.02.19 |