5

We are working on a project for school, and we have 2 PIR motion sensors running off an Arduino microcontroller. We are able to view the output of the serial port in both the Ardunio IDE and Python IDLE.

What we want to do next is, after about 30 seconds of motion being detected, sending out an email alert, seeing that we don't have Ethernet capability at this point, we figured the easiest way would be to grab the emailing through Python.

How to achieve this?

Update:

At this point we can send an email from Python, we can read the Arduino serial port in Python, but we just have an issue putting it all together.

This is what our Python code looks like, at the while 1: is where confusion happens:

import smtplib,serial

ser = serial.Serial(port=2, baudrate=9200)

from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email import Encoders
import os

gmail_user = "[email protected]"
gmail_pwd = "pw"

def mail(to, subject, text, attach):
   msg = MIMEMultipart()

   msg['From'] = gmail_user
   msg['To'] = to
   msg['Subject'] = subject

   msg.attach(MIMEText(text))

   part = MIMEBase('application', 'octet-stream')
   part.set_payload(open(attach, 'rb').read())
   Encoders.encode_base64(part)
   part.add_header('Content-Disposition',
           'attachment; filename="%s"' % os.path.basename(attach))
   msg.attach(part)

   mailServer = smtplib.SMTP("smtp.gmail.com", 587)
   mailServer.ehlo()
   mailServer.starttls()
   mailServer.ehlo()
   mailServer.login(gmail_user, gmail_pwd)
   mailServer.sendmail(gmail_user, to, msg.as_string())
   # Should be mailServer.quit(), but that crashes...
   mailServer.close()

while 1: **// CONFUSION HAPPENS HERE //** <----------------------

   ser.readline()

   if ser.readline() = "motion" 

   do this mail sequence?

   mail("[email protected]",
   "Alarm Alert!",
   "Both Motion Sensor A & B have been active for over # seconds",
   "stor_fight.jpg")

Any tips would be much appreciated.

5 Answers 5

1

I'm not sure exactly which part of this process you're having trouble with, but here's a sketch of a solution:

You can use the pyserial library to communicate with the Arduino from python when the Arduino is plugged into the computer via USB.

On the python side, your code would look like this:

serial = serial.Serial("/dev/tty.usbserial-A6007btF", 38400) # the serial name you can see in the Arduino GUI - you might just need to say "COM1" on Windows
result = serial.readline(); # blocks until you get something from the Arduino
if result == "motion":
    # send email here

On the Arduino side, you'd just do something like this:

void loop()
{
    if(30 seconds have passed with motion)
        Serial.println("motion");
}

Make sense?

Sign up to request clarification or add additional context in comments.

1 Comment

+1: I've used pyserial for microcontroller communication and it rocks socks.
1
ser.readline()

   if ser.readline() = "motion" 

This code reads a line from the serial port twice and discards the first one.

You also need a double-equals for comparison, and the line will (I assume...) have carriage-return characters on the end of it.

You might want to try something like

if ser.readline().starts_with("motion")

Comments

0

From the question, I think you already know how to read from the serial port.

So I'd suggest something like this

import time,smtplib

beginTime = time.time() + 86400 # stay one day ahead for now
while True:
  if serial port has values : # ie. motion detected
    beginTime = time.time()
  if time.time() - beginTime > 30 :
    mailObj = smtplib.SMTP('smtp_server_here', smtp_server_port)
    mailObj.sendmail('from', 'to..', 'message')
    beginTime = time.time() + 86400 # reset time

I hope that helps

Comments

0

You need to use the serial library in your Arduino sketch. See section Communication/Serial on this page:

http://arduino.cc/en/Reference/HomePage

There are examples for the serial library in folder 4.Communication of the Arduino environment.

On your host machine, use the pySerial module, as suggested by jder.

You might also find this page in the Arduino Playground to be a useful starting point:

http://www.arduino.cc/playground/Interfacing/Python

Comments

0

From what I can tell the board has a standard RS-232 port. You can make a listener Python script that accepts a signal from the board when the event occurs then fire off a method that sends the email. If you want a nicely designed piece look into Twisted, which has packages for serial port comm and mail. Otherwise check:

http://docs.python.org/library/email

http://www.varesano.net/blog/fabio/serial+rs232+connections+python

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.