컴퓨터

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));
  }
}
반응형