Arduino, TM1637 모듈 사용하기

TM1637


schematic

TM1637 CLK DIO VCC GND
Arduino 4 7 5V GND

라이브러리 추가하기

  1. 파일> 새파일>
  2. 스케치> 라이브러리 포함하기> 라이브러리 관리>


  1. 라이브러리 매니저 창이 뜨면, 검색란에 “tm1637”를 적어 넣음. tm1637관련 라이브러리가 5~6개정도 검색됨. TM1637 by Avishay Orpaz 라이브러리를 선택하여 설치



TM1637 숫자 표기 방법

for TM1637 by Avishay Orpaz library 
   *  A  *
   F     B
   *  G  *
   E     C
   *  D  *  DP

sketch

“8.8.8.8.” → “ “ → “0123” → “dOnE”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <Arduino.h>
#include <TM1637Display.h>

// Module connection pins (Digital Pins)
#define CLK 4
#define DIO 7

// The amount of time (in milliseconds) between tests
#define TEST_DELAY 2000

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
};

TM1637Display display(CLK, DIO);

void setup()
{
}

void loop()
{
uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 };

display.setBrightness(15); // 0 ~ 15 (15가 가장 밝음)
// display.setBrightness(0x0f);

// All segments on
display.setSegments(data); // "8.8.8.8."
delay(TEST_DELAY);

// Selectively set different digits // "0123"
data[0] = display.encodeDigit(0);
data[1] = display.encodeDigit(1);
data[2] = display.encodeDigit(2);
data[3] = display.encodeDigit(3);
display.setSegments(data);
delay(TEST_DELAY);

// Done!
display.setSegments(SEG_DONE); // "dOnE"
delay(TEST_DELAY);
}


0000~9999까지 나타내기


for() 문을 이용하는 방법

먼저 가장 간단하게 for문을 사용하여 0~9999까지의 숫자를 표시해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <Arduino.h>
#include <TM1637Display.h>

// Module connection pins (Digital Pins)
#define CLK 4
#define DIO 7

uint8_t data[] = { 0x00, 0x00, 0x00, 0x00 }; // 초기 출력값 0000
int seg3, seg2, seg1, seg0;

TM1637Display display(CLK, DIO);

void setup() {
display.setBrightness(15); // 0 ~ 15 (15가 가장 밝음)
// display.setBrightness(0x0f);

Serial.begin(9600);
}

void loop() {
for(int digitValue = 0; digitValue <= 9999; digitValue++) { // 0~9999까지 1씩 증가시킴
seg0 = (digitValue / 1000) % 10; // 4자리에서 1000의 자리 숫자 저장
seg1 = (digitValue / 100) % 10; // 4자리에서 100의 자리 숫자 저장
seg2 = (digitValue / 10) % 10; // 4자리에서 10의 자리 숫자 저장
seg3 = digitValue % 10; // 4자리에서 1의 자리 숫자 저장

data[0]=display.encodeDigit(seg0); // 첫번째 FND에 1000의 자리 숫자배열
data[1]=display.encodeDigit(seg1); // 두번째 FND에 100의 자리 숫자 배열
data[2]=display.encodeDigit(seg2); // 세번째 FND에 10의 자리 숫자 배열
data[3]=display.encodeDigit(seg3); // 네번째 FND에 1의 자리 숫자 배열

display.setSegments(data);
Serial.println(digitValue);
delay(10); // 10ms 마다 카운트
}
}


millis() 함수를 이용하는 방법

millis() 함수를 이용하여 시간카운트를 통해 0~9999까지 카운트 해보는 방법도 있습니다.

※ 주의: seg0, seg1, seg2, seg3 등의 변수값이 1015사이의 값을 갖게되면 16진수(AF)로 표현되므로, 각 변수는 10보다 작은 값을 갖도록 해야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
extern volatile unsigned long timer0_millis;   // millis() 리셋을 위한 변수

#include <Arduino.h>
#include <TM1637Display.h>

// Module connection pins (Digital Pins)
#define CLK 4
#define DIO 7

