2017년 8월 10일 목요일

7-Segment 카운터

아두이노로 7-Segment 카운터를 만들기 위해 아두이노 보드와 빵판(Bread Board)에 부품을 다음과 같이 조립했습니다.

Anode타입 세그먼트라서, Common 단자는 저항(220Ω)을 통해 5V 출력에 연결했습니다. 그리고 a~g까지의 단자는 리드선을 통해 2~8 포트에 연결되어 있습니다.

이렇게 연결하고 아두이노 전원을 넣으면, 7개의 lcd에 모두 불이 들어오게 됩니다. 초기에 모든 단자의 출력이 LOW이며, Anode타입이므로 불이 들어오게 되는 것이죠.

이제 이 세그먼트를 제어할 프로그램을 만들어야 합니다.

아두이노 스케치에서 처음 프로젝트를 만들면 다음과 같은 C 프로그램이 만들어집니다.

void setup()
{
}

void loop()
{
}

여기에는 main함수가 없지만, 내부에 다음과 같은 main함수가 숨어 있는 것입니다.

main()
{
    setup();
    while(1)
        loop();
}

즉, 최초에 setup()함수가 불리고 나서, loop()함수가 계속 호출되는 식이죠.
아무튼 최초 setup()함수에서는 우리가 사용할 핀(2~8)들에 대한 선언을 합니다. 기본적으로 C프로그램이므로 변수들도 자유롭게 선언할 수 있죠.

int pin[] = {2, 3, 4, 5, 6, 7, 8};
          // a, b, c, d, e, f, g

void setup()
{
  for(int k = 0; k < 7; ++k)
    pinMode(pin[k], OUTPUT);
}

void loop()
{
}

pinMode(int pinNo, int value);가 각 핀들의 기능을 선언하는 함수입니다. 루프를 돌면서 2번부터 8번까지의 핀들을 OUTPUT으로 선언하는 것이죠(물론 INPUT으로 선언하면 각종 센서로부터의 입력을 받을 수 있습니다).
다음에 loop()함수에서 각 세그먼트의 ONOFF를 제어해야 합니다.

int pin[] = {2, 3, 4, 5, 6, 7, 8};
           //a, b, c, d, e, f, g

void setup()
{
  for(int k = 0; k < 7; ++k)
    pinMode(pin[k], OUTPUT);
}

void loop()
{
    digitalWrite(pin[0], LOW); // a
    digitalWrite(pin[1], LOW); // b
    digitalWrite(pin[2], LOW); // c
    digitalWrite(pin[3], LOW); // d
    digitalWrite(pin[4], LOW); // e
    digitalWrite(pin[5], LOW); // f
    digitalWrite(pin[6], HIGH); // g
}

(Anode 타입이므로) High로 설정된 g led만 꺼져 0이 출력될 것입니다.
그런데 이런 식으로 일일이 코딩하느니, 테이블과 함수를 만드는 것이 낫겠죠.

int pin[] = {2, 3, 4, 5, 6, 7, 8};
           //a, b, c, d, e, f, g

byte pattern[10][7]
{
  { 0, 0, 0, 0, 0, 0, 1 }, // 0
  { 1, 0, 0, 1, 1, 1, 1 }, // 1
  { 0, 0, 1, 0, 0, 1, 0 }, // 2
  { 0, 0, 0, 0, 1, 1, 0 }, // 3
  { 1, 0, 0, 1, 1, 0, 0 }, // 4
  { 0, 1, 0, 0, 1, 0, 0 }, // 5
  { 0, 1, 0, 0, 0, 0, 0 }, // 6
  { 0, 0, 0, 1, 1, 1, 1 }, // 7
  { 0, 0, 0, 0, 0, 0, 0 }, // 8
  { 0, 0, 0, 0, 1, 0, 0 }  // 9
};

int digit = 0;

void setup()
{
  for(int k = 0; k < 7; ++k)
    pinMode(pin[k], OUTPUT);
}

void loop()
{
  Display(pattern[0]);
}

void Display(byte ptn[])
{
  for(int k = 0; k < 7; ++k)
    digitalWrite(pin[k], ptn[k]);
}

이렇게 해도 동일한 결과가 나옵니다(이 pattern 테이블과 Display함수는 다음에도 필요할때 복사해서 쓸 수 있습니다).

시간에 따라 숫자를 바꾸기 위해서는 delay(int millisec) 함수를 사용할 수 있습니다.

int pin[] = {2, 3, 4, 5, 6, 7, 8};
           //a, b, c, d, e, f, g

byte pattern[10][7]
{
  { 0, 0, 0, 0, 0, 0, 1 }, // 0
  { 1, 0, 0, 1, 1, 1, 1 }, // 1
  { 0, 0, 1, 0, 0, 1, 0 }, // 2
  { 0, 0, 0, 0, 1, 1, 0 }, // 3
  { 1, 0, 0, 1, 1, 0, 0 }, // 4
  { 0, 1, 0, 0, 1, 0, 0 }, // 5
  { 0, 1, 0, 0, 0, 0, 0 }, // 6
  { 0, 0, 0, 1, 1, 1, 1 }, // 7
  { 0, 0, 0, 0, 0, 0, 0 }, // 8
  { 0, 0, 0, 0, 1, 0, 0 }  // 9
};

int digit = 0;    // 이번에 출력할 숫자

void setup()
{
  for(int k = 0; k < 7; ++k)
    pinMode(pin[k], OUTPUT);
}

void loop()
{
  Display(pattern[digit]);
  delay(1000);      // 출력후 1초 기다림
  ++digit;          // 출력할 숫자 증가
  if(digit > 9)
    digit = 0;
}

void Display(byte ptn[])
{
  for(int k = 0; k < 7; ++k)
    digitalWrite(pin[k], ptn[k]);
}

댓글 없음:

댓글 쓰기