[아두이노 강좌] 17. 침입자 움직임 탐지시 이메일 경고 보내기

본 게시글에서는 PIR 움직임 탐지 센서를 이용하여 아두이노가 PC상의 파이선 프로그램과 통신하여 움직임이 검출되면 파이선프로그램이 이메일을 보내는 프로젝트를 진행하여 보겠습니다.

overview.jpg

사진에 보이는 반투명한 반구 모양의 모듈이 PIR센서입니다.

브레드보드 레이아웃

브레드보드를 아래와 같이 셋팅합니다. 아두이노에 연결할 것은 PIR센서 하나입니다.

breadboard.png

아두이노 코드

아두이노는 움직임이 감지 될때 마다 USB Serial 연결을 통하여 메일 보낼 것입니다. 하지만 이러한 방식은 매우 많은 이메일을 보내게 될 가능성이 있기 때문에 일정 시간이내에서는 메일을 또 보내지 않도록 작성되었습니다.

  1. int pirPin = 7;
  2. int minSecsBetweenEmails = 60; // 1 min
  3. long lastSend = -minSecsBetweenEmails * 1000l;
  4. void setup()
  5. {
  6. pinMode(pirPin, INPUT);
  7. Serial.begin(9600);
  8. }
  9. void loop()
  10. {
  11. long now = millis();
  12. if (digitalRead(pirPin) == HIGH)
  13. {
  14. if (now > (lastSend + minSecsBetweenEmails * 1000l))
  15. {
  16. Serial.println("MOVEMENT");
  17. lastSend = now;
  18. }
  19. else
  20. {
  21. Serial.println("Too soon");
  22. }
  23. }
  24. delay(500);
  25. }

변수 minSecBetweenEmails는 60초로 설정되었지만 원하는 숫자로 변경이 가능합니다. 여기서는 60초이므로 1분이내에는 이메일이 다시 발송되지 않습니다. 언제 마지막 이메일이 발송되었는지를 확인하기 위해 lastSend변수가 사용되었습니다. 이 변수는 음수로 초기화되고 minSecsBetweenEmails의 음의 값을 가지게 됩니다. 이렇게 하면 스케치가 시작하자마자 PIR센서가 즉시 트리거 될수 있게 됩니다.

loop안에서는 함수 millis()가 사용되어 밀리세컨드를 얻을 수 있습니다. 아두이노가 시작되면 밀리세컨드를 마지막 알람이 트리거 되었을 때와 비교하고, 정해진 시간보다 넘었을 경우에만 MOVEMENT 메세지를 보내게 됩니다. 그 시간이 넘지 않았다면 Too soon메세지를 보내게 됩니다.

파이썬 프로그램을 실행하기 전에 아두이노 IDE의 시리얼 모니터를 열어서 아두이노가 올바르게 동작하는 지 테스트 할 수 있습니다.

serial_monitor.png

Python과 PySerial 인스톨하기

먼저 PC에 파이썬을 설치합니다.

윈도우에 파이썬 설치하기

http://www.python.org/getit/ 에서 파이썬 인스톨 파일을 다운로드 받습니다.

본 프로젝트에서는 Python 2.7.3을 사용합니다. Python3에서는 PySerial을 사용시 알려진 버그가 있으므로 Python 2.7.3을 사용합니다.

pyserial_install_dos_1.png

파이썬은 설치한뒤 명령창에서 사용하기 위해 아래의 그림과 같이 PATH 환경 변수를 수정합니다.

Python_inst_win_setting_path.png

윈도우의 제어판-->시스템속성-->환경변수를 선택하여 위의 창이 나오면 아래의 Path를 선택하고 Edit버튼을 눌러서 끝부분에 ;C:\Python27 을 추가합니다.

만약 제대로 추가가 잘 되었다면 cmd 창에서 python 을 타이핑 할 경우 아래와 같은 화면이 나올 것입니다. 만약 안나온다면 파이선이 설치된 PC의 폴더위치를 다시 한번 확인하여 오타나 ; 가 빠지지 않았는지 확인합니다.

python_from_dos.png

PySerial 설치하기

다음의 링크에서 PySerial 2.6 설치 패키지를 다운로드 받습니다. https://pypi.python.org/pypi/pyserial

파일명: pyserial-2.6.tar.gz

다운로드한 파일의 압축을 풉니다. 윈도우 사용자는 7-zip(www.7-zip.com)과 같은 툴을 다운 받아 압축을 풀수 있습니다. 리눅스나 맥사용자는 아래의 명령으로 압축을 풀수 있습니다.

  1. $ tar -xzf pyserial-2.6.tar.gz

압축이 풀린 폴더로 들어가 설치 파일을 실행합니다. 리눅스에서는 아래와 같이 실행합니다.

  1. sudo python setup.py install
pyserial_install_dos_1.png

파이썬 코드

자 이제 파이썬의 선치가 끝났으므로, 아두이노와 통신할 파이썬 코드를 작성하여야 합니다. 아래의 코드를 카피하여 "movement.py"라는 이름의 파이선코드를 만듭니다.

  1. import time
  2. import serial
  3. import smtplib
  4. TO = 'putyour@email.here'
  5. GMAIL_USER = 'putyour@email.here'
  6. GMAIL_PASS = 'putyourpasswordhere'
  7. SUBJECT = 'Intrusion!!'
  8. TEXT = 'Your PIR sensor detected movement'
  9. ser = serial.Serial('COM4', 9600)
  10. def send_email():
  11. print("Sending Email")
  12. smtpserver = smtplib.SMTP("smtp.gmail.com",587)
  13. smtpserver.ehlo()
  14. smtpserver.starttls()
  15. smtpserver.ehlo
  16. smtpserver.login(GMAIL_USER, GMAIL_PASS)
  17. header = 'To:' + TO + '\n' + 'From: ' + GMAIL_USER
  18. header = header + '\n' + 'Subject:' + SUBJECT + '\n'
  19. print header
  20. msg = header + '\n' + TEXT + ' \n\n'
  21. smtpserver.sendmail(GMAIL_USER, TO, msg)
  22. smtpserver.close()
  23. while True:
  24. message = ser.readline()
  25. print(message)
  26. if message[0] == 'M' :
  27. send_email()
  28. time.sleep(0.5)

파이선 코드에서 맨 위에 이메일과 구글 사용자 계정등 필요한 정보를 자신에 맞게 수정합니다. 위의 프로그램은 구글 이메일 기능을 이용하므로 만약 구글 계정이 없다면 하나 만드셔야 합니다.

To 뒤에 나오는 이메일 주소를 알람을 받을 주소로 변경합니다. GMAIL_USER 뒤에 나오는 이메일 주소를 본인의 gmail주로로 변경합니다. 암호도 변경하여 줍니다.

아래와 같이 코드를 정정하여 자신의 컴퓨터에 설치된 아두이노의 시리얼 포트를 설정하여 줍니다.

  1. ser = serial.Serial('COM4', 9600)
아두이노의 com포트는 IDE의 오른쪽 하단에 나타나 있습니다. 아래는 리눅스에서 IDE를 실행시켰을 때 나오는 화면으로 /dev/tty.usbmodem621에 연결된 것을 볼수 있습니다.
arduino_ide_port.png

이러한 내용을 자신의 환경에 맞게 변경하였으며 명령창에서 아래와 같이 명령을 입력하여 파이썬 프로그램을 실행합니다.

  1. python movement.py

움직임이 센서에 검출되면 아래와 같은 이메일이 도착하는 것을 확인 할 수 있습니다.

trace_message_sending_mac.png
Comments