unsigned long previousTime, currentTime; // 현재시간, 현재시간(ms)
int timeValue;
uint8_t data[] = { 0x00, 0x00, 0x00, 0x00 }; // 초기 출력값 0000
int seg3, seg2, seg1, seg0;

TM1637Display display(CLK, DIO);

void setup() {
display.setBrightness(15); // 0 ~ 15 (15가 가장 밝음)
// display.setBrightness(0x0f);

Serial.begin(9600);
}

void loop() {
currentTime = millis(); // 현재 시간값을 측정

/*
if(currentTime - previousTime >= 1000) { // 현재 시간값을 1s마다 1000씩 증가시킴
previousTime = currentTime;
timeValue = currentTime / 1000; // 1s 마다 1000씩 증가된 숫자를 1000으로 나누어 줌.
// (결과적으로 1s마다 1씩 증가된 숫자가 timeValue에 저장됨)
*/
if(currentTime - previousTime >= 100) { // 현재 시간값을 0.1s마다 100씩 증가시킴
previousTime = currentTime;
timeValue = currentTime / 100; // 0.1s 마다 100씩 증가된 숫자를 100으로 나누어 줌.
// (결과적으로 0.1s마다 1씩 증가된 숫자가 timeValue에 저장됨)
/*
if(currentTime - previousTime >= 10) { // 현재 시간값을 0.01s마다 10씩 증가시킴
previousTime = currentTime;
timeValue = currentTime / 10; // 0.01s 마다 10씩 증가된 숫자를 10으로 나누어 줌.
(결과적으로 0.01s마다 1씩 증가된 숫자가 timeValue에 저장됨)
*/
seg0 = (timeValue / 1000) % 10; // 현재 시간값 4자리에서 1000의 자리 숫자 저장
seg1 = (timeValue / 100) % 10; // 현재 시간값 4자리에서 100의 자리 숫자 저장
seg2 = (timeValue / 10) % 10; // 현재 시간값 4자리에서 10의 자리 숫자 저장
seg3 = timeValue % 10; // 현재 시간값 4자리에서 1의 자리 숫자 저장

data[0]=display.encodeDigit(seg0); // 첫번째 Segment에 1000의 자리 숫자 배열
data[1]=display.encodeDigit(seg1); // 두번째 Segment에 100의 자리 숫자 배열
data[2]=display.encodeDigit(seg2); // 세번째 Segment에 10의 자리 숫자 배열
data[3]=display.encodeDigit(seg3); // 네번째 Segment에 1의 자리 숫자 배열

display.setSegments(data);
Serial.println(timeValue);
}

if(currentTime>=1000000) { // 1,000,000ms(1000초) 후 millis() 리셋
timer0_millis = 0;
previousTime = 0;
}
}


millis() 함수를 이용하여 (분:초) 시계 만들기

※ 주의: seg0, seg1, seg2, seg3 등의 변수값이 1015사이의 값을 갖게되면 16진수(AF)로 표현되므로, 각 변수는 10보다 작은 값을 갖도록 해야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
extern volatile unsigned long timer0_millis;   // millis() 리셋을 위한 변수

#include <Arduino.h>
#include <TM1637Display.h>

// Module connection pins (Digital Pins)
#define CLK 4
#define DIO 7

unsigned long previousTime, currentTime; // 현재시간, 현재시간(ms)
int timeValue;
uint8_t data[] = { 0x00, 0x00, 0x00, 0x00 }; // 초기 출력값 0000
uint8_t segto;
int seg3, seg2, seg1, seg0;
int initTime = 5948; // 초기 시간 59분 48초

TM1637Display display(CLK, DIO);

void setup() {
display.setBrightness(7); // 0 ~ 15 (15가 가장 밝음)
// display.setBrightness(0x0f);

seg0 = (initTime / 1000) % 10; // 초기 시간값 4자리에서 1000의 자리 숫자 저장
seg1 = (initTime / 100) % 10; // 초기 시간값 4자리에서 100의 자리 숫자 저장
seg2 = (initTime / 10) % 10; // 초기 시간값 4자리에서 10의 자리 숫자 저장
seg3 = initTime % 10; // 초기 시간값 4자리에서 1의 자리 숫자 저장

Serial.begin(9600);
}

