ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시리얼 통신을 이용해서 입력받은 수를 7Segment x4에 출력하기
    Arduino/7 Segment x 4EA 2020. 11. 2. 18:20

     

     

    우선 시리얼 통신을 하기 전에, 문제를 좀 더 간단히 해보자.

    시리얼 통신을 통해서 4자리 숫자 받았다고 가정해보자.

    그런 이후에 FourDigitalNum라는 함수의 매개변수로 이 숫자를 전달하면 

    7Segment에 이 숫자가 출력되도록 하자.

    여기서 4자리 숫자를 입력받는 이유는 7Segment가 4 자리이기 때문이다.

     

    기본적인 하드웨어 연결과 소스들은 아래에서 그대로 거의 다 가지고 와서 구현한다.

    아래의 내용을 참고하자.

    designatedroom87.tistory.com/273

     

    7Segment x 4EA와 아두이노의 연결 & 숫자 출력하기

    테스트로 처음에 4자리 디지털 핀 중에서 맨 왼쪽의 a부분에만 LED를 켜려면 다음과 같이 연결하면 된다. 아두이노의 3.3볼트핀에 7Segment x 4EA의 11번핀을 연결하고 7Segment x 4EA의 12번핀에 220옴 저항

    designatedroom87.tistory.com

     

    소스 코드

    더보기
    #define   D1    10
    #define   D2    11
    #define   D3    12
    #define   D4    13
    
    #define   DIGIT   4   //  7SEGMENT에 표현할 수 있는 자리 수
    
    //  행의 수는 우리가 표현할 십진수의 개수이며, 
    //  열의 수는 십진수에 따른 수 표기에 필요한 세븐세그먼트핀의 수
    bool num[10][8] = {
        {1,1,1,1,1,1,0,0},    //  숫자0
        {0,1,1,0,0,0,0,0},    //  숫자1
        {1,1,0,1,1,0,1,0},    //  숫자2
        {1,1,1,1,0,0,1,0},    //  숫자3 
        {0,1,1,0,0,1,1,0},    //  숫자4
        {1,0,1,1,0,1,1,0},    //  숫자5 
        {1,0,1,1,1,1,1,0},    //  숫자6
        {1,1,1,0,0,0,0,0},    //  숫자7
        {1,1,1,1,1,1,1,0},    //  숫자8
        {1,1,1,1,0,1,1,0}     //  숫자9
    };
    
    //  0000에서 9999까지를 디지털 핀에 출력하는 함수
    //  매개변수는 디지털 핀에 출력할 수
    void FourDigitalNum(int _num)
    {
      int digit = 1000;
      int l_num = _num;
      int numArr[DIGIT] = {0,0,0,0};  //  디지털 핀에 출력할 숫자를 저장
      int quota;      //  l_num을 digit로 나눈 몫
      int remainer;   //  l_num을 digit로 나눈 나머지
      int i = 0;      //  numArr배열의 인덱스
    
      //  1. 숫자 분리
      while (l_num != 0)
      {
        quota = l_num / digit;    //  몫을 구한다.
        remainer = l_num % digit; //  나머지를 구한다.
    
        numArr[i++] = quota;      //  출력할 수의 맨 앞자리 부터 저장
    
        l_num = remainer;         //  그 다음 자리의 수를 찾기 위해 설정
        digit /= 10;              //  그 다음 자리의 수를 찾기 위해 설정
      }
    
      //  2. 분리한 수를 디지털 핀에 출력
      for (int i = 0; i < DIGIT; i++)
      {
       DigitalNum(D1 + i, numArr[i]);
       delay(5);
       DigitalPinInit();
       Serial.println(numArr[i]);
      }
    }
    
    void DigitalNum(int _num)
    {
      for (int i = 0; i < 8; i++)
      {
        digitalWrite(i + 2, num[_num][i]);
      }
      delay(1000);
    }
    
    //  디지털핀의 원하는 수를 표시한다.
    void DigitalNum(int Dpin, int _num)
    {
      digitalWrite(Dpin,LOW);
      
      for (int i = 0; i < 8; i++)
      {
        digitalWrite(i + 2, num[_num][i]);
      }
    }
    
    //  디지털 핀들을 초기화하는 함수
    void DigitalPinInit()
    {
      //  디지털 핀에 대한 초기화
      for (int i = 10; i < 14; i++)
      {
        pinMode(i, OUTPUT);
        digitalWrite(i,HIGH);
      }
    }
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      
      //  2번핀부터 9번핀까지 모두 설정
      for (int i = 2; i < 10; i++)
      {
        pinMode(i, OUTPUT);
        digitalWrite(i,LOW);
      }
    
      //  디지털 핀에 대한 초기화
      DigitalPinInit();
    }
    
    void loop() {
      FourDigitalNum(1234);
    }

     

     

     

    위의 예제를 통해 절반의 내용은 구현이 되었다.

    이번에는 시리얼 통신을 통해 숫자를 입력받기만 하면 된다.

    전역 변수로 buf라는 배열이 있는데 5칸을 할당한 이유는 마지막 자리에 널 문자를 삽입하기 위함이다.

    g_num은 buf배열에 들어있는 값을 저장할 변수이다.

    배열의 내용을 숫자로 변환하기 위해 atoi함수를 사용한다.

    소스 코드

    더보기
    /*
     시리얼 통신으로 숫자를 입력받으면 이를 디지털 핀에 
     표현하는 함수 FourDigitalNum 함수를 만든다.
    */
    #define   D1    10
    #define   D2    11
    #define   D3    12
    #define   D4    13
    
    #define   DIGIT   4   //  7SEGMENT에 표현할 수 있는 자리 수
    
    //  행의 수는 우리가 표현할 십진수의 개수이며, 
    //  열의 수는 십진수에 따른 수 표기에 필요한 세븐세그먼트핀의 수
    bool num[10][8] = {
        {1,1,1,1,1,1,0,0},    //  숫자0
        {0,1,1,0,0,0,0,0},    //  숫자1
        {1,1,0,1,1,0,1,0},    //  숫자2
        {1,1,1,1,0,0,1,0},    //  숫자3 
        {0,1,1,0,0,1,1,0},    //  숫자4
        {1,0,1,1,0,1,1,0},    //  숫자5 
        {1,0,1,1,1,1,1,0},    //  숫자6
        {1,1,1,0,0,0,0,0},    //  숫자7
        {1,1,1,1,1,1,1,0},    //  숫자8
        {1,1,1,1,0,1,1,0}     //  숫자9
    };
    
    char buf[5] = {0};  
    int g_num = 0;
    
    //  0000에서 9999까지를 디지털 핀에 출력하는 함수
    //  매개변수는 디지털 핀에 출력할 수
    void FourDigitalNum(int _num)
    {
      int digit = 1000;
      int l_num = _num;
      int numArr[DIGIT] = {0,0,0,0};  //  디지털 핀에 출력할 숫자를 저장
      int quota;      //  l_num을 digit로 나눈 몫
      int remainer;   //  l_num을 digit로 나눈 나머지
      int i = 0;      //  numArr배열의 인덱스
    
      //  1. 숫자 분리
      while (l_num != 0)
      {
        quota = l_num / digit;    //  몫을 구한다.
        remainer = l_num % digit; //  나머지를 구한다.
    
        numArr[i++] = quota;      //  출력할 수의 맨 앞자리 부터 저장
    
        l_num = remainer;         //  그 다음 자리의 수를 찾기 위해 설정
        digit /= 10;              //  그 다음 자리의 수를 찾기 위해 설정
      }
    
      //  2. 분리한 수를 디지털 핀에 출력
      for (int i = 0; i < DIGIT; i++)
      {
       DigitalNum(D1 + i, numArr[i]);
       delay(5);
       DigitalPinInit();
       Serial.println(numArr[i]);
      }
    }
    
    void DigitalNum(int _num)
    {
      for (int i = 0; i < 8; i++)
      {
        digitalWrite(i + 2, num[_num][i]);
      }
      delay(1000);
    }
    
    //  디지털핀의 원하는 수를 표시한다.
    void DigitalNum(int Dpin, int _num)
    {
      digitalWrite(Dpin,LOW);
      
      for (int i = 0; i < 8; i++)
      {
        digitalWrite(i + 2, num[_num][i]);
      }
    }
    
    //  디지털 핀들을 초기화하는 함수
    void DigitalPinInit()
    {
      //  디지털 핀에 대한 초기화
      for (int i = 10; i < 14; i++)
      {
        pinMode(i, OUTPUT);
        digitalWrite(i,HIGH);
      }
    }
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      
      //  2번핀부터 9번핀까지 모두 설정
      for (int i = 2; i < 10; i++)
      {
        pinMode(i, OUTPUT);
        digitalWrite(i,LOW);
      }
    
      //  디지털 핀에 대한 초기화
      DigitalPinInit();
    }
    
    void loop() {
      if (Serial.available())
      {
        Serial.readBytes(buf,4);
    
        buf[4] = '\0';
    
        g_num = atoi(buf);
      }
      FourDigitalNum(g_num);
    }

    댓글

Designed by Tistory.