[ 7์ธ๊ทธ๋จผํธ ํ์ ์ฅ์น(7-segment display) ]
- 7๊ฐ์ ์ ๋ถ์ผ๋ก ์ซ์๋ ๊ธ์๋ฅผ ํ์ํ๊ธฐ ์ํด LED๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ ์ถ๋ ฅ ์ฅ์น
- 7๊ฐ ์ ๋ถ์ ์์์ ํ์๋ฅผ ์ํ LED(dp)๊ฐ ์ถ๊ฐ๋ 8๊ฐ์ ์ธ๊ทธ๋จผํธ๋ค์ 1๋ฐ์ดํธ์ ๋ฐ์ดํฐ๋ก ์ ์ด ๊ฐ๋ฅ
- FND(Flexible Numeric Display)๋ผ๊ณ ๋ ๋ถ๋ฆ
- ํ์ ์ฅ์น์ 10๊ฐ ํ ์ค 2๊ฐ๋ VCC/GND๋ฅผ ์ฐ๊ฒฐํ๋ ๊ณตํต ํ
- ๋๋จธ์ง 8๊ฐ์ ํ์ ํด๋น ์ธ๊ทธ๋จผํธ๋ฅผ ์ ์ดํ๋ ์ ์ดํ
// 0~9๊น์ง ์ซ์ ํํ์ ์ํ
// ์ธ๊ทธ๋จผํธ a, b, c, d, e, f, g, dp์ ํจํด
byte patterns[] = {
0xFC, // 0b 1111 1100 -> 0
0x60, // 0b 0110 0000 -> 1
0xDA, // 0b 1101 1010 -> 2
0xF2, // 0b 1111 0010 -> 3
0x66, // 0b 0110 0110 -> 4
0xB6, // 0b 1011 0110 -> 5
0xBE, // 0b 1011 1110 -> 6
0xE4, // 0b 1110 0100 -> 7
0xFE, // 0b 1111 1110 -> 8
0xE6, // 0b 1110 0110 -> 9
};
[ 4์๋ฆฌ 7์ธ๊ทธ๋จผํธ ํ์์ฅ์น ]
- 1์๋ฆฌ 7์ธ๊ทธ๋จผํธ ํ์ ์ฅ์น์ ์ ์ด๋ฅผ ์ํด์๋ 8๊ฐ์ ์ ์ด์ ์ด ํ์ํ์.
- 1์๋ฆฌ 7์ธ๊ทธ๋จผํธ ํ์ ์ฅ์น๋ฅผ ํตํด ๋ค์๋ฆฌ์์ ์ซ์๋ฅผ ์ถ๋ ฅํ๊ณ ์ ํ๋ค๋ฉด
32๊ฐ์ ์ ์ด์ ์ด ํ์ํจ.
- ์๋์ด๋ ธ ์ฐ๋ ธ๋ ์ต๋ 20๊ฐ์ ๋์งํธ ์ ์ถ๋ ฅ ํ๋ง์ ์ ๊ณตํ๋ฏ๋ก ๋ถ๊ฐ๋ฅํจ.
- ์ด ๋ 4์๋ฆฌ ์ธ๊ทธ๋จผํธ ์ฅ์น์ ๊ฒฝ์ฐ๋ 1์๋ฆฌ ์ธ๊ทธ๋จผํธ ์ฅ์น์ ๋ค๋ฅธ ๋ฐฉ์์ ์ฌ์ฉ
- ์ธ๊ฐ ๋์ ๋ฐ์์๋๋ ๊ทธ๋ ๊ฒ ๋น ๋ฅด์ง ์๊ธฐ ๋๋ฌธ์ ์์๊ฐ์ ๋ฌผ๊ฑด์ด ์ฌ๋ผ์ง๋ ๊ฒฝ์ฐ
์ ๊น์ ์ฌ๋ผ์ง ๊ฒ์ ์ธ์ํ์ง ๋ชปํจ(์์ ํจ๊ณผ)
- ์ด๋ฅผ ํ์ฉํ์ฌ 4์๋ฆฌ 7์ธ๊ทธ๋จผํธ ์ฅ์น์์ ํ๋ฒ์ ํ์๋ฆฌ ์๋ฅผ ํ์ํ๊ณ ๋น ๋ฅธ ์๋๋ก
์๋ฆฌ์๋ฅผ ๋ฐ๊พธ์ด ํ์ํ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ค๋ฉด ์์ํจ๊ณผ์ ์ํด 4์๋ฆฌ ์ซ์๊ฐ ํ์๋๋ ๊ฒ์ผ๋ก
๋ณด์ด๊ฒ ๋๋ค.
- ์์ ํจ๊ณผ๋ฅผ ์ด์ฉํ๋ 4์๋ฆฌ 7์ธ๊ทธ๋จผํธ ํ์ ์ฅ์น๋ 32๊ฐ๊ฐ ์๋ 12๊ฐ์ ํ๋ง์ผ๋ก ์๋ ๊ฐ๋ฅ
1์๋ฆฌ 7์ธ๊ทธ๋จผํธ ํ์ ์ฅ์น | 4์๋ฆฌ 7์ธ๊ทธ๋จผํธ ํ์ ์ฅ์น | |
์ถ๋ ฅ | 1์๋ฆฌ ์ซ์ ํํ ๊ฐ๋ฅ | 4์๋ฆฌ ์ซ์ ํํ ๊ฐ๋ฅ |
ํ ์ฌ์ฉ | ๊ณตํตํ 8๊ฐ (a, b, c, d, e, f, g, dp) | |
4๊ฐ์ ์๋ฆฌ ์ ํํ (๊ฐ ์๋ฆฟ์ ์ ํ) Digit 1, Digit 2, Digit 3, Digit 4 |
- (A) ๊ทธ๋ฆผ์ ๋ณด๋ฉด 12, 9, 8, 6ํ์ ์๋ฆฌ ์ ํํ์ผ๋ก ์ฌ์ฉ๋๊ณ ์์
- 8๊ฐ์ ์ธ๊ทธ๋จผํธ๋ฅผ ์ ์ดํ๋ ํ์ ๊ฐ ์๋ฆฌ์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ ์ค
- ํด๋น ๊ทธ๋ฆผ์์๋ ๊ณตํต ์๊ทน ๋ฐฉ์์ผ๋ก ํ๋ก๋ฅผ ๊ตฌ์ฑํ๊ณ ์์ผ๋ฏ๋ก,
12๋ฒ ํ์ LOW ๊ฐ์ ํ ๋นํ๊ณ , 8๊ฐ์ ๊ณตํต ์ ์ดํ์ 0xFC(0)๋ฅผ ์ ๋ฌํ๋ฉด ์ฒซ๋ฒ์งธ ์๋ฆฌ์ 0 ํ์
์ด ๋ ๋ค๋ฅธ ์๋ฆฟ์ ์ ํํ์๋ HIGH ๊ฐ์ ํ ๋นํด์ผํจ
- 12, 9,ํ์ HIGH, 8,6๋ฒํ์ LOW ๊ฐ์ ํ ๋น ํ ๊ฒฝ์ฐ 0 0 x x ํ์
4์๋ฆฌ 7์ธ๊ทธ๋จผํธ ํ์ ์ฅ์น์ ์ซ์ ํ์๋ฆฌ ํ์
// C++ code
// ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์๋ฆฌ๋ฅผ ์ฎ๊ฒจ ๊ฐ๋ฉด์ ์ซ์๋ฅผ ํ์
// ๊ฐ ์๋ฆฟ์๋ง๋ค ํ๋ฒ์ฉ ํ์ํ ํ 0~9๊น์ง ์ซ์๋ฅผ ๋ฐ๋ณตํ์ฌ ํ์
byte patterns[10] = {
0xFC, // 0b 1111 1100 -> 0
0x60, // 0b 0110 0000 -> 1
0xDA, // 0b 1101 1010 -> 2
0xF2, // 0b 1111 0010 -> 3
0x66, // 0b 0110 0110 -> 4
0xB6, // 0b 1011 0110 -> 5
0xBE, // 0b 1011 1110 -> 6
0xE4, // 0b 1110 0100 -> 7
0xFE, // 0b 1111 1110 -> 8
0xE6, // 0b 1110 0110 -> 9
};
// ์๋ฆฟ์ ์ ํ ํ
int digit_pin[4] = {5, 4, 3, 2};
// ์ธ๊ทธ๋จผํธ ๋ชจ๋ ์ฐ๊ฒฐ ํ(a,b,c,d,e,f,g, dp)
int seg_pin[8] = {13, 12, 11, 10, 9, 8, 7, 6};
void setup()
{
// ์๋ฆฟ์ ์ ํ ํ ์ถ๋ ฅ ์ค์
for(int i=0; i<4; i++)
pinMode(digit_pin[i], OUTPUT);
// ์ธ๊ทธ๋จผํธ ์ ์ด ํ ์ถ๋ ฅ ์ค์
for(int j=0; j<8; j++)
pinMode(seg_pin[j], OUTPUT);
}
// ํด๋น ์๋ฆฟ์์ ์ซ์ ํ๋๋ฅผ ํ์ํ๋ ํจ์
void show_digit(int pos, int num){
// ์ธ์๋ก ๋ฐ๋ pos(์๋ฆฟ์) ์์น์ ํ๋ง์ ํ์
for(int i=0; i<4; i++){
if(i+1 == pos)
digitalWrite(digit_pin[i], LOW);
else
digitalWrite(digit_pin[i], HIGH);
}
// ์ธ๊ทธ๋จผํธ ๋ชจ๋ ํ ์ฐ๊ฒฐ ํ(a,b,c,d,e,f,g, dp) ์ ์ด
for(int j=0; j<8; j++){
boolean on_off = bitRead(patterns[num], 7-j);
digitalWrite(seg_pin[j], on_off);
}
}
void loop()
{
for(int n=0; n<10; n++){
for(int pos=1; pos<=4; pos++){
show_digit(pos, n);
delay(200);
}
}
}
4์๋ฆฌ 7์ธ๊ทธ๋จผํธ ํ์ ์ฅ์น์ ์นด์ดํฐ ๊ฐ ํ์
// C++ code
// 4์๋ฆฌ 7์ธ๊ทธ๋จผํธ ์ฅ์น์ 4์๋ฆฌ ์ซ์ ํ์
// 0.1์ด ๊ฐ๊ฒฉ์ผ๋ก ์ซ์ ์ฆ๊ฐ 0~9999
byte patterns[10] = {
0xFC, // 0b 1111 1100 -> 0
0x60, // 0b 0110 0000 -> 1
0xDA, // 0b 1101 1010 -> 2
0xF2, // 0b 1111 0010 -> 3
0x66, // 0b 0110 0110 -> 4
0xB6, // 0b 1011 0110 -> 5
0xBE, // 0b 1011 1110 -> 6
0xE4, // 0b 1110 0100 -> 7
0xFE, // 0b 1111 1110 -> 8
0xE6, // 0b 1110 0110 -> 9
};
// ์๋ฆฟ์ ์ ํ ํ
int digit_pin[4] = {5, 4, 3, 2};
// ์ธ๊ทธ๋จผํธ ๋ชจ๋ ์ฐ๊ฒฐ ํ(a,b,c,d,e,f,g, dp)
int seg_pin[8] = {13, 12, 11, 10, 9, 8, 7, 6};
int count = 0;
int SEGMENT_DELAY = 5;
unsigned long time_previous, time_current;
void setup()
{
// ์๋ฆฟ์ ์ ํ ํ ์ถ๋ ฅ ์ค์
for(int i=0; i<4; i++)
pinMode(digit_pin[i], OUTPUT);
// ์ธ๊ทธ๋จผํธ ์ ์ด ํ ์ถ๋ ฅ ์ค์
for(int j=0; j<8; j++)
pinMode(seg_pin[j], OUTPUT);
time_previous = millis();
}
// ํด๋น ์๋ฆฟ์์ ์ซ์ ํ๋๋ฅผ ํ์ํ๋ ํจ์
void show_digit(int pos, int num){
// ์ธ์๋ก ๋ฐ๋ pos(์๋ฆฟ์) ์์น์ ํ๋ง์ ํ์
for(int i=0; i<4; i++){
if(i+1 == pos)
digitalWrite(digit_pin[i], LOW);
else
digitalWrite(digit_pin[i], HIGH);
}
// ์ธ๊ทธ๋จผํธ ๋ชจ๋ ํ ์ฐ๊ฒฐ ํ(a,b,c,d,e,f,g, dp) ์ ์ด
for(int j=0; j<8; j++){
boolean on_off = bitRead(patterns[num], 7-j);
digitalWrite(seg_pin[j], on_off);
}
}
void show_4_digit(int n){
n = n % 10000; // 4์๋ฆฌ๋ก ์ ํ
int n4 = n / 1000; // ์ฒ ์๋ฆฌ
n = n % 1000;
int n3 = n / 100; // ๋ฐฑ ์๋ฆฌ
n = n % 100;
int n2 = n / 10; // ์ญ ์๋ฆฌ
int n1 = n % 10; // ํ ์๋ฆฌ
show_digit(1, n4);
delay(SEGMENT_DELAY);
show_digit(2, n3);
delay(SEGMENT_DELAY);
show_digit(3, n2);
delay(SEGMENT_DELAY);
show_digit(4, n1);
delay(SEGMENT_DELAY);
}
void loop()
{
time_current = millis();
if(time_current - time_previous >= 100){
time_previous = time_current;
count++;
}
show_4_digit(count);
}
4์๋ฆฌ 7์ธ๊ทธ๋จผํธ ํ์ ์ฅ์น์ ๊ฐ๋ณ์ ํญ ๊ฐ ํ์
// C++ code
// ๊ฐ๋ณ์ ํญ ๊ฐ์ ์๋ ๋ก๊ทธ ์ ํธ๋ฅผ ํตํด ์ธ๊ทธ๋จผํธ ์ฅ์น์ ํํ
byte patterns[10] = {
0xFC, // 0b 1111 1100 -> 0
0x60, // 0b 0110 0000 -> 1
0xDA, // 0b 1101 1010 -> 2
0xF2, // 0b 1111 0010 -> 3
0x66, // 0b 0110 0110 -> 4
0xB6, // 0b 1011 0110 -> 5
0xBE, // 0b 1011 1110 -> 6
0xE4, // 0b 1110 0100 -> 7
0xFE, // 0b 1111 1110 -> 8
0xE6, // 0b 1110 0110 -> 9
};
// ์๋ฆฟ์ ์ ํ ํ
int digit_pin[4] = {5, 4, 3, 2};
// ์ธ๊ทธ๋จผํธ ๋ชจ๋ ์ฐ๊ฒฐ ํ(a,b,c,d,e,f,g, dp)
int seg_pin[8] = {13, 12, 11, 10, 9, 8, 7, 6};
int SEGMENT_DELAY = 5;
void setup()
{
// ์๋ฆฟ์ ์ ํ ํ ์ถ๋ ฅ ์ค์
for(int i=0; i<4; i++)
pinMode(digit_pin[i], OUTPUT);
// ์ธ๊ทธ๋จผํธ ์ ์ด ํ ์ถ๋ ฅ ์ค์
for(int j=0; j<8; j++)
pinMode(seg_pin[j], OUTPUT);
}
// ํด๋น ์๋ฆฟ์์ ์ซ์ ํ๋๋ฅผ ํ์ํ๋ ํจ์
void show_digit(int pos, int num){
// ์ธ์๋ก ๋ฐ๋ pos(์๋ฆฟ์) ์์น์ ํ๋ง์ ํ์
for(int i=0; i<4; i++){
if(i+1 == pos)
digitalWrite(digit_pin[i], LOW);
else
digitalWrite(digit_pin[i], HIGH);
}
// ์ธ๊ทธ๋จผํธ ๋ชจ๋ ํ ์ฐ๊ฒฐ ํ(a,b,c,d,e,f,g, dp) ์ ์ด
for(int j=0; j<8; j++){
boolean on_off = bitRead(patterns[num], 7-j);
digitalWrite(seg_pin[j], on_off);
}
}
void show_4_digit(int _n){
int n = _n;
n = n % 10000; // 4์๋ฆฌ๋ก ์ ํ
int n4 = n / 1000; // ์ฒ ์๋ฆฌ
n = n % 1000;
int n3 = n / 100; // ๋ฐฑ ์๋ฆฌ
n = n % 100;
int n2 = n / 10; // ์ญ ์๋ฆฌ
int n1 = n % 10; // ํ ์๋ฆฌ
if(_n > 999)
show_digit(1, n4);
delay(SEGMENT_DELAY);
if(_n > 99)
show_digit(2, n3);
delay(SEGMENT_DELAY);
if(_n > 9)
show_digit(3, n2);
delay(SEGMENT_DELAY);
show_digit(4, n1);
delay(SEGMENT_DELAY);
}
void loop()
{
int reading = analogRead(A0);
show_4_digit(reading);
}
4์๋ฆฌ 7์ธ๊ทธ๋จผํธ ํ์ ์ฅ์น์ ์๊ฐ ํ์
// C++ code
// 4์๋ฆฌ ์ซ์๊ฐ ๋ชจ๋ ํ์
// 60์ด๋ 60๋ถ์ด ๋ ๊ฒฝ์ฐ 0์ผ๋ก ๋๋์๊ฐ๋ค.
byte patterns[10] = {
0xFC, // 0b 1111 1100 -> 0
0x60, // 0b 0110 0000 -> 1
0xDA, // 0b 1101 1010 -> 2
0xF2, // 0b 1111 0010 -> 3
0x66, // 0b 0110 0110 -> 4
0xB6, // 0b 1011 0110 -> 5
0xBE, // 0b 1011 1110 -> 6
0xE4, // 0b 1110 0100 -> 7
0xFE, // 0b 1111 1110 -> 8
0xE6, // 0b 1110 0110 -> 9
};
// ์๋ฆฟ์ ์ ํ ํ
int digit_pin[4] = {5, 4, 3, 2};
// ์ธ๊ทธ๋จผํธ ๋ชจ๋ ์ฐ๊ฒฐ ํ(a,b,c,d,e,f,g, dp)
int seg_pin[8] = {13, 12, 11, 10, 9, 8, 7, 6};
int SEGMENT_DELAY = 5;
unsigned long time_previous, time_current;
int min=0, sec = 0;
void setup()
{
// ์๋ฆฟ์ ์ ํ ํ ์ถ๋ ฅ ์ค์
for(int i=0; i<4; i++)
pinMode(digit_pin[i], OUTPUT);
// ์ธ๊ทธ๋จผํธ ์ ์ด ํ ์ถ๋ ฅ ์ค์
for(int j=0; j<8; j++)
pinMode(seg_pin[j], OUTPUT);
time_previous = millis();
}
// ํด๋น ์๋ฆฟ์์ ์ซ์ ํ๋๋ฅผ ํ์ํ๋ ํจ์
void show_digit(int pos, int num){
// ์ธ์๋ก ๋ฐ๋ pos(์๋ฆฟ์) ์์น์ ํ๋ง์ ํ์
for(int i=0; i<4; i++){
if(i+1 == pos)
digitalWrite(digit_pin[i], LOW);
else
digitalWrite(digit_pin[i], HIGH);
}
// ์ธ๊ทธ๋จผํธ ๋ชจ๋ ํ ์ฐ๊ฒฐ ํ(a,b,c,d,e,f,g, dp) ์ ์ด
for(int j=0; j<8; j++){
boolean on_off = bitRead(patterns[num], 7-j);
digitalWrite(seg_pin[j], on_off);
}
}
// 4์๋ฆฌ 7์ธ๊ทธ๋จผํธ ํ์ ์ฅ์น์ 4์๋ฆฌ ์ซ์ ํ์ ํจ์
void show_4_digit(int n){
n = n % 10000; // 4์๋ฆฌ๋ก ์ ํ
int n4 = n / 1000; // ์ฒ ์๋ฆฌ
n = n % 1000;
int n3 = n / 100; // ๋ฐฑ ์๋ฆฌ
n = n % 100;
int n2 = n / 10; // ์ญ ์๋ฆฌ
int n1 = n % 10; // ํ ์๋ฆฌ
show_digit(1, n4);
delay(SEGMENT_DELAY);
show_digit(2, n3);
delay(SEGMENT_DELAY);
show_digit(3, n2);
delay(SEGMENT_DELAY);
show_digit(4, n1);
delay(SEGMENT_DELAY);
}
void loop()
{
time_current = millis();
if(time_current - time_previous >= 1000){
time_previous = time_current;
sec++;
if(sec == 60){ // 60์ด๊ฐ ๋ ๊ฒฝ์ฐ ๋ถ ์ฆ๊ฐ
sec = 0;
min++;
}
if(min == 60) // 60๋ถ์ด ๋ ๊ฒฝ์ฐ ์ด๊ธฐํ
min = 0;
}
show_4_digit(min*100 + sec);
}