ESP8266 - 모션 센서 | ESP8266 - Motion Sensor

당신이 자동으로 문이 열리고 닫히거나, 전구가 켜지고 꺼지거나, 사람의 개입 없이 에스컬레이터가 작동하는 장소를 마주칠 때, “어떻게 그런 일이 가능하지?”라고 스스로에게 물어본 적이 있나요? 그렇다면, 이 튜토리얼은 당신의 질문에 답할 뿐만 아니라, ESP8266과 모션 센서를 사용하여 그것을 실현하는 방법도 보여줄 것입니다. 시작해볼까요!

이 튜토리얼은 여러분에게 모션 센서와 함께 ESP8266을 사용하는 방법을 지도합니다. 구체적으로, 우리는 배울 것입니다:

준비물

1×ESP8266 NodeMCU Amazon
1×Micro USB Cable Amazon
1×HC-SR501 Motion Sensor 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(Optional) 5V Power Adapter for ESP8266 Amazon
1×(Optional) Screw Terminal Expansion Board for ESP8266 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

HC-SR501 모션 센서에 관하여

HC-SR501 Motion Sensor

HC-SR501 PIR 센서는 사람(또는 동물)의 움직임을 감지할 수 있는 모듈입니다. 이 센서는 종종 많은 응용 프로그램에서 인간의 존재를 감지하는 데 사용되며, 예를 들어 전구의 자동 켜기/끄기, 문의 개폐, 에스컬레이터의 활성화/비활성화 또는 침입자 감지 등에 활용됩니다.

모션 센서 핀배열

HC-SR501 모션 센서에는 세 개의 핀이 있습니다:

  • GND 핀: 이것은 GND(0V)에 연결되어야 합니다.
  • VCC 핀: 이것은 VCC(5V)에 연결되어야 합니다.
  • OUTPUT 핀: 이것은 출력 핀입니다. 움직임이 감지되지 않을 때는 LOW가 되고 움직임이 감지되면 HIGH가 됩니다. 이 핀은 ESP8266의 입력 핀에 연결되어야 합니다.

HC-SR501은 센서 설정을 조정하는 데 사용되는 점퍼 하나와 두 개의 가변 저항기가 있습니다.

HC-SR501 Motion Sensor pinout

작동 원리

HC-SR501 센서는 이동하는 객체에서 나오는 적외선 방사 변화를 바탕으로 움직임을 감지할 수 있습니다. HC-SR501 센서가 객체를 식별하려면 두 가지 기준이 충족되어야 합니다:

  • 객체는 움직이거나 진동해야 합니다
  • 객체는 적외선을 방출해야 합니다

결과적으로:

  • 객체가 움직이고 있지만 적외선을 방출하지 않는 경우(예: 로봇이나 자동차 장난감 등), 센서에 의해 감지되지 않습니다.
  • 객체가 적외선을 방출하고 있지만 움직이지 않는 경우(예: 제자리에 서 있는 사람 등), 센서에 의해 감지되지 않습니다.

인간과 동물은 적외선 방사의 근원입니다. 따라서 센서는 그들의 움직임을 감지할 수 있습니다.

센서의 OUTPUT 핀 상태:

  • 감지 범위 내에 사람(또는 동물)이 없을 때는 LOW입니다.
  • 사람(또는 동물)이 감지 범위 내로 들어오면, 핀이 LOW에서 HIGH로 전환되어 움직임이 감지되었음을 나타냅니다.
  • 사람(또는 동물)이 감지 범위를 벗어나면, 핀이 HIGH에서 LOW로 전환되어 움직임이 멈췄음을 보여줍니다.

위의 영상은 이론적으로 모션 센서가 작동하는 방식을 보여줍니다. 실제로 모션 센서는 센서의 설정(이는 고급 사용법 부분에 설명되어 있습니다)에 따라 약간 다르게 작동합니다.

인간의 존재 감지

센서는 인간의 존재를 직접 감지하지 않습니다. 단지 움직임만을 감지합니다. 우리는 센서가 감지한 움직임을 기반으로 인간의 존재 여부를 추론하기 위해 ESP8266을 사용합니다. 다음 규칙을 따릅니다:

  • 움직임이 감지되면, 그것은 사람이 있다는 것을 의미합니다
  • 움직임이 감지되지 않으면, 그것은 사람이 없다는 것을 의미합니다

