본문 바로가기

관리하지않음/아두이노

[아두이노] 7세그먼트 사용법 및 예제 - 카운터

아두이노 기초를 공부하기 위해 키트를 사면 꼭 포함되어 있는 모듈 중 하나가 바로 7 Segment 입니다.

7 세그먼트는 7개로 된 세그먼트를 각각 제어해서 숫자나 문자를 표현할 수 있습니다.

기본 보드 구성 방법숫자 0을 표현하는 방법, 숫자 예제카운터 만드는 방법을 정리해봤습니다.

 

1. 보드 구성 방법

기본적인 보드 구성은 아래와 같습니다.

TinkerCAD라는 사이트를 이용해서 보기 좋게 정리해봤습니다.

7세그먼트 아두이노 보드 구성

팅커캐드에 구성해놓은 보드 링크

 

저는 a b c d e f g를 순서대로 2 3 4 5 6 7 8번 핀에 꽂아서 약간 정신 사납습니다.

핀 번호는 원하는 대로 꽂으면 됩니다.

7 세그먼트

하지만 과전류 방지를 위해서 7개 세그먼트에 모두 저항을 꽂아줘야 해서 결국엔 보드가 정신 사납게 구성됩니다.

실제로 팅커캐드에서 개별 저항을 꽂아주지 않으면 아래와 같이 과전류로 인한 주의문구가 발생합니다.

과전류로 인한 오류 메시지

3.3V에 꽂아줬는데도 오류 메시지가 작동했습니다.

메카솔루션에서 찾아봤을 때는 7 세그먼트는 작동 전류가 20mA ~ 40mA라고 되어있더라구요.

근데 제조사에 따라 다른건지 모르겠습니다. 검색해도 잘 모르겠습니다.

코딩만 하다가 V=IR도 너무 오랜만에 봐서 당황한 상태입니다.

 

7세그먼트 저항 관련해서 아시는 분은 댓글 부탁드립니다.

 

하지만 과전류고 뭐고 일단 동작 시켜보겠다! 하는 분들은 아래 사진 처럼 개별 저항 없이 꽂으셔도 괜찮습니다.

저항 없이 보드 구성한 모습

과전류인지 아닌지는 멀티미터가 있어야 확인 가능한데, 집에는 멀티미터가 없기 때문에 PASS 하겠습니다.

 

2. 숫자 0 표시하기

숫자 0을 표시하기 위해서는 g를 제외하고 모두 켜야 합니다.

코드는 아래와 같습니다.

int A = 2;
int B = 3;
int C = 4;
int D = 5;
int E = 6;
int F = 7;
int G = 8;

void setup() {
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
digitalWrite (A,LOW);
digitalWrite (B,LOW);
digitalWrite (C,LOW);
digitalWrite (D,LOW);
digitalWrite (E,LOW);
digitalWrite (F,LOW);
digitalWrite (G,HIGH);
}

void loop() 
{
}

실행하면 아래와 같이 0이 계속 표시됩니다.

7세그먼트에 0 표시하기

3. 0~9까지 표시하기

위 코드에서 void loop(){} 부분에 아래의 코드를 복붙 해주시면 됩니다.