void loop() {
currentTime = millis(); // 현재 시간값을 측정

if(currentTime - previousTime >= 1000) { // 현재 시간값을 0.1s마다 100씩 증가시킴
previousTime = currentTime;
timeValue = currentTime / 1000; // 0.1s 마다 100씩 증가된 숫자를 100으로 나누어 줌.
// (결과적으로 0.1s마다 1씩 증가된 숫자가 timeValue에 저장됨)
seg3++;
if(seg3 == 10) {
seg3 = 0;
seg2++;
}
if(seg2 == 6 && seg3 == 0) {
seg2 = 0;
seg1++;
}
if(seg1 == 10) {
seg1 = 0;
seg0++;
}
if(seg0 == 6 && seg1 == 0) {
seg0 = 0;
seg1 = 0;
seg2 = 0;
seg3 = 0;
}

data[0]=display.encodeDigit(seg0); // 첫번째 Segment에 1000의 자리 숫자 배열
data[1]=display.encodeDigit(seg1); // 두번째 Segment에 100의 자리 숫자 배열
data[2]=display.encodeDigit(seg2); // 세번째 Segment에 10의 자리 숫자 배열
data[3]=display.encodeDigit(seg3); // 네번째 Segment에 1의 자리 숫자 배열

// 0.5초마다 콜론 깜박이기
segto = 0x80 | display.encodeDigit(seg1); // 분과 초사이의 콜론(:) 표시
display.setSegments(&segto,1,1);
delay(500); // 깜박임 딜레이
display.setSegments(data);
delay(500); // 깜박임 딜레이
}

if(currentTime>=86400000) { // 86,400,000ms(86,400초 = 24시간*60분/시간*60분/초) 후 millis() 리셋
timer0_millis = 0;
previousTime = 0;
}
}


다양한 표현방법 익히기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <Arduino.h>
#include <TM1637Display.h>

// Module connection pins (Digital Pins)
#define CLK 4
#define DIO 7

// The amount of time (in milliseconds) between tests
#define TEST_DELAY 2000

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
};

TM1637Display display(CLK, DIO);

void setup()
{
}

void loop()
{
int k;
uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 };

display.setBrightness(15); // 0 ~ 15 (15가 가장 밝음)
// display.setBrightness(0x0f);

// All segments on
display.setSegments(data);
delay(TEST_DELAY);

// Selectively set different digits
data[0] = display.encodeDigit(0);
data[1] = display.encodeDigit(1);
data[2] = display.encodeDigit(2);
data[3] = display.encodeDigit(3);
display.setSegments(data);
delay(TEST_DELAY);

/*
for(k = 3; k >= 0; k--) {
display.setSegments(data, 1, k);
delay(TEST_DELAY);
}
*/

display.clear();
display.setSegments(data+2, 2, 2);
// __23 -> data+2: data배열 0123에서 앞에 두 자리 건너 띄운 후,
// 2: 남은 숫자 중 2자리를 잘라서, 2: 앞의 2칸을 띄운 후 출력
delay(TEST_DELAY);

display.clear();
display.setSegments(data+2, 2, 1);
// _23_ -> data+2: data배열 0123에서 앞에 두 자리 건너 띄운 후,
// 2: 남은 숫자 중 2자리를 잘라서, 1: 앞의 1칸을 띄운 후 출력
delay(TEST_DELAY);

display.clear();
display.setSegments(data+1, 3, 1);
// _123 -> data+1: data배열 0123에서 앞에 한자리 건너 띄운 후,
// 3: 남은 숫자 중 3자리를 잘라서, 1: 앞의 1칸을 띄운 후 출력
delay(TEST_DELAY);

display.clear();
display.setSegments(data+3, 1, 2);
// __3_ -> data+2: data배열 0123에서 앞에 두 자리 건너 띄운 후,
// 1: 남은 숫자 중 1자리를 잘라서, 2: 앞의 2칸을 띄운 후 출력
delay(TEST_DELAY);

