PIR 센서와 아두이노를 이용해 이메일 보내기

by 하민정 | 2017-01-05 11:22
iot pir 센서 python 스마트홈 아두이노 이메일 파이썬

재료

  • 아두이노 우노 1개
  • 브래드 보드 1개
  • PIR 센서 1개
  • 점퍼 와이어 1개

                


PIR 센서를 아두이노와 연결시켜 움직임이 감지될 때마다

아두이노에서 '특정 역할' 을 수행하도록 만든 프로젝트 입니다. 

이 프로젝트에서는 움직임이 인지 된 경우

USB 포트로 연결된 컴퓨터에서 '이메일을 발송' 을 하게 됩니다. 


Step 1. 준비물 


- 아두이노 우노 

- 브래드 보드 

- 점퍼 와이어 


Step 2. 하드웨어 연결방법 




아두이노와 PIR 센서만 연결하면 되지만,

PIR 센서를 실제로 아두이노 소켓에 연결하기엔 헐거운 부분이 있어서,

브래드 보드를 이용해 연결하도록 했습니다. 


PIR 센서의 두 부분은 각각 5VGRD에 연결해 주었고,

나머지 하나의 경우 아두이노의 디지털 7번 핀에 연결해 줍니다. 


Step 3. 코드 


움직임이 감지될 때마다 아두이노는 USB 포트로 연결된 컴퓨터에 메시지를 보냅니다. 

한 움직임에 너무 많은 모션이 감지되어 메시지가 다량으로 발송될 수 있으므로, 

본래의 메시지인 <Movement> 를 보낸 뒤에

일정시간 동안 감지되는 움직임에 대해서는 <Too soon> 을 보내어 움직임을 구분 지었습니다. 


1
int minSecsBetweenEmails = 60; // 1 min
cs


minSecsBetweenEmails 라는 변수를 사용해

메일이 발송될 수 있는 시간 간격을 설정해 놓았습니다. 

이는 사용자마다 다르게 설정해 놓을 수 있는데, 여기서는 60초로 설정해 두어 

이메일이 1분 이내에는 다시 발송되지 않도록 '메시지 발송 간격' 을 설정해 두었습니다. 


마지막 발송된 메일의 경우 추적이 가능하도록 만들기 위해 lastSend 라는 변수가 사용됩니다. 

이는 minSecsBetweenEmails 와 같은 절댓값의 음수 값으로 설정을 해두어 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
 
long lastSend = -minSecsBetweenEmails * 1000l;
...
    if (now > (lastSend + minSecsBetweenEmails * 1000l))
    {
      Serial.println("MOVEMENT");
      lastSend = now;
    }
    else
    {
      Serial.println("Too soon");
    }
  }
  delay(500);
}
cs


현재 보내는 메시지가 minSecsBetweenEmails 로 설정한 시간 간격 이후에 있는 경우에 

if 문의 조건에 부합해 <Movement> 라는 메시지가 발송이 되고, 


시간 간격 이내에 또 다시 보내지는 경우라면

else 문에 부합해 < Too soon > 라는 메시지가 발송이 됩니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void loop()
{
  long now = millis();
  if (digitalRead(pirPin) == HIGH)
  {
    if (now > (lastSend + minSecsBetweenEmails * 1000l))
    {
      Serial.println("MOVEMENT");
      lastSend = now;
    }
    else
    {
      Serial.println("Too soon");
    }
  }
  delay(500);
}
cs


loop 문 안에서 아두이노 라이브러리의 내부 함수인 millis( ) 를 이용하였습니다. 

millis( )는 아두이노 보드에서 위의 프로그램이 시작한 뒤 부터의 밀리세컨드(ms) 를 측정하여 

반환해 주는 함수입니다. 


now 라는 변수에 이 값이 설정을 해 두어 

반복적으로 now 가 시간 간격 이후의 움직임에 해당 하는 경우에만 < Movement >를 발송하고,  

