코드 검색

레슨 14/31-3: 아두이노 코딩 millis() 예제 3 - 푸시 버튼 사용

레슨 14/31-3: 아두이노 코딩 millis() 예제 3 - 푸시 버튼 사용

아두이노로 무언가가 언제 발생했는지—예를 들어 버튼 누름—기억하고, 정확한 시간이 지난 후에 동작을 수행하면서도 프로그램의 나머지 부분이 원활하게 계속 실행되도록 해야 했던 적이 있나요? 이것은 아두이노 프로그래밍에서 전형적인 과제이며, 해결책은 millis() 함수입니다. Robojax 아두이노 강좌의 일부인 이 튜토리얼은 실용적인 예를 보여줍니다: 푸시 버튼이 첫 번째 누름 후 5초의 지연이 경과한 후 두 번째로 눌렸는지 감지하는 것입니다. 이 기술은 타이밍이 중요한 반응형, 비차단 프로젝트를 만드는 데 기본이 됩니다.

Sunfounder 자동차 조립 완료

프로그램을 중단하지 않고 시간을 추적하기 위해 millis()를 사용하는 이 패턴은 다양한 실제 응용 분야에서 필수적입니다. 프로젝트에 영감을 줄 몇 가지 아이디어는 다음과 같습니다:

  • 디바운스 버튼 인터페이스: 장치를 켜기 위해 버튼을 특정 시간(예: 3초) 동안 눌러야 하는 시스템을 구현하여 실수로 누르는 것을 방지합니다.
  • 순차 동작: 모션 센서 트리거와 같은 하나의 이벤트가 특정 시간 창 내에서 다른 이벤트가 발생할 때만 실행되는 보조 동작을 준비시키는 시스템을 만듭니다.
  • 사용자 상호작용 타이머: 명령 전송이나 모터 시작과 같은 중요한 기능을 실행하기 위해 설정된 시간 내에 "확인" 입력(예: 두 번째 버튼 누름)이 필요한 프로젝트를 구축합니다.
  • 센서 게이팅: 센서의 첫 번째 신호를 사용하여 타이밍 창을 시작하고, 그 동안 두 번째 다른 센서의 판독값이 유효한 것으로 간주되거나 무시되도록 합니다.

필요한 하드웨어

이 프로젝트는 학습에 훌륭한 자료인 SunFounder 3-in-1 아두이노 키트의 구성 요소를 사용합니다. 필요한 것은 다음과 같습니다:

  • 아두이노 보드 (Uno, Nano 등)
  • 일시적인 푸시 버튼
  • 점퍼 와이어

배선 가이드

이 예제의 배선은 아두이노의 내부 풀업 저항 덕분에 매우 간단하며, 외부 저항이 필요 없습니다. (비디오 08:29에서)

  • 푸시 버튼의 한 다리를 아두이노의 GND 핀에 연결합니다.
  • 푸시 버튼의 다른 다리를 아두이노의 디지털 핀 2에 연결합니다.

INPUT_PULLUP을 사용하면 핀이 내부적으로 5V에 연결되어 정상적으로 HIGH를 읽습니다. 버튼을 누르면 핀이 GND에 연결되어 LOW를 읽게 됩니다. 이것이 코드에서 사용할 논리입니다.

코드 설명

이 프로젝트의 핵심은 첫 번째 버튼 누름을 추적한 다음 특정 시간 간격 후 두 번째 누름을 확인하는 논리입니다. 코드는 비차단 방식으로 설계되어 loop()에서 다른 작업의 실행을 중단하지 않습니다.

스케치 상단에는 타이밍 동작을 제어하는 주요 사용자 구성 가능 변수가 있습니다:

unsigned long event = 5000;// 5초
unsigned long buttonPushed =0;
  • event: 이것은 중요한 타이밍 변수입니다. 지연 시간을 밀리초 단위로 설정합니다. 이 예제에서는 5000으로 설정되어 5초와 같습니다. 프로젝트 요구 사항에 맞게 이 값을 다른 기간으로 변경할 수 있습니다.
  • buttonPushed: 이 변수는 플래그와 타임스탬프로 사용됩니다. 0에서 시작하며 버튼이 처음 눌릴 때 millis() 값으로 업데이트됩니다. 이 저장된 시간은 두 번째 누름 확인을 위한 차이를 계산하는 데 사용됩니다.

loop() 함수의 논리는 두 단계로 작동합니다. 먼저 버튼 상태를 읽고, 처음 눌린 경우(pb == LOW && buttonPushed == 0) millis()를 통해 현재 시간을 buttonPushed 변수에 기록합니다. 두 번째 단계는 버튼이 여전히 눌려 있고 첫 번째 누름이 기록되었는지 확인합니다. 그렇다면 현재 시간과 첫 번째 누름 시간 사이의 차이를 계산합니다. 이 차이가 event 시간보다 크거나 같으면 동작을 실행합니다—이 경우 시리얼 모니터에 메시지를 출력합니다.

라이브 프로젝트 시연

비디오에서 코드가 아두이노에 업로드되고 시리얼 모니터가 열려 동작을 관찰합니다. (비디오 16:03에서) millis() 값이 프로그램 시작 이후 시간을 보여주며 계속 출력되는 것을 볼 수 있습니다. 버튼을 처음 누르면 First push at:5019와 같은 메시지가 출력됩니다. 첫 번째 누름 후 5초 이상 버튼을 다시 누르고 유지하면 Action after 5 seconds of first push 메시지가 출력됩니다. 이는 지정된 지연이 경과한 후 두 번째 누름이 발생할 때만 동작이 트리거됨을 보여줍니다.

이 접근 방식의 강점은 루프 상단의 Serial.println(millis()) 줄이 중단 없이 계속 실행되어 타이밍 논리가 다른 코드 실행을 차단하지 않는다는 것을 증명한다는 것입니다. 이것이 delay() 함수 대신 millis()를 사용하는 근본적인 장점입니다.

이 비디오의 관련 프로젝트

챕터

  • [00:00] millis() 및 강좌 소개
  • [01:19] millis()란 무엇이며 왜 사용하나요?
  • [03:06] 첫 번째 실용 예제: millis() 출력하기
  • [05:46] millis()를 사용하여 5초 후 이벤트 트리거하기
  • [08:29] 예제 2: 5초 지연이 있는 푸시 버튼 동작
  • [12:14] 예제 3: 지연 후 두 번째 버튼 누름 감지
  • [17:20] map() 함수 소개
  • [19:47] LED 밝기 백분율 매핑의 실용 예제

이미지

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
918-Lesson 14/31-3: Arduino coding millis() example 3 with push button
언어: C++
/*
Lesson 14/31: Arduino coding millis() example 3 with push button
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
unsigned long buttonPushed =0;

void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // ilmoFan.com example-2 millis()
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW && buttonPushed ==0)
  {
    buttonPushed =millis();
    Serial.print("First push at:");
    Serial.println(buttonPushed);
  }
  if( pb ==LOW &&  buttonPushed >0 )
  {
   unsigned long difference = millis()- buttonPushed;
      if( difference >= event)
      {
        Serial.println("Action after 5 seconds of first push");
      }
  }
  
}

자원 및 참고자료

파일📁

사용자 매뉴얼