아두이노 기본실습 4 - 숫자표시 LED 7세그먼트 LED 실험

여기서는 숫자표시 LED인 7세그먼트 LED를 이용하여 숫자를 표시하는 실험을 합니다. 7세그먼트 LED는 8개의 LED(도트포함)로 구성되어 있으며 아두이노 보드의 8개의 디지털IO핀을 사용하여 각각의 LED를 ON/OFF함으로써 숫자를 표시하게 됩니다.

7세그먼트 LED는 애노드커먼(Anode Common: +공통)과 캐소드커먼(Cathod Common; -공통)의 두 가지 종류가 있으며 이번 실험에서는 캐소드커먼을 기준으로 합니다.

아래는 일반적인 1개의 숫자를 표시하는 7세그먼트 LED입니다. 

아래는 7세그먼트 LED로 0에서 9까지의 숫자를 표시한 예입니다.

7세그먼트 LED는 총 8개의 LED로 구성되고 각각의 LED는 a, b, c, d, e, f, g, dp 로 명명되어 있습니다. 각각의 LED는 7세그먼트 LED의 10개의 핀에 아래와 같이 연결되어 있습니다. 3번과 8번의 공통핀(Common)으로 사용되며 애노드커먼(+공통), 캐소드커먼(-공통) 타입으로 나누어집니다. 

이 번 실험에서는 캐소드커먼(-공통)타입을 사용합니다.

준비물

  • 7세그먼트 LED
  • 1K옴 저항
  • 점퍼선 9개
  • 아두이노 우노보드

 

결선방법

아래는 아두이노 보드와 7세그먼트LED와의 결선도 입니다. 공통핀(3번, 8번) 중 1개만 사용하면 되며 1K옴 저항을 직렬로 연결하고 이어서 아두이노 보드의 GND와 연결합니다.

직렬저항을 연결하지 않는 경우 7세그먼트 LED가 손상될 수 있으므로 주의하시기 바랍니다. 또한 7세그먼트 LED에 직렬저항 없이 5V나 3.3V 전압을 바로 가하면 LED가 소손되므로 LED 테스트시에도 반드시 직렬저항을 연결하여 사용하여야 합니다.

7세그먼트 LED의 나머지 1,2,4,5,6,7,9,10번 핀은 아두이노 우노보드의 디지털IO핀 10,11,5,4,7,6,8,9에 각각 연결하시면 됩니다. 자세한 것은 아래 소스코드를 참조하십시요.

 

소스코드1

아래는 소스코드1입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드해봅니다.

// 아두이노 숫자표시LED 7세그먼트 LED 실험1
//7세그먼트 LED 핀맵(아두이노 디지털IO핀에 연결)
int a=7;
int b=6;
int c=5;
int d=11;
int e=10;
int f=8;
int g=9;
int dp=4;

