Journey to CS/임베디드

아두이노 스케치를 작성하다가 loop()함수에 대해 생긴 의문...그리고 답

Cordilog 2025. 7. 27. 14:24

최근에 소프트웨어 경진대회 프로젝트를 하다가 진동 모터를 하나 얻어오게 되었다.

진동 모터를 가지고 어떤 실습을 해볼까 하다가, 아두이노에 진동 모터, LED, 버튼을 연결하여 버튼을 한 번 눌렀다 떼면 3초 동안 LED가 밝아졌다가 어두워지면서 동시에 진동 모터가 울리는 프로그램을 만들어 보기로 했다. 

그런데 한 가지 의문이 생겼다.

 

아두이노 프로그램은 기본적으로 초기 설정을 하는 setup() 함수가 한 번 실행된 후에는 loop() 함수를 무한 반복 실행한다. 

 

그런데 바로 그 '반복 실행'이라는 점이 약간 이해가 되지 않았다. 

내가 지금 만들고자 하는 프로그램은 버튼을 한 번 릴리즈하면 진동과 LED가 3초 동작하고 끝나는 프로그램으로, 반복 동작이 없다.

그런데 이걸 왜 setup() 함수가 아닌 loop() 함수에 넣지?

 

그런데 이렇게 생각하는 건 너무 1차원적인 접근이었다... ㅎㅎ

 

우선 내 프로그램은 3가지 목표를 동시에 달성해야 한다. 

1. 버튼을 누르는 것을 계속 감지

2. 버튼을 누르면 3초 동안 진동 모터를 켜야 함

3. 버튼을 누르면 3초 동안 LED를 페이드 인/아웃 시켜야 함

 

그러니까 나는 2, 3번만 생각하고 1번에 대해서는 생각을 못한거다... 버튼을 누르는 동작을 한 번 인식하는 것만 생각했지, 버튼이 눌리는 것을 계속해서 감지해야 한다는 생각을 못했다. 

 

만약 loop() 함수를 통해 버튼 눌림을 지속적으로 감지하지 않고, 버튼을 한 번 눌렀다 떼는 동작만 코드에 작성하게 되면, 아두이노는 버튼이 눌렸다가 떼어지는 순간을 단 한번만 처리하고, 그 이후에는 버튼을 눌러도 반응을 하지 않을 것이다. 

 

어떻게 이 생각을 못했는지 ㅋㅋㅋ 역시 나는 아직도 한참 멀었다... 

 

이 프로그램에 대한 코드와 회로 디자인, 실행 결과는 별도의 포스팅에서 자세히 다루도록 하겠다.