이 규칙은 완벽하지 않으며 사람이 센서 범위 내에 있지만 움직이지 않는 상황에서는 작동하지 않습니다. 움직임이 감지되지 않고 ESP8266은 사람이 없다고 결론짓습니다. 그러나 사람은 보통 작은 움직임을 하기 때문에 여전히 받아들일 수 있습니다.

예를 들어, 회의실에서는 모션 센서를 사용하여 불을 켜고 끕니다. 사람들이 방에 들어서면 자동으로 불이 켜집니다. 그러나 회의 도중 모두가 움직이지 않고 정지해 있으면 센서는 어떠한 움직임도 감지하지 못해 아무도 없는 것으로 판단하고 불을 끕니다. 불을 다시 켜려면 누군가가 움직여야 합니다.

그러나 이 문제는 심각하지 않으며 센서는 저렴합니다. 따라서 많은 응용 프로그램에서 사람을 감지하는 데 널리 사용됩니다.

ESP8266 - HC-SR501 모션 센서

아두이노의 디지털 입력 핀을 HC-SR501 센서의 출력 핀에 연결하세요. ESP8266 코드를 사용하여 출력 핀의 값을 확인하고 움직임을 감지하세요.

선연결

ESP8266 NodeMCU Motion Sensor wiring diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

ESP8266의 핀 배치ESP8266 및 다른 구성 요소에 전원을 공급하는 방법에 대해 더 많이 보십시오.

초기 설정

Time Delay AdjusterScrew it in anti-clockwise direction fully.
Detection Range AdjusterScrew it in clockwise direction fully.
Repeat Trigger SelectorPut jumper as shown on the image.
arduino motion sensor initial setting

움직임 센서를 위한 프로그래밍 방법

아두이노의 핀에 디지털 입력을 설정하려면 pinMode() 함수를 사용하세요.

pinMode(MOTION_SENSOR_PIN, INPUT);

센서의 OUTPUT 핀 상태를 digitalRead() 함수로 읽으십시오.

motion_state = digitalRead(MOTION_SENSOR_PIN);

핀이 LOW에서 HIGH로 바뀌는 시점을 확인하여, 움직임의 시작을 나타냅니다.

prev_motion_state = motion_state; // 이전 상태 저장 motion_state = digitalRead(MOTION_SENSOR_PIN); // 새 상태 읽기 if (prev_motion_state == LOW && motion_state == HIGH) { // 핀 상태 변경: LOW -> HIGH Serial.println("Motion detected!"); }

핀이 HIGH 상태에서 LOW 상태로 변경되는 시점을 식별하여, 동작이 멈췄음을 나타냅니다.

prev_motion_state = motion_state; // 이전 상태 저장 motion_state = digitalRead(MOTION_SENSOR_PIN); // 새로운 상태 읽기 if (prev_motion_state == HIGH && motion_state == LOW) { // 핀 상태 변경: HIGH -> LOW Serial.println("Motion stopped!"); }

ESP8266 코드

/* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/esp8266-motion-sensor */ #define MOTION_SENSOR_PIN D7 // ESP8266의 핀 D7이 모션 센서의 OUTPUT 핀에 연결됨 int motion_state = LOW; // 핀의 현재 상태 int prev_motion_state = LOW; // 핀의 이전 상태 void setup() { Serial.begin(9600); // 시리얼 모니터와 통신하기 위해 시리얼을 초기화합니다. pinMode(MOTION_SENSOR_PIN, INPUT); // 센서의 OUTPUT 핀에서 값을 읽기 위해 아두이노 핀을 입력 모드로 설정합니다. } void loop() { prev_motion_state = motion_state; // 이전 상태 저장 motion_state = digitalRead(MOTION_SENSOR_PIN); // 새로운 상태 읽기 if (prev_motion_state == LOW && motion_state == HIGH) { // 핀 상태 변경: LOW -> HIGH Serial.println("Motion detected!"); // TODO: 여기서 경보, 빛을 켜거나 장치를 활성화하세요... } else if (prev_motion_state == HIGH && motion_state == LOW) { // 핀 상태 변경: HIGH -> LOW Serial.println("Motion stopped!"); // TODO: 여기서 경보, 빛을 끄거나 장치를 비활성화하세요... } }

