【 아두이노모듈#6】 TM1637 4Digit Display #3. 마스터하기
【 아두이노모듈#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. [ 배열로 알파벳 만들어 출력하기 ]
▶ 실습 회로도면 :
(이미지 클릭하면 확대 가능)
▶ 실습 절차 :
(여기서는 'TM1637Display.h' 사용)
아두이노 IDE 에러메세지 창에서 사용하고 있지 않은 헤더 파일을 직접 삭제 하면 문제는 해결 된다.)
※ 라이브러리 다운로드 방법 :
▶ 프로그램 코드 및 설명 :
/* 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() {
}
이렇게 하여도 동작에 문제가 생기지 않는다. (아두이노의 리셋키를 눌러주면 다시 실행된다)
※ 아래처럼 16진 Hex 코드 값으로 코딩할 수 도 있다.
※ FND 구조의 한계상 모든 영문 알파벳을 자연스럽게 표시하기는 힘드나,
아래 표처럼 유사한 형태로 정의하여 사용할 수 있다.
※ showNumberDec 함수를 잘 이용하면, 보다더 다양한 형태로 FND모듈을 다룰 수 있다.
(전체화면 보기로 보세요)
▶ 아두이노 파일다운 :
(다운받아서 압축을 풀어 사용하세요)