display.clear();
display.setSegments(data+3, 2, 1);
// _3__ -> data+2: data배열 0123에서 앞에 두 자리 건너 띄운 후,
// 2: 남은 숫자 중 2자리를 잘라서(3이 마지막 자리이므로 1자리만 자름)
// 2: 앞의 2칸을 띄운 후 출력
delay(TEST_DELAY);

// Show decimal numbers with/without leading zeros
display.showNumberDec(0, false); // Expect: ___0
delay(TEST_DELAY);
display.showNumberDec(0, true); // Expect: 0000
delay(TEST_DELAY);
display.showNumberDec(1, false); // Expect: ___1
delay(TEST_DELAY);
display.showNumberDec(1, true); // Expect: 0001
delay(TEST_DELAY);
display.showNumberDec(301, false); // Expect: _301
delay(TEST_DELAY);
display.showNumberDec(301, true); // Expect: 0301
delay(TEST_DELAY);
display.clear();
display.showNumberDec(14, false, 2, 1); // Expect: _14_
delay(TEST_DELAY);
display.clear();
display.showNumberDec(4, true, 2, 2); // Expect: __04
delay(TEST_DELAY);
display.showNumberDec(-1, false); // Expect: __-1
delay(TEST_DELAY);
display.showNumberDec(-12); // Expect: _-12
delay(TEST_DELAY);
display.showNumberDec(-999); // Expect: -999
delay(TEST_DELAY);
display.clear();
display.showNumberDec(-5, false, 3, 0); // Expect: _-5_
delay(TEST_DELAY);
display.showNumberHexEx(0xf1af); // Expect: f1Af
delay(TEST_DELAY);
display.showNumberHexEx(0x2c); // Expect: __2C
delay(TEST_DELAY);
display.showNumberHexEx(0xd1, 0, true); // Expect: 00d1
delay(TEST_DELAY);
display.clear();
display.showNumberHexEx(0xd1, 0, true, 2); // Expect: d1__
delay(TEST_DELAY);

// Run through all the dots
for(k=0; k <= 4; k++) {
display.showNumberDecEx(0, (0x80 >> k), true);
delay(TEST_DELAY);
}

display.showNumberDecEx(3141, (0x80 >> 0), true);
// 3.141 -> 0x80: dot출력, 0x40: 콜론출력, >>0: 첫번째 도트출력,
// true: 빈자리 0으로 채우기
delay(TEST_DELAY);

display.showNumberDecEx(243, (0x80 >> 1), false);
// _2.43 -> 0x80: dot출력, 0x40: 콜론출력, >>1: 두번째 도트출력,
// true: 빈자리 0으로 채우기
delay(TEST_DELAY);

display.showNumberDecEx(314, (0x80 >> 2), false);
// _31.4 -> 0x80: dot출력, 0x40: 콜론출력, >>2: 세번째 도트출력,
// false: 빈자리 채우지 않기
delay(TEST_DELAY);

display.showNumberDecEx(52, (0x80 >> 3), false);
// __52. -> 0x80: dot출력, 0x40: 콜론출력, >>3: 네번째 도트출력,
// false: 빈자리 채우지 않기
delay(TEST_DELAY);

// Brightness Test
for(k = 0; k < 4; k++)
data[k] = 0xff; // 모두 segment를 키는 data배열 선언
for(k = 0; k < 7; k++) {
display.setBrightness(k); // 밝기를 7단계에 걸쳐 점점 밝게 출력
display.setSegments(data);
delay(TEST_DELAY);
}

// On/Off test
for(k = 0; k < 4; k++) {
display.setBrightness(7, false); // Turn off
display.setSegments(data);
delay(TEST_DELAY);
display.setBrightness(7, true); // Turn on
display.setSegments(data);
delay(TEST_DELAY);
}

// Done!
display.setSegments(SEG_DONE);

// while(1);
}
Author

chemidot

Posted on

2018-09-02

Updated on

2021-11-17

Licensed under

댓글