사용 방법

Arduino IDE에서 ESP8266을 시작하려면 다음 단계를 따르세요:

  • ESP8266을 처음 사용하는 경우 Arduino IDE에서 ESP8266 환경 설정 방법 튜토리얼을 확인하세요.
  • 다이어그램에 표시된 대로 구성요소를 연결하세요.
  • USB 케이블을 사용하여 ESP8266 보드를 컴퓨터에 연결하세요.
  • 컴퓨터에서 Arduino IDE를 엽니다.
  • 올바른 ESP8266 보드(예: NodeMCU 1.0 (ESP-12E Module))와 해당 COM 포트를 선택하세요.
  • 코드를 복사하여 Arduino IDE로 엽니다.
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 ESP8266으로 전송합니다.
  • 시리얼 모니터를 엽니다.
  • 센서의 범위 앞에서 손을 움직입니다.
  • 시리얼 모니터에서 출력을 확인하세요.
COM6
Send
Motion detected! Motion stopped!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

고급 사용법

이 섹션에는 압도될 수 있는 고급 정보가 포함되어 있습니다. 내용에 대해 확신이 없다면 건너뛰어 다음 섹션으로 이동하십시오.

앞서 언급했듯이, 점퍼 하나와 포텐쇼미터 두 개를 사용하여 센서의 구성을 변경할 수 있습니다.

탐지 범위 조절기

이 포텐쇼미터는 어떤 것이 감지될 수 있는 거리(약 3에서 7미터 사이)를 변경하는 데 사용됩니다.

  • 만약 그것을 오른쪽으로 완전히 돌리면, 3미터 이내의 것들만 감지할 수 있습니다.
  • 만약 그것을 왼쪽으로 완전히 돌리면, 7미터 떨어진 것까지 감지할 수 있습니다.
Motion Sensor Detection Range

시간 지연 조절기

이 저항기는 시간 지연을 조정하는 데 사용됩니다:

  • 시계 방향으로 완전히 돌릴 때 시간 지연은 대략 5분입니다.
  • 반시계 방향으로 완전히 돌릴 때 시간 지연은 대략 3초입니다.

다음 섹션에서는 반복 트리거와 함께 시간 지연 개념을 설명합니다.

motion sensor adjust time delay

반복 트리거 선택기

트리거 모드를 선택하는 데 사용되는 점퍼가 존재합니다: 단발 트리거 또는 반복 트리거 중 하나입니다.

motion sensor trigger selection

시간 지연 설정(시간 지연 조정기를 통해 설정됨)을 time_delay라고 합시다. 오랜 시간 동안(여러 번 time_delay보다 긴 시간) 센서 범위 안에서 움직인다면(motion_time이라고 함):

단일 트리거 모드: OUTPUT 핀의 상태는 LOWHIGH 사이에서 여러 번 전환됩니다. HIGH 지속 시간은 time_delay와 같을 것이며, LOW 지속 시간은 3초로 고정됩니다.

motion sensor single trigger mode

반복 트리거 모드: OUTPUT 핀의 상태는 (motion_time + time_delay)의 기간 동안 HIGH 상태로 유지됩니다.

motion sensor repeatable trigger mode