시간 간격 이내의 움직임에 해당 하는 경우엔 < Too soon >를 발송하게 됩니다. 


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


파이썬으로 프로그래밍을 하기 이전에 시리얼 모니터를 이용해 

아두이노가 보드에서 센서가 잘 감지하고 출력을 해 주는 지를 확인해 볼 수 있습니다. 


                                    


Mac 또는 Linux 컴퓨터를 이용하는 사람이라면, Python 이 이미 깔려져 있지만 

윈도우 사용자의 경우엔, Python 을 설치해야 합니다. 


윈도우에서 Python 을 설치하기 위해서 다음의 사이트를 통해서 다운로드 할 수 있습니다. 

이 프로젝트는 Python 2.7.3. 을 이용해 진행하였습니다. 


                                  

'윈도우 설정' 에서 '시스템 속성'으로 들어갑니다. 

'환경변수'에 들어가서 -> '경로설정' -> '변경' 을 누른뒤 

이미 그곳에 쓰여져 있던 Variable value 값은 지우지 않고,

그 뒤에     ;C:\Python27   를 덧붙여 줍니다. 


이것이 제대로 작동 되는지 확인하기 위해서 

새로운 명령 프롬프트를 열고 'python' 이라는 명령어를 쳐봅니다. 

제대로 수행이 되는 경우 다음과 같은 화면이 나와야 합니다. 


                         

이제 PySerial 을 다운받기 위해서 다음의 사이트에서 PySerial 2.6 를 다운 받아야 합니다. 

이곳에서 pyserial-2.6.tar.gz 를 다운 받습니다. 


윈도우 사용자라면, 7-zip 같은 툴을 이용해 압축을 풀어야 합니다.

이것은 다음의 사이트에서 다운 받을 수 있습니다. 


Mac 이나 Linux 컴퓨터의 사용자라면 터미널에서 이것을 압축해제 하면 됩니다. 

                     pyserial-2.6 폴더를 "cd" 하여 

"sudo python setup.py install" 를 수행합니다.


이제 Python과 PySerial 설치를 완료했습니다. 

다음의 프로그램을 movement.py 파일에 생성합니다. 


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


위의 코드를 수행하기 이전에 변경해야 할 부분이 있습니다. 


⓵ 위 프로그램은 gmail 를 사용하는 것으로 설정되었습니다. 

만약 다른 메일을 사용한다면 이 부분을 고치면 됩니다. 

1
2
3
4
TO = 'putyour@email.here'
GMAIL_USER = 'putyour@email.here'
GMAIL_PASS = 'putyourpasswordhere'
 
cs


⓶ 메일 알람을 받고 싶은 곳을 'TO' 부분에 설정해 주고,

GMAIL_USER 부분에 자신의 메일과 비밀번호를 입력해 줍니다. 


 시리얼 포트도 변경이 필요합니다. 

1
2
  ser = serial.Serial('COM4', 9600)
 
cs


윈도우 사용자의 경우, 이 부분을 그대로 사용하지만 

Mac 이나 Linux 사용자의 경우,

이 부분을 '/dev/tty.usbmodem621' 과 같이 아두이노로 변경해 줍니다.

이것은  아두이노 IDE 에서 확인할 수 있습니다. 


                     


변경을 모두 마친 경우 

명령 프롬프트 혹은 터미널에서 python movement.py 라는 명령을 수행해 줍니다. 


Step 4. 수행결과 

움직임이 PIR 센서에 의해 감지될 때마다 다음과 같이 메일이 발송 됩니다. 








댓글 0

오픈소스 스마트홈 프로젝트

PIR 센서와 아두이노를 이용해 이메일 보내기

by 하민정

MADE BY

아두이노를 이용한 음식 탐지기 다음글 PIR 센서와 아두이노를 이용해 이메일 보내기 현재글 현관문에 모니터를 만들어 보자 이전글