void loop()
{
// number 0
digitalWrite (A,LOW);
digitalWrite (B,LOW);
digitalWrite (C,LOW);
digitalWrite (D,LOW);
digitalWrite (E,LOW);
digitalWrite (F,LOW);
digitalWrite (G,HIGH);
delay (1000);

// number 1
digitalWrite (A,HIGH);
digitalWrite (B,LOW);
digitalWrite (C,LOW);
digitalWrite (D,HIGH);
digitalWrite (E,HIGH);
digitalWrite (F,HIGH);
digitalWrite (G,HIGH);
delay (1000);

// number 2
digitalWrite (A,LOW);
digitalWrite (B,LOW);
digitalWrite (C,HIGH);
digitalWrite (D,LOW);
digitalWrite (E,LOW);
digitalWrite (F,HIGH);
digitalWrite (G,LOW);
delay (1000);

// number 3
digitalWrite (A,LOW);
digitalWrite (B,LOW);
digitalWrite (C,LOW);
digitalWrite (D,LOW);
digitalWrite (E,HIGH);
digitalWrite (F,HIGH);
digitalWrite (G,LOW);
delay (1000);

// number 4
digitalWrite (A,HIGH);
digitalWrite (B,LOW);
digitalWrite (C,LOW);
digitalWrite (D,HIGH);
digitalWrite (E,HIGH);
digitalWrite (F,LOW);
digitalWrite (G,LOW);
delay (1000);

// number 5
digitalWrite (A,LOW);
digitalWrite (B,HIGH);
digitalWrite (C,LOW);
digitalWrite (D,LOW);
digitalWrite (E,HIGH);
digitalWrite (F,LOW);
digitalWrite (G,LOW);
delay (1000);

// number 6
digitalWrite (A,LOW);
digitalWrite (B,HIGH);
digitalWrite (C,LOW);
digitalWrite (D,LOW);
digitalWrite (E,LOW);
digitalWrite (F,LOW);
digitalWrite (G,LOW);
delay (1000);

// number 7
digitalWrite (A,LOW);
digitalWrite (B,LOW);
digitalWrite (C,LOW);
digitalWrite (D,HIGH);
digitalWrite (E,HIGH);
digitalWrite (F,HIGH);
digitalWrite (G,HIGH);
delay (1000);

// number 8
digitalWrite (A,LOW);
digitalWrite (B,LOW);
digitalWrite (C,LOW);
digitalWrite (D,LOW);
digitalWrite (E,LOW);
digitalWrite (F,LOW);
digitalWrite (G,LOW);
delay (1000);

// number 9
digitalWrite (A,LOW);
digitalWrite (B,LOW);
digitalWrite (C,LOW);
digitalWrite (D,LOW);
digitalWrite (E,HIGH);
digitalWrite (F,LOW);
digitalWrite (G,LOW);
delay (1000);
}

동작 영상입니다.

 

동작 영상

학생분들을 위해서 어렵지 않게 코드를 작성했습니다.

 

하지만 코드가 쓸데없이 길고 반복되는 게 많아서 함수, 반복문, 삼항연산자와 배열을 사용해 코드를 줄였습니다.

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

};

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

void loop() 
{
  for(int i=0;i<10;++i){
     seven_segment(segment[i]);
 	 delay(delaytime);
    }
}

void seven_segment(bool arr[]){
  for(int i=0;i<num_of_pins;++i){
    arr[i] ? digitalWrite(pins[i], LOW) : digitalWrite(pins[i], HIGH);
  }
}

 

동작은 똑같지만, 코드가 많이 짧아진 걸 확인할 수 있을 겁니다.

 

4. 7 세그먼트와 택트스위치를 사용한 카운터 

7세그먼트와 택트스위치를 사용한 카운터 보드 구성

기초 키트에 꼭 포함되는 택트스위치를 사용해서, 버튼을 누르면 숫자가 커지는 카운터도 만들어 봤습니다.

A0와 GND에 택트스위치를 연결하고 아래 코드를 업로드합니다.

int pins[] = {2, 3, 4, 5, 6, 7, 8};
int num_of_pins = 7;
int button = A0;
int delaytime = 200;
bool segment[10][7] = {
  {true, true, true, true, true, true, false}, //0
  {false, true, true, false, false, false, false}, //1
  {true, true, false, true, true, false, true}, //2
  {true, true, true, true, false, false, true}, //3
  {false, true, true, false, false, true, true}, //4
  {true, false, true, true, false, true, true}, //5
  {true, false, true, true, true, true, true}, //6
  {true, true, true, false, false, false, false}, //7
  {true, true, true, true, true, true, true}, //8
  {true, true, true, true, false, true, true}, //9
};
int cnt = 0;

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

void loop() 
{
  if(digitalRead(button) == LOW){
    cnt = cnt+1;
    if(cnt == 10) cnt = 0;
  }
  seven_segment(segment[cnt]);
  delay(delaytime);
}

void seven_segment(bool arr[]){
  for(int i=0;i<num_of_pins;++i){
    arr[i] ? digitalWrite(pins[i], LOW) : digitalWrite(pins[i], HIGH);
  }
}

 

동작 영상

delaytime을 200으로 줘서 버튼을 조금 기다렸다 눌러야합니다.

100으로 하면 너무 빨라서 2 이상 카운트될 때도 있습니다.

delaytime은 150이 적당한 것 같습니다.

 

오랜만에 TinkerCAD도 사용해보고 아두이노도 이것저것 해봤습니다.

지금 참여하고 있는 공모전에서 지원받은 비용으로 산 센서가 오기 전 아두이노 공부를 다시 하는중입니다:)

한동안 아두이노 관련해서 포스팅이 자주 올라올 것 같습니다.


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

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

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