【 아두이노모듈#6】 TM1637 4Digit Display #3. 마스터하기
지난시간 TM1637 FND (4 Digit Display)를 이용해서 스톱워치와 숫자 표시(0,~ F)를 기본으로 다루어 보았다. (TM1637.h 사용)
이제 TM1637Display.h 를 사용하여 다양한 명령어(함수)를 활용해보고 여러가지 형태로 제어를 해서 TM1637을 마스터 해보도록 하자.
▶ 선수 학습 :
1. (모듈#4) TM1637 4Digit Display #1 (TM1637 기본 참고) ☜ 강좌클릭
2. (모듈#5) TM1637 Data shift 하기#2 (숫자 출력 참고) ☜ 강좌클릭
▶ TM1637 세부 스팩
※ TM1637 모듈은, CATALEX 사, Grove 사, 두 회사제품이 판매되고 있고, 두 제품 상호간 라이브러리 코드 내용이 조금 다르기 때문에, 코드를 컴파일 할 때, 프로그램 내용에 따라 에러가 날 수 있다. 이때는 해당 제품에 사용되지 않는 명령어(함수)를 찾아 내어 수정하면 된다. (여기서는 CATALEX 사 제품을 이용하였다)
▶ 실습 목표 :
1. [ 0~ F 값 출력 하기 ]
2. [ showNumBerDec 함수 이용하여 숫자 다양하게 표시하기]
3. [ 시계표시를 위한 '도트' 출력하기 ]
4. [ 밝기 테스트 하기 : 1~7 단계 ]
5. [ 모듈 켜고 끄기 test ]
6. [ 0부터 ~ F까지 좌로 시프트 시키기 (2회 반복) ]
7. [ 배열로 알파벳 만들어 출력하기 ]
▶ 실습 회로도면 :
(이미지 클릭하면 확대 가능)
▶ 실습 절차 :
1. 회로 도면을 보면서 부품들을 연결한다.
이번 실습에서는 브레드 보드는 필요치 않으므로 TM1637모듈을 아두이노에 직접연결(직결) 하여도 된다.
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. 실습 목표의 7가지 기능을 테스트 하기 위해서 각 동작마다 delay 타임을 1초~2초 정도 적절히 넣어서 동작의 구분이 쉽도록 한다.
5. 실력 향상을 위해서는 아래 코딩으로 동작이 확인 되면 주석을 참고하여, 생각하고 있는 동작 형태로 바꾸어 실험해본다.
▶ 프로그램 코드 및 설명 :
/* TM1637Display .h 라이브러리 완벽마스터하기
*/
/* 활용을 위한 [기능] 위주로 정리 하였음 */
#include
<TM1637Display.h>
#define
CLK
8 //
클럭 포트
#define
DIO 9 //
데이터 입력 포트
TM1637Display display(CLK,
DIO);
int i, j,
k;
uint8_t data[] = { 0xff,
0xff, 0xff, 0xff };
uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 };
uint8_t count[] = { 0xff, 0xff, 0xff, 0xff };
const uint8_t
SEG_LOVE[] = { //
우측 FND
이미지 참조
SEG_D | SEG_E | SEG_F, //
L
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E |
SEG_F, //
O
SEG_B | SEG_E | SEG_F | SEG_G, //
V
SEG_A | SEG_D | SEG_E | SEG_F | SEG_G }; //
E
const uint8_t
SEG_DONE[] = {
SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, //
d
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E |
SEG_F, //
O
SEG_C | SEG_E | SEG_G, //
n
SEG_A | SEG_D | SEG_E | SEG_F | SEG_G }; //
E
// FND의 각
Segment 배열
위치는 아래 이미지 참조
void setup ( ) { //
모든 프로그램을 setup에
작성함
display.setBrightness(7); //
0~7, 밝기
조절
display.setSegments(data); //배열
출력(FND로
8888 비트
모두가 출력된다)
delay(1000);
// #####
[ 0~F 출력하기]
#####
//
encode digit를 이용해서 배열 내용을 변경해 넣을 수 있다
//
0 ~ 9는 숫자로 10
~ 15까지는 알파벳 A
~ F로 출력된다
//
encodeDigit(x)의
x는 0~15
입력으로 숫자 0부터
알파벳 F까지만
표시가능
data[0]
= display.encodeDigit(0);
data[1] = display.encodeDigit(1);
data[2] = display.encodeDigit(2);
data[3] = display.encodeDigit(3);
display.setSegments(data); //
위 숫자 0~3의
배열값
한번에 출력
delay(1000);
data[0] = display.encodeDigit(4);
data[1] = display.encodeDigit(5);
data[2] = display.encodeDigit(6);
data[3] = display.encodeDigit(7);
display.setSegments(data);
//위 숫자
4~7의 배열값
한번에 출력
delay(1000);
data[0] = display.encodeDigit(8);
data[1] = display.encodeDigit(9);
data[2] = display.encodeDigit(0);
data[3] = display.encodeDigit(0);
display.setSegments(data);
//위 숫자
8,9,0,0 배열값
한번에 출력
delay(2000);
data[0] = display.encodeDigit(10);
data[1] = display.encodeDigit(11);
data[2] = display.encodeDigit(12);
data[3] = display.encodeDigit(13);
display.setSegments(data); //위
10~13값에
해당하는 A~d
출력
delay(1000);
data[0]
= display.encodeDigit(14); //
'E' 출력
data[1]
= display.encodeDigit(15); //
'F' 출력
data[2]
= display.encodeDigit(16);
//'F'다음은
다시0부터
반복
data[3] = display.encodeDigit(17);
// '1'
출력
display.setSegments(data); delay(2000); // E F 0 1 출력
//####
[ showNumberDec
함수 이용하여 다양하게 표시해보기]
####
display.showNumberDec(1318,
false, 4, 0); //숫자
값 직접 출력할 경우
//
1318 : 표시할 숫자 ,
4 : 표시숫자 길이,
0 : 표시할 위치(맨좌측부터
0123)
delay(1000);
display.showNumberDec(567,
false, 3, 1); delay(2000);
//아래처럼 옵션에
숫자 3자리만
출력하고 2번째('1')digit부터
표시 할 경우,
기존
// 출력된
숫자 등은 그대로 표시됨.
따라서 위 기존 출력'1318'에서
'1'이
계속 표시
// 되어,
'1567'이 최종 출력됨.
567 :표시할
숫자 , 3 :숫자
길이, 1 :표시할
위치
display.showNumberDec(0,
false); delay(1000); //
출력 :
___0
display.showNumberDec(0,
true); delay(1000); //
출력 :
0000
display.showNumberDec(1,
false); delay(1000); //
Expect: ___1
display.showNumberDec(1,
true); delay(1000); //
Expect: 0001
display.showNumberDec(301,
false); delay(1000); //
Expect: _301
display.showNumberDec(301,
true); delay(1000); //
Expect: 0301
display.showNumberDec(14,
false, 2, 1); delay(1000); //
Expect: _14_
display.showNumberDec(4,
true, 2, 2); delay(1000);
//
Expect: 04__
display.showNumberDec(-1,
false); delay(1000); //
Expect: __-1
display.showNumberDec(-12);
delay(1000); //
Expect: _-12
display.showNumberDec(-999);
delay(1000); //
Expect: -999
// #####
[ 시계표시를 위한 '도트'
출력 하기
] #####
for(int j=0;
j <= 2; j++) {
for(int k=0;
k <= 4; k++) {
display.showNumberDecEx(0,
(0x80 >> k), true);
// showNumberDecEx(표시할
숫자, 도트출력,
0일때 '0'자체
표시 유무)
delay(500); //
돗트가
꺼지고(500)켜지는(500)시간
총합한 1초
간격
}
}
//
##### [ 밝기
테스트 : 1~7 단계 ]
#####
for(int k =
0; k < 4; k++)
data[k] = 0xff;
for(int k =
0; k < 7; k++) {
display.setBrightness(k);
display.setSegments(data);
delay(800);
}
//
##### [ 모듈
켜고 끄기 test ] #####
for(k = 0; k < 3; k++) {
display.setBrightness(7,
false); //
겨기
display.setSegments(data);
delay(500);
display.setBrightness(7,
true); //
끄기
display.setSegments(data);
delay(500);
}
//#####
[ 0부터 ~
F까지 좌로 시프트 시키기 (2회
반복)] #####
for (i = 0;
i
<= 1; i++) { //
2회 반복
for(k
= 0; k <= 12; k++) { //
12까지 하면 F까지
출력가능
for(j
=0; j <= 3; j++)
{ //
한번에 숫자 4개
출력해야함
count[j]
= display.encodeDigit(j+k); //배열에
값 넣기
display.setSegments(count); //배열값
출력
delay(20);
}
delay(250);
}
delay(2000);
}
//####
[배열로 알파벳
만들어 출력하기(앞
부분 배열선언 참조)] ###
display.setSegments(SEG_LOVE); //
LOVE 출력
delay(1000);
display.setSegments(SEG_DONE); //
dOnE
출력
}
void loop() {
}
※ 동작의 구별을 명확히 하려고 위와 같이 루프문이 아닌 셋업 문에 대부분의 명령을 작성하였고,
이렇게 하여도 동작에 문제가 생기지 않는다. (아두이노의 리셋키를 눌러주면 다시 실행된다)
▶ 참고 자료 :
※ FND의 내부 구조를 파악하고 있으면 사용자문자를 직접 제작하려고 할 때 도움이 된다.
※ 아래처럼 16진 Hex 코드 값으로 코딩할 수 도 있다.
※ FND 구조의 한계상 모든 영문 알파벳을 자연스럽게 표시하기는 힘드나,
아래 표처럼 유사한 형태로 정의하여 사용할 수 있다.
※ showNumberDec 함수를 잘 이용하면, 보다더 다양한 형태로 FND모듈을 다룰 수 있다.
▶ 실행영상 :
(전체화면 보기로 보세요)
▶ 아두이노 파일다운 :
(다운받아서 압축을 풀어 사용하세요)
TM1637Display.zip