컴퓨터
Arduino [강의 4강] 7세그먼트(7-Segment Display)
조이팜
2025. 12. 20. 15:29
1. 7세그먼트란 무엇인가?

7세그먼트는 이름 그대로 7개의 막대 모양 LED(세그먼트)를 '8'자 형태로 배열하여 숫자(0~9)와 일부 알파벳을 표시하는 장치입니다. 실제로는 소수점을 표시하는 점(DP, Decimal Point)을 포함해 총 8개의 LED가 들어 있습니다.

구조: 각 막대는 'a'부터 'g'까지 이름이 붙어 있으며, 어떤 막대에 불을 켜느냐에 따라 숫자가 결정됩니다.
공통 애노드(Common Anode): 모든 LED의 (+)단자가 묶여 있음. LOW 신호일 때 점등됩니다.
공통 캐소드(Common Cathode): 모든 LED의 (-)단자가 묶여 있음. HIGH 신호일 때 점등됩니다.

2. 사용 방법 (아두이노 연결)
|
7세그먼트 핀
|
세그먼트 이름
|
아두이노 디지털 핀
|
|
7번 핀
|
a
|
2번
|
|
6번 핀
|
b
|
3번
|
|
4번 핀
|
c
|
4번
|
|
2번 핀
|
d
|
5번
|
|
1번 핀
|
e
|
6번
|
|
9번 핀
|
f
|
7번
|
|
10번 핀
|
g
|
8번
|
|
5번 핀
|
DP
|
9번 (선택 사항)
|
|
3번 또는 8번
|
COM
|
GND (공통 캐소드 기준)
|
아두이노에서 7세그먼트를 제어하려면 각 LED 막대마다
저항(약 220~330Ω)을 연결해야 합니다.
아두이노의 디지털 핀 7~8개를 사용하여 각 세그먼트를 `digitalWrite()`로 제어합니다.
핀 번호를 일일이 제어하기 번거로우므로 보통 배열(Array)을 사용하여 숫자에 따른 LED 패턴을 미리 저장해 두고 사용합니다.
void setup() {
// 2번부터 9번까지 모든 핀을 출력 모드로 설정
for (int i = 2; i <= 9; i++) {
pinMode(i, OUTPUT);
}
}
void loop() {
// 모든 세그먼트 켜기 (공통 캐소드는 HIGH일 때 켜짐)
for (int i = 2; i <= 9; i++) {
digitalWrite(i, HIGH);
delay(1000);
}
delay(1000);
// 모든 세그먼트 끄기
for (int i = 2; i <= 9; i++) {
digitalWrite(i, LOW);
}
delay(1000);
}
|
숫자
|
a
|
b
|
c
|
d
|
e
|
f
|
g
|
2진수 표기 (g~a 순서)
|
|
0
|
ON
|
ON
|
ON
|
ON
|
ON
|
ON
|
OFF
|
B00111111
|
|
1
|
OFF
|
ON
|
ON
|
OFF
|
OFF
|
OFF
|
OFF
|
B00000110
|
|
2
|
ON
|
ON
|
OFF
|
ON
|
ON
|
OFF
|
ON
|
B01011011
|
// 1. 세그먼트 핀 배열 정의 (a, b, c, d, e, f, g 순서)
int segments[] = {2, 3, 4, 5, 6, 7, 8};
// 2. 0~9까지 숫자를 만들기 위한 비트 패턴 (공통 캐소드용)
// 0번째 인덱스는 '0', 1번째는 '1'... 순서입니다.
byte digits[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
void setup() {
// 모든 세그먼트 핀을 출력(OUTPUT)으로 설정
for (int i = 0; i < 7; i++) {
pinMode(segments[i], OUTPUT);
}
}
void loop() {
// 0부터 9까지 반복 출력
for (int i = 0; i < 10; i++) {
displayDigit(i); // 숫자 출력 함수 호출
delay(1000); // 1초 대기
}
}
// 숫자를 받아서 7세그먼트에 불을 켜주는 핵심 함수
void displayDigit(int num) {
for (int i = 0; i < 7; i++) {
// bitRead 함수를 사용하여 digits[num]의 각 비트가 1인지 0인지 확인
// i가 0이면 a핀, 1이면 b핀... 순서로 제어함
digitalWrite(segments[i], bitRead(digits[num], i));
}
}
// 디지털 주사위 만들기
// 7세그먼트 핀 (a, b, c, d, e, f, g 순서)
int segments[] = {2, 3, 4, 5, 6, 7, 8};
// 버튼 핀
const int buttonPin = 12;
// 1~6까지의 숫자 패턴 (공통 캐소드 FND500용)
byte dicePatterns[7] = {
0b00000000, // 0 (사용 안 함)
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101 // 6
};
void setup() {
// 세그먼트 핀 설정
for (int i = 0; i < 7; i++) {
pinMode(segments[i], OUTPUT);
}
// 버튼 핀 설정 (내부 풀업 저항 사용)
pinMode(buttonPin, INPUT_PULLUP);
// 무작위 시드 초기화 (아무것도 연결 안 된 아날로그 핀 읽기)
randomSeed(analogRead(0));
}
void loop() {
// 버튼이 눌렸는지 확인 (PULLUP이므로 눌리면 LOW)
if (digitalRead(buttonPin) == LOW) {
// 1. 버튼을 누르는 동안 숫자가 빠르게 변하는 효과 (주사위 굴리기)
while (digitalRead(buttonPin) == LOW) {
int rolling = random(1, 7); // 1~6 무작위
displayDigit(rolling);
delay(50); // 숫자가 변하는 속도
}
// 2. 버튼에서 손을 떼면 최종 숫자 결정
int result = random(1, 7);
// 3. 당첨 숫자 깜빡이기 효과 (선택 사항)
for(int i=0; i<3; i++) {
displayDigit(0); // 잠시 끄기
delay(100);
displayDigit(result); // 결과 켜기
delay(100);
}
}
}
// 숫자를 세그먼트에 표시하는 함수
void displayDigit(int num) {
for (int i = 0; i < 7; i++) {
digitalWrite(segments[i], bitRead(dicePatterns[num], i));
}
}반응형