본문 바로가기

관리하지않음/아두이노

[아두이노] 4자리 7세그먼트 사용법 및 예제 - 카운터, 스톱워치

[Arduino] 7세그먼트 기초 사용법

 

7세그먼트 사용법에 이은 4자리 7 Segment 기초 사용법 포스팅입니다.

아두이노 보드 구성, 숫자 9876을 표시하는 방법, 카운터 만들기, 스톱워치 만들기를 직접 해보고 정리했습니다.

 

1. 아두이노 보드 구성

4자리 7세그먼트는 아래와 같이 12개의 핀으로 구성되어 있습니다.

4자리 7세그먼트 핀

E, D, DP, C, G, 4, 1, A, F, 2, 3 B핀을 순서대로 아두이노 핀 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13에 연결했습니다.

모두 연결해준 모습은 아래와 같습니다.

4자리 7세그먼트 보드 구성

2. 숫자 9876 표시하기

4자리 7세그먼트는 한꺼번에 숫자가 표시되는게 아닙니다.

9876을 예로 들자면, 9XXX, X8XX, XX7X, XXX6이 순서대로 빛이 들어오는데, 그 속도가 매우 빨라 인간의 눈으로 구분할 수 없기 때문에 동시에 표시되는 것 처럼 보입니다.

 

그렇기 때문에 9876을 표시하기 위해서는, 원하는 Segment의 위치와 원하는 숫자를 입력해서 표시해야 합니다.
9876을 표시하는 코드는 아래와 같습니다.

// 핀 번호 선언
int pos_pins[] = {8,11,12,7}; // 몇번째 세그먼트
int num_of_pos = 4;
int pins[] = {9,13,5,3,2,10,6,4}; // 세그먼트 a, b, c, d, e, f, g, dp
int num_of_pins = 8;
int delaytime = 5;

// 세그먼트에 표시 할 숫자
bool segment[10][8] = {
  {true, true, true, true, true, true, false, false}, //0
  {false, true, true, false, false, false, false, false}, //1
  {true, true, false, true, true, false, true, false}, //2
  {true, true, true, true, false, false, true, false}, //3
  {false, true, true, false, false, true, true, false}, //4
  {true, false, true, true, false, true, true, false}, //5
  {true, false, true, true, true, true, true, false}, //6
  {true, true, true, false, false, false, false, false}, //7
  {true, true, true, true, true, true, true, false}, //8
  {true, true, true, true, false, true, true, false} //9
};

void setup() {
  for(int i=0; i<num_of_pos; i++) {
     pinMode(pos_pins[i], OUTPUT);
  }
  for(int i=0; i<num_of_pins; i++) {
    pinMode(pins[i], OUTPUT);
  }
}

void loop() {
  int num[] = {9, 8, 7, 6};
  digits_4_seven_segment(num);
}

// 원하는 위치에 표시되도록 set
void set_position(int pos){
  for(int i = 0; i < 4; i++) {
    if(i + 1 == pos){
      digitalWrite(pos_pins[i], LOW);
    } else {
      digitalWrite(pos_pins[i], HIGH);
    }
  }
}

// 원하는 숫자 표시
void set_number(int number){
  for(int i=0;i<num_of_pins;++i){ 
    segment[number][i] ? digitalWrite(pins[i], HIGH) : digitalWrite(pins[i], LOW); 
  }
}

// 원하는 위치, 원하는 숫자를 표시
void set_seven_segment(int pos, int number){
  set_position(pos);
  set_number(number);
}

// 입력된 4자리 숫자를 세그먼트에 표시
void digits_4_seven_segment(int num[]){
  for(int i=0;i<num_of_pos;++i){
    set_seven_segment(i+1,num[i]);
    delay(delaytime);
  }
}

코드에 간단하게 주석을 달아놓았습니다.

 

digits_4_seven_segment --> set_seven_segment --> set_position, set_number 함수 순으로 이해하면 카운터 만들기 코드도 빠르게 이해하실 수 있습니다.

 

3. 택틱스위치를 활용한 카운터 만들기

택틱스위치를 사용해서 버튼을 누르면 숫자가 커지는 카운터를 만들어 보겠습니다.

택틱스위치는 A0, GND에 연결해줍니다.

 

4자리까지 표시가 가능하므로 0 ~ 9999까지 표시가 가능합니다.

cnt 변수를 선언한 후, 버튼이 눌렸을 때 +1을 하고, 만약 10000이 되었다면 0이 되도록 코드를 짰습니다.

 

또, 숫자의 각 자릿수를 받아오기 위해서 나머지를 구하는 % 연산을 사용했습니다.

만약 cnt가 123이라면,

i=0 : 3

i=1 : 2

i=2 : 1

i=3 : 0

이 되도록, cnt%10으로 나머지를 구한 후 cnt/10을 해줬습니다.

 

전체 코드는 아래와 같습니다.

int pos_pins[] = {8,11,12,7}; // 몇번째 세그먼트
int num_of_pos = 4;
int pins[] = {9,13,5,3,2,10,6,4}; // 세그먼트 a, b, c, d, e, f, g, dp
int num_of_pins = 8;
int button = A0;
int delaytime = 5;
int cnt = 0;

