레슨 14/31-2: 아두이노 코딩 millis() 예제 2 (이벤트 포함)
이 튜토리얼에서는 Arduino millis() 함수를 사용하여 프로그램의 나머지 부분을 차단하지 않고 지정된 시간이 경과한 후에만 작업을 트리거하는 방법을 배우게 됩니다. 이는 LED를 깜빡이면서 센서를 읽거나 버튼 누름을 모니터링하는 등 여러 작업을 동시에 실행해야 하는 반응성 있는 Arduino 프로젝트를 만드는 데 필수적인 기술입니다. 이 특정 예제는 5초 후에 이벤트를 트리거하는 데 초점을 맞추지만, 이 로직은 수많은 실제 시나리오에 적용할 수 있습니다.
다음은 이 패턴을 자신의 프로젝트에서 사용할 수 있는 몇 가지 실용적인 예입니다:
- 지연 활성화: 시스템이 설정된 시간 동안 실행된 후에만 팬이나 펌프를 켭니다.
- 안전 인터록: 모터 시작과 같은 위험한 작업을 수행하기 전에 버튼을 일정 시간 동안 누르고 있어야 합니다.
- 시간 기반 알림: 센서 판독값이 특정 시간 내에 변경되지 않으면 알람이나 알림을 트리거합니다.
- 비차단 타이머: 장치가 응답하지 않으면 재설정하는 "워치독" 타이머를 만듭니다.
이것이 해결하는 핵심 문제는 delay() 함수의 한계입니다. delay(5000)을 사용하면 Arduino는 그 5초 동안 다른 코드 실행을 중지합니다. 이는 간단한 스케치에는 괜찮지만, 대기하는 동안 센서를 읽거나 디스플레이를 업데이트하거나 버튼 누름을 감지해야 하는 더 복잡한 프로젝트에서는 주요 문제가 됩니다. 보드에 전원이 켜진 이후의 밀리초를 계산하는 millis() 함수는 프로그램을 일시 중지하지 않고 시간을 확인할 수 있게 해줍니다.
필요한 하드웨어
- Arduino 보드 (Uno, Nano, Mega 등)
- 푸시 버튼
- 점퍼 와이어
배선 가이드
이 예제의 배선은 매우 간단합니다. 내부 풀업 저항을 사용하므로 버튼에 외부 저항이 필요하지 않습니다.
- 푸시 버튼의 한 다리를 Arduino의 GND 핀에 연결합니다.
- 푸시 버튼의 다른 다리를 Arduino의 디지털 핀 2에 연결합니다.
코드에서 INPUT_PULLUP을 사용하므로 버튼을 누르지 않으면 핀이 HIGH를 읽고, 버튼을 눌러 핀이 접지에 연결되면 LOW를 읽습니다. (비디오 08:29 부분)
코드 이해하기
이 코드는 간단한 이벤트 기반 타이머를 보여줍니다. 프로그램은 현재 millis() 값을 Serial Monitor에 지속적으로 출력합니다. 푸시 버튼을 누르고 있고 Arduino가 최소 5초 동안 실행된 경우 "Take action"을 Serial Monitor에 출력합니다. 핵심은 millis() 확인이 시간의 연속 출력을 중단하지 않는다는 것입니다.
코드에서 사용자가 구성할 수 있는 부분을 살펴보겠습니다:
unsigned long event = 5000;// 5초
이것은 구성할 가장 중요한 변수입니다. "이벤트"의 지속 시간을 밀리초 단위로 정의합니다. 이 예제에서는 5000으로 설정되어 있으며, 이는 5초와 같습니다. 지연을 변경하려면 이 숫자를 수정하면 됩니다. 예를 들어 10000으로 설정하면 작업이 10초 후에 트리거됩니다. unsigned long 데이터 유형을 사용하는 것이 중요합니다. millis()의 값은 매우 커질 수 있으며 결국 표준 int 변수의 최대값을 초과하여 비교 오류가 발생할 수 있기 때문입니다. (비디오 05:46 부분)
pinMode(2,INPUT_PULLUP);
이 줄은 디지털 핀 2를 입력으로 구성하고 내부 풀업 저항을 활성화합니다. 이는 외부 저항 없이 버튼을 연결할 수 있게 하는 핵심 구성 단계입니다. 핀은 기본적으로 HIGH를 읽으며 버튼을 눌러 접지에 연결하면 LOW가 됩니다. 다른 핀을 사용하려면 여기와 루프 내의 digitalRead(2) 줄에서 숫자 2를 변경하세요. (비디오 08:46 부분)
loop() 내부의 로직은 간단합니다. 버튼 상태를 읽습니다. 버튼이 눌린 경우(pb == LOW), 현재 시간(millis())이 정의된 event 시간보다 크거나 같은지 확인합니다. 두 조건이 모두 참이면 작업 메시지를 출력합니다. 시간을 출력하는 루프의 나머지 부분은 중단 없이 계속 실행되어 delay()보다 millis()의 강점을 보여줍니다.
이 예제는 Arduino가 시작된 시점부터 시간을 확인합니다. 비디오 시리즈의 세 번째 예제는 첫 번째 버튼 누름 시간을 기록하고 두 번째 누름이 최소 5초 후에 발생하는 경우에만 작업을 트리거하는 방식으로 이를 확장합니다. 해당 로직은 Lesson 14/31-3: Arduino 코딩 millis() 예제 3 (푸시 버튼 포함)에서 다룹니다.
라이브 프로젝트 데모
코드를 업로드하고 Serial Monitor(9600 보드)를 열면 보드에 전원이 켜진 이후의 밀리초를 나타내는 숫자가 연속적으로 표시됩니다. 5초가 지나기 전에 푸시 버튼을 누르고 있으면 아무 일도 일어나지 않습니다. 그러나 5초가 지난 후 버튼을 누르고 있으면 Serial Monitor에 "Take action" 메시지가 출력되는 것을 볼 수 있습니다. 버튼을 누르고 있는 동안 작업이 계속 출력됩니다. 이는 다른 코드(출력)가 원활하게 실행될 수 있게 하는 비차단 타이머를 보여줍니다. (비디오 10:52 부분)
이 비디오의 관련 프로젝트
이 비디오는 Arduino 타이밍 및 매핑 함수에 대한 다중 파트 시리즈의 일부입니다. 동일한 원본 자료에서 만든 다른 튜토리얼을 살펴보세요:
- 레슨 14/31-1: Arduino Millis (delay 없음) 및 map 함수 | SunFounder Robojax
- 레슨 14/31-3: Arduino 코딩 millis() 예제 3 (푸시 버튼 포함)
- 레슨 14/31-4: Arduino 코딩 map() 예제 1
- 레슨 14/31-5: Arduino 코딩 map() 예제 2
챕터
- [00:00] millis() 및 SunFounder 키트 소개
- [01:19] millis()란 무엇이며 delay() 대신 사용하는 이유는?
- [03:06] 실습 데모: millis() 값 출력
- [05:46] millis() 및 unsigned long으로 이벤트 만들기
- [08:29] INPUT_PULLUP으로 푸시 버튼 배선 및 코딩
- [10:52] 푸시 버튼으로 이벤트 예제 실행
- [12:14] 예제 3 미리보기: 두 번째 버튼 누름 감지
- [17:20] map() 함수 소개
- [19:47] LED로 map() 함수 코딩 및 데모
/*
Lesson 14/31: Arduino coding millis() example 2 with event
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
unsigned long event = 5000;// 5 seconds
void setup() {
Serial.begin(9600);//initialize serial monitor
Serial.println("Introduction to millis");
pinMode(2,INPUT_PULLUP);
}
void loop() {
// Robojax.com millis() example 1
Serial.println(millis());
int pb = digitalRead(2);// read pin 2
if(pb ==LOW)
{
if(millis() >= event)
{
Serial.println("Take action");
}// if end
}// if end
}// loop end
필요할 수 있는 것들
-
아마존SunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
아마존
-
아마존
-
아마존
-
기타
자원 및 참고자료
-
외부Purchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
파일📁
사용자 매뉴얼
-
SunFounder 3-in-1 Arduino 스마트 카 조립 설명서이 문서는 SunFounder 3-in-1 Arduino 스마트 카의 단계별 조립을 보여줍니다.
SunFounder_car_assembly_manual.pdf1.20 MB