const int seg[] = {4, 5, 6, 7, 8, 9, 10}; // 디스플레이에 연결된 핀들의 배열입니다.
const int numPattern[10][7] = {
{0, 1, 1, 1, 1, 1, 1}, // 숫자 0의 세그먼트 패턴
{0, 0, 0, 1, 0, 0, 1}, // 숫자 1의 세그먼트 패턴
{1, 0, 1, 1, 1, 1, 0}, // 숫자 2의 세그먼트 패턴
{1, 0, 1, 1, 0, 1, 1}, // 숫자 3의 세그먼트 패턴
{1, 1, 0, 1, 0, 0, 1}, // 숫자 4의 세그먼트 패턴
{1, 1, 1, 0, 0, 1, 1}, // 숫자 5의 세그먼트 패턴
{1, 1, 1, 0, 1, 1, 1}, // 숫자 6의 세그먼트 패턴
{0, 1, 1, 1, 0, 0, 1}, // 숫자 7의 세그먼트 패턴
{1, 1, 1, 1, 1, 1, 1}, // 숫자 8의 세그먼트 패턴
{1, 1, 1, 1, 0, 0, 1} // 숫자 9의 세그먼트 패턴
}; // 0부터 9까지 숫자의 세그먼트 패턴 배열
boolean lastButton = LOW; // 이전 버튼 상태를 저장하는 Boolean 변수
boolean currentButton = LOW; // 현재 버튼 상태를 저장하는 Boolean 변수
const int BUTTON = 2; // 버튼을 2번 핀에 지정
int currentNumber = 0; // 현재 숫자를 저장하는 변수
void setup() {
// 7개 세그먼트 디스플레이 핀들을 출력 모드로 설정
for (int i = 0; i < 7; i++) {
pinMode(seg[i], OUTPUT);
}
pinMode(BUTTON, INPUT); // 버튼 핀을 입력 모드로 설정
Serial.begin(9600); // 시리얼 통신 시작
Serial.println("201904035/SungJun Choi"); // 시리얼 모니터에 출력
}
boolean debounce(boolean last) {
boolean current = digitalRead(BUTTON); // 현재 버튼 상태 읽기
if (last != current) {
delay(5); // 짧은 시간 동안 대기하여 디바운싱 처리
current = digitalRead(BUTTON); // 다시 현재 버튼 상태 읽기
}
return current; //반환해주고있습니다.
}
void loop() {
currentButton = debounce(lastButton); // 디바운싱 처리된 버튼 상태를 읽는 코드입니다.
if (currentButton == HIGH && lastButton == LOW) {
currentNumber = (currentNumber + 1) % 10; // 버튼이 눌릴 때만 동작하며, 1씩 숫자가 증가하며 9까지만 증가하는 것을 만들기 위해서 %10을 넣었습니다.
displayNumber(currentNumber); // 디스플레이에 현재 숫자 출력해줍니다.
}
lastButton = currentButton; // 다음 IF문 함수가 버튼이 안눌려도 돌아가는 것을 막기 위해서 작성되었습니다.
}
void displayNumber(int number) {
// 입력된 숫자를 7세그먼트 디스플레이에 출력합니다. 총 7번 실행합니다.
for (int i = 0; i < 7; i++) {
digitalWrite(seg[i], numPattern[number][i]);
}
}

스위치 디바운싱 함수는 'digitalRead(BUTTON)'를 사용하여 현재 버튼의 상태를 읽습니다.
그리고나서 이전 버튼 상태(last)와 현재 버튼 상태(current)를 비교합니다.
만약에 이전 버튼 상태와 현재 버튼 상태가 다르다면, delay(5)를 통해 5 밀리초 동안 대기시간을 가집니다.
이것은 짧은 시간 동안 안정화되기를 기다리는 것으로 디바운싱을 수행합니다.
대기 후에 다시 한 번 digitalRead(BUTTON)를 사용하여 현재 버튼 상태를 읽습니다.
디바운싱 처리된 현재 버튼 상태(current)를 반환합니다.
맨 처음에 이전버튼과 현재버튼 두개는 모두 LOW의 상태를 표시하고 있습니다.
그러다가 버튼을 누르면 debounce(lastButto)를 통해서 currentButton에 HIGH 값이 들어가서 밑에 IF문이 돌아갑니다. 그 이후 lastButton = currentButton;를 통해서 lastButton = HIGH 값이 들어가는 동시에 자동으로 돌아가는 것을 막아줍니다. 다시 버튼을 누르면 lastButton는 이전에 선언한 LOW 값을 가지게 되며 IF문에 진입하여 다음 숫자가 출력 될 것입니다. 결국에 버튼을 계속 누르면 0~9까지 표시가 되는 것을 계속 반복합니다.

▶ 느낀점
처음이지만 충분히 만족하는 결과를 만들었으며, currentButton,lastButton의 상태에 따른 디바운싱 처리하는 부분이 처음에는 이해가 되지 않아 코드를 이상하게 만들었지만, 다시 수정하여 현재버튼과 이전버튼의 상태를 재정의하였습니다.
추후에 디스플레이 화면을 3개 장착하고, 버튼 클릭 할 때마다 input을 설정하여 신호를 보내는 방식으로 숫자가 표시가 되는 것이 아니라. 한번 누르면 시간이 계속 흐르고 다시 누르면 멈추는 코드를 구현하여 각 디스플레이 화면에 0~9까지 숫자가 설정 한 속도에 동작하는 방식으로 "시간 초 맞추기 게임"을 개발 할 계획입니다.