bool segment[10][8] = {
  {true, true, true, true, true, true, false, false}, //0
  {false, true, true, false, false, false, false, false}, //1
  {true, true, false, true, true, false, true, false}, //2
  {true, true, true, true, false, false, true, false}, //3
  {false, true, true, false, false, true, true, false}, //4
  {true, false, true, true, false, true, true, false}, //5
  {true, false, true, true, true, true, true, false}, //6
  {true, true, true, false, false, false, false, false}, //7
  {true, true, true, true, true, true, true, false}, //8
  {true, true, true, true, false, true, true, false} //9
};

void setup() {
  for(int i=0; i<num_of_pos; i++) {
     pinMode(pos_pins[i], OUTPUT);
  }
  for(int i=0; i<num_of_pins; i++) {
    pinMode(pins[i], OUTPUT);
  }
  pinMode(button, INPUT_PULLUP);
}

void loop() {
  if(digitalRead(button) == LOW){
    cnt = cnt+1; 
    if(cnt == 10000) cnt = 0;
    delay(150); 
  }
  digits_4_seven_segment(cnt);
}

void set_position(int pos){
  for(int i = 0; i < num_of_pos; i++) {
    if(i == pos-1){
      digitalWrite(pos_pins[i], LOW);
    } else {
      digitalWrite(pos_pins[i], HIGH);
    }
  }
}

void set_number(int number){
  for(int i=0;i<num_of_pins;++i){ 
    segment[number][i] ? digitalWrite(pins[i], HIGH) : digitalWrite(pins[i], LOW); 
  }
}

void set_seven_segment(int pos, int number){
  set_position(pos);
  set_number(number);
}

void digits_4_seven_segment(int num){
  for(int i=4;i>0;--i){
    set_seven_segment(i,num%10);
    delay(delaytime);
    num = num/10;
  }
}

 

4자리 7세그먼트 카운터 동작 영상

4. 스톱워치 만들기

앞의 두자리는 분(minute), 뒤의 두자리는 초(seconds)를 표시하도록 만들었습니다.

 

seonds가 60이 되면 minute에 +1을 하고, seconds는 다시 0으로 만들어줍니다.

이전 시각과, loop 안에서 현재시각의 차이가 1초가 나면 seconds, minute 값에 변화를 주고, 아니라면 이전 값을 계속 출력합니다.

int pos_pins[] = {8,11,12,7}; // 몇번째 세그먼트
int num_of_pos = 4;
int pins[] = {9,13,5,3,2,10,6,4}; // 세그먼트 a, b, c, d, e, f, g, dp
int num_of_pins = 8;
int button = A0;
int delaytime = 5;

int minute = 0;
int seconds = 0;

bool segment[10][8] = {
  {true, true, true, true, true, true, false, false}, //0
  {false, true, true, false, false, false, false, false}, //1
  {true, true, false, true, true, false, true, false}, //2
  {true, true, true, true, false, false, true, false}, //3
  {false, true, true, false, false, true, true, false}, //4
  {true, false, true, true, false, true, true, false}, //5
  {true, false, true, true, true, true, true, false}, //6
  {true, true, true, false, false, false, false, false}, //7
  {true, true, true, true, true, true, true, false}, //8
  {true, true, true, true, false, true, true, false} //9
};

void setup() {
  for(int i=0; i<num_of_pos; i++) {
     pinMode(pos_pins[i], OUTPUT);
  }
  for(int i=0; i<num_of_pins; i++) {
    pinMode(pins[i], OUTPUT);
  }
  pinMode(button, INPUT_PULLUP);
}

unsigned long prev_time = 0;

void loop() {
  unsigned long current_time = millis();
  if(current_time - prev_time > 1000) {
    seconds = seconds+1;
    if(seconds==60){
      seconds=0;
      minute=minute+1;
      if(minute==60){
        minute=0;
      }
    }
    prev_time= current_time;
  } else{
    set_minute(minute);
    set_seconds(seconds);
  }
}

void set_position(int pos){
  for(int i = 0; i < num_of_pos; i++) {
    if(i == pos-1){
      digitalWrite(pos_pins[i], LOW);
    } else {
      digitalWrite(pos_pins[i], HIGH);
    }
  }
}

void set_number(int number){
  for(int i=0;i<num_of_pins;++i){ 
    segment[number][i] ? digitalWrite(pins[i], HIGH) : digitalWrite(pins[i], LOW); 
  }
}

void set_seven_segment(int pos, int number){
  set_position(pos);
  set_number(number);
}

void set_minute(int minute){
  for(int i=2;i>0;--i){
    set_seven_segment(i,minute%10);
    delay(delaytime);
    minute = minute/10;
  }
}
void set_seconds(int seconds){
  for(int i=4;i>2;--i){
    set_seven_segment(i,seconds%10);
    delay(delaytime);
    seconds = seconds/10;
  }
}

 

4자리 7세그먼트 스톱워치 동작예제

위 코드를 조금만 변경한다면 시계도 만들 수 있을거에요 :)

 

7 segment는 전공 수업 때 fpga 보드에 사용해 본 것 이외에는 처음 만져봤습니다.

디바이스 마트에서 아두이노 키트 사면 진짜 LED랑 7세그먼트, 도트매트릭스는 무조건 포함되어있는데, 쓰지도 않고 버리기 아까웠는데 이번에 기본적인 예제는 다 다뤄봐서 만족스럽습니다.

 


잘못된 내용이 있다면 언제든지 댓글이나 메일로 알려주시면 감사하겠습니다.

이 포스팅이 도움이 되었다면 공감 부탁드립니다.

궁금한 점은 언제든지 댓글 남겨주시면 답변해드리겠습니다:D