-
아두이노 프로젝트 | 디지털 카운터Technology/Arduino 2024. 3. 29. 18:00
1. 디지털 카운터
일상에서 쉽게 발견할 수 있는 카운터를 아두이노 플랫폼을 이용해 디지털로 구현해보자. 구현하고자 하는 디지털 카운터는 0부터 9999까지 카운트할 수 있도록 네 자리 7-세그먼트 디스플레이를 가지고 있고, 시프트 레지스터 74HC595로 제어된다. 또한 택트 스위치 1개를 가지고 있으며, 택트 스위치를 누르면 누른 횟수가 디스플레이에 표시된다. 누른 횟수가 9999회를 넘으면 다시 0으로 초기화되도록 프로그램을 작성해보자.
2. 프로젝트
2.1. 회로 구성
2.2. 프로그램 작성
// 정수형 배열 선언 후 디지털 핀 번호로 초기화 int DigitPin[4] = {13, 12, 11, 10}; // 접지4, 접지3, 접지2, 접지1 순서로 연결 int DataPin = 9; // 정수형 변수 선언 후 디지털 핀 번호 9번으로 초기화 int ClockPin = 8; int LatchPin = 7; // // 정수형 배열 선언 후 숫자를 나타내는 8비트 배열로 초기화 int DataArray[10] = { B11111100, // 0 B01100000, // 1 B11011010, // 2 B11110010, // 3 B01100110, // 4 B10110110, // 5 B10111110, // 6 B11100000, // 7 B11111110, // 8 B11110110 // 9 }; int Switch = 6; // 정수형 변수 선언 후 디지털 핀 번호 6번으로 초기화 int Count = 0; // 정수형 변수 선언 후 0으로 초기화 bool State = false; // 불린형 변수 선언 후 false로 초기화 void setup() { for (int i = 0; i < 4; i++) { pinMode(DigitPin[i], OUTPUT); // 디지털 DigitPin[i]번 핀을 출력(OUTPUT) 모드로 설정 } pinMode(DataPin, OUTPUT); // 디지털 9번 핀을 출력(OUTPUT) 모드로 설정 pinMode(ClockPin, OUTPUT); pinMode(LatchPin, OUTPUT); pinMode(Switch, INPUT); // 디지털 6번 핀을 입력(INPUT) 모드로 설정 } void loop() { if (digitalRead(Switch) == HIGH) // 택트 스위치가 눌린 상태면 실행 { if (State == false) // 택트 스위치의 이전 상태가 눌리지 않은 상태였다면 실행 { State = true; // 택트 스위치의 현재 상태를 눌린 상태로 업데이트 if (Count < 9999) // 정수형 변수에 저장된 값이 9999보다 작으면 실행 { Count += 1; // } else { Count = 0; // 카운터를 0으로 초기화 } } } else // 택트 스위치가 눌리지 않은 상태면 실행 { State = false; // 택트 스위치의 현재 상태를 눌리지 않은 상태로 업데이트 } Display(Count); // Display 함수 실행 } // Number의 자릿수를 판별하여 네 자리 7-세그먼트에 표시 void Display(int Number) { int First, Second, Third, Fourth; // 정수형 변수 선언 if (Number >= 0 && Number < 10) // Number가 한 자리인 경우 실행 { First = Number % 10; // Number의 첫째 자리 숫자 추출 DisplayDigit(1, First); // DisplayDigit 함수 실행 delay(5); // 5 ms 대기 } else if (Number >= 10 && Number < 100) // Number가 두 자리인 경우 실행 { First = Number % 10; Second = Number / 10 % 10; // Number의 둘째 자리 숫자 추출 if (Second != 0) { DisplayDigit(2,Second); delay(5); } DisplayDigit(1, First); delay(5); } else if (Number >= 100 && Number < 1000) // Number가 세 자리인 경우 실행 { First = Number % 10; Second = Number / 10 % 10; Third = Number / 100 % 10; // Number의 셋째 자리 숫자 추출 if (Third != 0) { DisplayDigit(3,Third); delay(5); } if (Second != 0) { DisplayDigit(2,Second); delay(5); } DisplayDigit(1, First); delay(5); } else if (Number >= 1000 && Number < 10000) // Number가 네 자리인 경우 실행 { First = Number % 10; Second = Number / 10 % 10; Third = Number / 100 % 10; Fourth = Number / 1000 % 10; // Number의 넷째 자리 숫자 추출 if (Fourth != 0) { DisplayDigit(4,Fourth); delay(5); } if (Third != 0) { DisplayDigit(3,Third); delay(5); } if (Second != 0) { DisplayDigit(2,Second); delay(5); } DisplayDigit(1, First); delay(5); } } // 오른쪽에서 Digit번째 자리에 숫자 Number를 표시 void DisplayDigit(int Digit, int Number) { for (int i = 4; i > 0; i--) { if(i == Digit) { // 디지털 DigitPin[i - 1]번 핀에 디지털 신호 LOW 출력 digitalWrite(DigitPin[i - 1], LOW); } else { // 디지털 DigitPin[i - 1]번 핀에 디지털 신호 HIGH 출력 digitalWrite(DigitPin[i - 1], HIGH); } } digitalWrite(LatchPin, LOW); // 디지털 7번 핀에 디지털 신호 LOW 출력 // ClockPin에서의 상승 에지에 맞게 DataPin으로부터 입력 받은 DataArray[i]를 오른쪽 끝부터 전달 shiftOut(DataPin, ClockPin, LSBFIRST, DataArray[Number]); digitalWrite(LatchPin, HIGH); // 디지털 7번 핀에 디지털 신호 HIGH 출력 }
[함께 읽으면 좋은 페이지]
반응형'Technology > Arduino' 카테고리의 다른 글
아두이노 라이브러리 | LCD 모듈 (0) 2024.04.12 아두이노 프로젝트 | 디지털 타이머 (0) 2024.04.05 아두이노 라이브러리 | 7-세그먼트 디스플레이 (0) 2024.03.22 아두이노 | 네 자리 7-세그먼트 디스플레이 (0) 2024.03.22 아두이노 | PISO 시프트 레지스터 74HC165 (0) 2024.03.15