테스팅

  • 단일 트리거 모드:
    • 점퍼를 옮겨 단일 트리거 모드를 선택하세요
    • 센서 앞에서 손을 대략 10초 동안 움직이세요
    • 손을 센서의 감지 범위 밖으로 빼세요
    • 3초를 기다린 후, 시리얼 모니터에서 다음과 같은 출력을 관찰하게 될 것입니다:
    COM6
    Send
    Motion detected! Motion stopped! Motion detected! Motion stopped! Motion detected! Motion stopped!
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    반복 가능한 트리거 모드:

    • 점퍼를 옮겨 반복 트리거 모드를 선택하세요
    • 센서 앞에서 약 10초 동안 손을 흔드세요
    • 손을 센서의 감지 범위에서 멀어지게 하세요
    • 3초를 기다린 후, 시리얼 모니터에서 다음과 같은 출력을 관찰하게 됩니다:
    COM6
    Send
    Motion detected! Motion stopped!
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    단일 트리거 모드에서는 센서가 두 번 또는 세 번 트리거되는 것을 관찰할 수 있습니다. 반면, 반복 트리거 모드에서는 한 번만 트리거됩니다.

    ※ NOTE THAT:

    LOW (3초) 시간 동안, 고정되어 조정할 수 없는 시간 동안, 센서는 어떠한 움직임도 감지할 수 없습니다. 이것은 실제로 문제를 일으키지 않습니다.

    반복 트리거 모드 사용이 권장됩니다.

    많은 실제 응용 프로그램에서, 우리는 사람이 존재할 때 기계/장치를 켜거나 활성화시키고, 사람이 더 이상 존재하지 않을 때 즉시 끄거나 비활성화하지 않습니다. 대신, 우리는 그것들을 끄거나 비활성화하기 전에 타임아웃을 기다립니다.

    시간 지연 사용 방법

    사람이 감지되지 않으면, 자동화 시스템은 작업을 시작하기 전에 일정 기간 동안 기다릴 것입니다.

    모션 센서와 ESP8266 코드에서 시간 지연을 조정할 수 있습니다:

    • 모션 센서에서: 최소 3초, 최대 5분으로, 시간 지연 조절기를 통해 설정됩니다.
    • ESP8266 코드에서: 코딩을 통해 어떤 값이든 설정할 수 있습니다.

    ESP8266 코드에서 타임아웃을 지정하지 않으면 타임아웃 값은 센서 구성의 시간 지연과 동일하게 됩니다.

    ESP8266 코드에서 타임아웃을 지정하면, 총 시간 지연은 센서에 설정된 지연과 ESP8266 코드에 지정된 지연의 조합이 됩니다.

    ESP8266 코드에서 시간 지연 설정하기

    /* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/esp8266-motion-sensor */ #define MOTION_SENSOR_PIN D7 // ESP8266 핀 D7이 모션 센서의 OUTPUT 핀에 연결됨 int motion_state = LOW; // 핀의 현재 상태 int prev_motion_state = LOW; // 핀의 이전 상태 const unsigned long DELAY_TIME_MS = 30000; // 30000 밀리초 ~ 30초 bool delay_enabled = false; unsigned long delay_start_ms; void setup() { Serial.begin(9600); // 직렬 통신을 초기화하여 시리얼 모니터와 통신합니다. pinMode(MOTION_SENSOR_PIN, INPUT); // 센서의 OUTPUT 핀에서 값을 읽기 위해 아두이노 핀을 입력 모드로 설정 } void loop() { prev_motion_state = motion_state; // 상태 저장 motion_state = digitalRead(MOTION_SENSOR_PIN); // 새로운 상태 읽기 if (prev_motion_state == LOW && motion_state == HIGH) { // 핀 상태 변경: LOW -> HIGH Serial.println("Motion detected!"); Serial.println("Turning on / activating"); delay_enabled = false; // 딜레이 비활성화 // TODO: 여기 ... 알람 켜기, 조명 켜기 또는 장치 활성화 } else if (prev_motion_state == HIGH && motion_state == LOW) { // 핀 상태 변경: HIGH -> LOW Serial.println("Motion stopped!"); delay_enabled = true; // 딜레이 활성화 delay_start_ms = millis(); // 시작 시간 설정 } if (delay_enabled == true && (millis() - delay_start_ms) >= DELAY_TIME_MS) { Serial.println("Turning off / deactivating"); delay_enabled = false; // 딜레이 비활성화 // TODO: 여기 ... 알람 끄기, 조명 끄기 또는 장치 비활성화 } }

    반복 트리거 모드가 활성화되면, 지연 시간은 time_delay에 30초를 더한 값으로 설정됩니다. 이는 센서의 설정에서 시간 지연 조정기를 사용하여 조정할 수 있습니다.

도전하세요

모션 센서를 사용하여 다음 프로젝트 중 하나를 완성하세요:

  • 방에 들어올 때 불을 켜고 나간 후 30초가 지나면 불을 끄세요. : ESP8266 - 릴레이를 살펴보세요.
  • 귀중품에 접근하는 사람이 있을 때 알람이 울리도록 설정하세요. : ESP8266 - 피에조 부저를 확인해 보세요.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!