[아두이노] 7 세그먼트

yun·2023년 9월 20일

7 세그먼트?


세븐 세그먼트는 위 이미지와 같이 A부터 G까지 7개의 LED 파트를 가진 부품이다.

10개의 핀이 있고, 제품에 따라 연결 위치가 조금씩 다른데, 5011AS 제품은 아래와 같이 위아래에 핀이 있다.

A부터 G까지의 핀을 꽂고, 가운데의 그라운드(GND, com, - 등으로 표기 방법은 사이트마다 다를 수 있다) 핀은 둘 중 하나만 아두이노의 그라운드와 연결하면 된다.


3611AS 제품은 양옆에 핀이 있는데, 우측과 좌측에 하나씩 있는 그라운드 중 하나만 아두이노의 그라운드와 연결한다.

과전류를 방지하기 위해 220v 저항을 그라운드 핀과 연결 선 사이에 꽂아주자.

변수 선언

const int BUTTON = 13;  // click을 전달할 스위치 버튼
const int segmentPin[] = {2, 3, 4, 5, 6, 7, 8};  // 세그먼트와 연결한 digital IO의 핀 번호
const int digits[10][7] = {
  {1, 1, 1, 1, 1, 1, 0},
  {0, 1, 1, 0, 0, 0, 0},
  {1, 1, 0, 1, 1, 0, 1},
  {1, 1, 1, 1, 0, 0, 1},
  {0, 1, 1, 0, 0, 1, 1},
  {1, 0, 1, 1, 0, 1, 1},
  {1, 0, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 0, 1, 0},
  {1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 0, 1, 1}
};  // 0부터 9일 때 어느 불을 밝힐지 선언한 2차원 배열
int clicks = 0;  // 숫자 0~9를 나타낼 클릭
int buttonState = 0;  // 버튼 토글 구현

setup

void setup() {
  pinMode(BUTTON, INPUT);

  int segmentCount = sizeof(segmentPin);
  for (int i=0; i < segmentCount; i++) {
    pinMode(segmentPin[i], OUTPUT);
  }

  Serial.begin(9600);
}

13번 핀으로 입력을 받고,
2번부터 8번 핀으로 출력을 보내도록 설정

함수 1: buttonPress

void buttonPress() {
  buttonState = !buttonState;
  if (clicks == 9) {
    clicks = 0;
  }
  else {
    clicks++;
  }
  delay(200);
}
  • 버튼 클릭을 전달
  • clicks가 9이면 0으로 초기화
  • clicks가 0부터 8 사이의 값이면 클릭 1번에 1 증가
  • loop 안에서 실행 시 delay가 없으면 한번에 많이 증가하므로 0.2초 딜레이 부여

함수 2: showDigit

void showDigit(int clicks) {
  for (int i=0; i < 7; i++) {
    if (digits[clicks][i] == 1) {
      digitalWrite(segmentPin[i], HIGH);
    }
    else {
      digitalWrite(segmentPin[i], LOW);
    }
  }
}
  • clicks 숫자로 digits에서 배열을 찾음
  • 그 배열에서 1 값인 인덱스의 핀을 켬
  • 0 값인 인덱스의 핀을 끔

loop

void loop() {
  if(digitalRead(13) == 1) {
    buttonPress();
    Serial.println(clicks);
    showDigit(clicks);
  }
}
  • 스위치를 눌리면 buttonPress 함수 실행
  • 현재 clicks를 Serial Monitor에 프린트
  • showDigit 함수 실행 (현재 clicks에 맞게 세그먼트에 표시)

0개의 댓글