-
시리얼 통신을 이용해서 입력받은 수를 7Segment x4에 출력하기Arduino/7 Segment x 4EA 2020. 11. 2. 18:20
우선 시리얼 통신을 하기 전에, 문제를 좀 더 간단히 해보자.
시리얼 통신을 통해서 4자리 숫자 받았다고 가정해보자.
그런 이후에 FourDigitalNum라는 함수의 매개변수로 이 숫자를 전달하면
7Segment에 이 숫자가 출력되도록 하자.
여기서 4자리 숫자를 입력받는 이유는 7Segment가 4 자리이기 때문이다.
기본적인 하드웨어 연결과 소스들은 아래에서 그대로 거의 다 가지고 와서 구현한다.
아래의 내용을 참고하자.
designatedroom87.tistory.com/273
소스 코드
더보기#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); }
'Arduino > 7 Segment x 4EA' 카테고리의 다른 글
포텐시오미터의 값을 읽어 7Segment x4EA에 표시하기 (0) 2020.11.02 7Segment x 4EA와 아두이노의 연결 & 숫자 출력하기 (0) 2020.11.02