【 아두이노모듈#8】 TM1637 (분:초) 시계 만들기 #2
【 아두이노모듈#8】 TM1637 (분:초) 시계 만들기 #2
지난시간 TM1637 FND (4 Digit Display) 모듈을 이용하여 100초까지 카운트 되는 초시계를 만들어 보았다.
이번 시간에는 현재의 시계처럼, 1시간 단위로 넘어갈 수 있도록 코딩을 통해 제어해 보고자 한다.
▶ 선수 학습 :
1. (모듈#4) TM1637 4Digit Display #1 (TM1637 기본 참고) ☜ 강좌클릭
2. (모듈#5) TM1637 Data shift 하기#2 (숫자 출력 참고) ☜ 강좌클릭
3. (모듈#6) TM1637 4Digit 마스터하기#3 (모듈함수사용 참고) ☜ 강좌클릭
4. (모듈#7) 100초 시계만들기#4 (시간 카운트 참고) ☜ 강좌클릭
5. (모듈#9) TM1637 "시:분" 시계만들기#4 (시간 카운트 참고) ☜ 강좌클릭
▶ TM1637 세부 스팩
※ TM1637 모듈은, CATALEX 사, Grove 사, 두 회사제품이 판매되고 있고, 두 제품 상호간 라이브러리 코드 내용이 조금 다르기 때문에, 코드를 컴파일 할 때, 프로그램 내용에 따라 에러가 날 수 있다. 이때는 해당 제품에 사용되지 않는 명령어(함수)를 찾아 내어 수정하면 된다. (여기서는 CATALEX 사 제품을 이용하였다)
▶ 실습 목표 :
1. [ 아두이노의 현재시간값 함수를 사용해 볼 수 있다 ]
2. [ 시간데이터값에서, 초 2자리, 분 2자리 등의 데이터를 추출해서 FND모듈의 각 자리에 출력 해 볼 수 있다. ]
3. [ 시계표시를 위한 '도트'를 컨트롤 할 수 있다.]
4. [ 시간을 60초 단위, 60분 단위로 코딩할 수 있다.]
▶ 실습 회로도면 :
(이미지 클릭하면 확대 가능)
▶ 실습 절차 :
(여기서는 'TM1637Display.h' 사용)
아두이노 IDE 에러메세지 창에서 사용하고 있지 않은 헤더 파일을 직접 삭제 하면 문제는 해결 된다.)
또한, 같은 이름의 <TM1637Display.h> 이라도, 실제 파일의 용량을 체크해 보면 용량이 다른 경우가 있을 수 있다. 그 이유는 파일 속에 명령어 등이 더 추가가 되거나 전반적인 명령어 내용이 아예 다를 수 있다. 따라서 둘 중 하나는 실행이 안 될 수 있다.
▶ 프로그램 코드 및 설명 :
/* 분:초 시계 만들기 코드입니다 */
#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 FND의 2자리에 분, 또다른 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);
}
▶ 참고 자료 :
(전체화면 보기로 보세요)
▶ 아두이노 파일다운 :
(다운받아서 압축을 풀어 사용하세요)
▶ 라이브러리 추가 하는 방법
① 라이브러리 추가 하려면, 위 파일을 다운로드 받고 압축을 풀어 아두이노 라이브러리 폴더에 폴더 그대로 복사해 넣거나, 폴더 위치는 보통 아두이노가 설치된 문서 폴더 아래에 있습니다. 예시) C:\문서\Arduino\libraries
② 압축을 풀지 않은 상태에서, 아두이노 IDE 메뉴 ≫ 스케치 ≫ 라이브러리 추가하기 ≫ .ZIP 라이브러리 추가 ≫ 메뉴에서 라이브러리 압축파일을 선택해 주면 추가됩니다.