-
아두이노 프로젝트 | 디지털 타이머Technology/Arduino 2024. 4. 5. 18:00
1. 디지털 타이머
일상에서 쉽게 발견할 수 있는 타이머를 아두이노 플랫폼을 이용해 디지털로 구현해보자. 구현하고자 하는 디지털 타이머는 0부터 9999초까지 설정할 수 있도록 네 자리 7-세그먼트 디스플레이를 가지고 있고, 시프트 레지스터 74HC595로 제어된다. 또한 택트 스위치 3개를 가지고 있으며, 첫 번째 스위치를 누르면 제어하려는 자리수를 왼쪽으로 옮길 수 있다. 두 번째 스위치를 누르면 제어하는 자리수의 숫자를 설정할 수 있고, 누른 횟수가 9회를 넘으면 다시 0으로 초기화된다. 마지막으로 세 번째 스위치를 누르면 설정한 시간에서부터 0초까지 1초 간격으로 숫자를 디스플레이에 나타내도록 프로그램을 작성해보자.
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[3] = {6, 5, 4}; // 불린형 배열 선언 후 false로 초기화 bool State[3] = {false, false, false}; // 정수형 배열 선언 후 0으로 초기화 int Count[4] = {0, 0 ,0 ,0}; int Index = 3; // 정수형 변수 선언 후 3으로 초기화 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); for (int i = 0; i < 3; i++) { pinMode(Switch[i], INPUT); // 디지털 Switch[i]번 핀을 입력(INPUT) 모드로 설정 } } void loop() { // 왼쪽에서 첫 번째 스위치 동작: 제어할 Digit을 왼쪽으로 이동 if (digitalRead(Switch[0]) == HIGH) { if (State[0] == false) { State[0] = true; if (Index > 0) { Index -= 1; } else { Index = 3; } } } else { State[0] = false; } // 왼쪽에서 두 번째 스위치 동작: Digit 제어 if (digitalRead(Switch[1]) == HIGH) { if (State[1] == false) { State[1] = true; if (Count[Index] < 9) { Count[Index] += 1; } else { Count[Index] = 0; } } } else { State[1] = false; } // 네 자리 7-세그먼트 디스플레이에 표시 DisplayDigit(1, Count[3]); // DisplayDigit 함수 실행 delay(5); // 5 ms 대기 DisplayDigit(2, Count[2]); delay(5); DisplayDigit(3, Count[1]); delay(5); DisplayDigit(4, Count[0]); delay(5); // 왼쪽에서 세 번째 스위치 동작: 타이머 시작 if (digitalRead(Switch[2]) == HIGH) { if (State[2] == false) { State[2] = true; // 각 자리 카운트 정보를 정수 자료형으로 변형 int Value = Count[0] * 1000 + Count[1] * 100 + Count[2] * 10 + Count[3]; while (Value >= 0) { Display(Value); // Display 함수 실행 delay(1000); Value -= 1; } Count[0] = 0; Count[1] = 0; Count[2] = 0; Count[3] = 0; } } else { State[2] = false; } } // 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); shiftOut(DataPin, ClockPin, LSBFIRST, DataArray[Number]); digitalWrite(LatchPin, HIGH); }
[함께 읽으면 좋은 페이지]
반응형'Technology > Arduino' 카테고리의 다른 글
아두이노 I2C 통신 | LCD I2C 모듈 LiquidCrystal_I2C.h (1) 2024.06.14 아두이노 라이브러리 | LCD 모듈 LiquidCrystal.h (0) 2024.04.12 아두이노 프로젝트 | 디지털 카운터 (0) 2024.03.29 아두이노 라이브러리 | 7-세그먼트 디스플레이 SevSeg.h (0) 2024.03.22 아두이노 | 네 자리 7-세그먼트 디스플레이 (0) 2024.03.22