//숫자 1 표시
void digital_1(void)
{
  unsigned char j;
  digitalWrite(c,HIGH);//디지털IO 5번을 HIGH로 출력하여 7새그먼트 LED c 를 점등
  digitalWrite(b,HIGH);//b 점등
  for(j=7;j<=11;j++)//나머지 LED는 소등
    digitalWrite(j,LOW);
  digitalWrite(dp,LOW);//DP(도트)는 소등
}
//숫자 2 표시
void digital_2(void)
{
  unsigned char j;
  digitalWrite(b,HIGH);
  digitalWrite(a,HIGH);
  for(j=9;j<=11;j++)
    digitalWrite(j,HIGH);
  digitalWrite(dp,LOW);
  digitalWrite(c,LOW);
  digitalWrite(f,LOW);
}
//숫자 3 표시
void digital_3(void)
{
  unsigned char j;
  digitalWrite(g,HIGH);
  digitalWrite(d,HIGH);
  for(j=5;j<=7;j++)
    digitalWrite(j,HIGH);
  digitalWrite(dp,LOW);
  digitalWrite(f,LOW);
  digitalWrite(e,LOW);
}
//숫자 4 표시
void digital_4(void)
{
  digitalWrite(c,HIGH);
  digitalWrite(b,HIGH);
  digitalWrite(f,HIGH);
  digitalWrite(g,HIGH);
  digitalWrite(dp,LOW);
  digitalWrite(a,LOW);
  digitalWrite(e,LOW);
  digitalWrite(d,LOW);   
}
//숫자 5 표시
void digital_5(void)
{
  unsigned char j;
  for(j=7;j<=9;j++)
    digitalWrite(j,HIGH);
  digitalWrite(c,HIGH);
  digitalWrite(d,HIGH);
  digitalWrite(dp,LOW);
  digitalWrite(b,LOW);
  digitalWrite(e,LOW); 
}
//숫자 6 표시
void digital_6(void)
{
  unsigned char j;
  for(j=7;j<=11;j++)
    digitalWrite(j,HIGH);
  digitalWrite(c,HIGH);
  digitalWrite(dp,LOW);
  digitalWrite(b,LOW);   
}
//숫자 7 표시
void digital_7(void)
{
  unsigned char j;
  for(j=5;j<=7;j++)
    digitalWrite(j,HIGH);
  digitalWrite(dp,LOW);
  for(j=8;j<=11;j++)
    digitalWrite(j,LOW);
}
//숫자 8 표시
void digital_8(void)
{
  unsigned char j;
  for(j=5;j<=11;j++)
    digitalWrite(j,HIGH);
  digitalWrite(dp,LOW);
}
void setup()
{
  int i;//변수 설정
  for(i=4;i<=11;i++)
    pinMode(i,OUTPUT);//디지털IO 4~11번을 출력으로 설정
}
void loop()
{  
  while(1)
  {
    digital_1();//숫자 1 표시
    delay(2000);//2초간 딜레이
    digital_2();
    delay(2000);
    digital_3();
    delay(2000);
    digital_4();
    delay(2000);
    digital_5();
    delay(2000);
    digital_6();
    delay(2000);
    digital_7();
    delay(2000);
    digital_8();
    delay(2000);   
  }
}

 

소스코드2

아래는 소스코드2입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드해봅니다.

소스코드2에서는 표시할 0에서 9까지의 숫자에 해당하는 디지털 IO 맵을 만들어서 소스코드를 단순화하였습니다. 어레이에서 0은 LED 소등, 1은 LED점등을 나타냅니다.

// 아두이노 숫자표시LED 7세그먼트 LED 실험2
byte seven_seg_digits[10][8] =  //7세그먼트 LED에 표시할 숫자를 디지털IO핀 ON/OFF 어레이로 변환
{
//{DP,c,b,a,f,g,e,d }순서로 배열되어 있습니다.
  { 0,1,1,1,1,0,1,1 },  // = 0
  { 0,1,1,0,0,0,0,0 },  // = 1
  { 0,0,1,1,0,1,1,1 },  // = 2
  { 0,1,1,1,0,1,0,1 },  // = 3
  { 0,1,1,0,1,1,0,0 },  // = 4
  { 0,1,0,1,1,1,0,1 },  // = 5
  { 0,1,0,1,1,1,1,1 },  // = 6
  { 0,1,1,1,0,0,0,0 },  // = 7
  { 0,1,1,1,1,1,1,1 },  // = 8
  { 0,1,1,1,1,1,0,1 }   // = 9
  };


void setup()  //디지털IO 4~11번을 출력으로 설정
{
  pinMode(4, OUTPUT);   
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}
   
void sevenSegWrite(byte digit) //디지털IO 4~11번을 순서대로 어레이의 값으로 출력
{
  byte pin = 4;
  for (byte segCount = 0; segCount < 8; ++segCount) {
    digitalWrite(pin, seven_seg_digits[digit][segCount]);
    ++pin;
  }
}

void loop() //7세그먼터 LED를 9에서부터 다운카운트
{
  for (byte count = 10; count > 0; --count) {
   delay(1000);
   sevenSegWrite(count - 1); 
  }
  delay(2000);
}

아래는 업로드한 후 구동한 모습입니다.