ИК-датчики + Arduino + Python + оповещения по электронной почте - PullRequest
5 голосов
/ 15 марта 2009

Мы работаем над проектом для школы, и у нас есть 2 PIR датчики движения, работающие на микроконтроллере Arduino. Мы можем просматривать выходные данные последовательного порта как в Ardunio IDE, так и в Python IDLE .

Что мы хотим сделать дальше, это после того, как примерно через 30 секунд обнаружения движения отправим оповещение по электронной почте, видя, что на данный момент у нас нет возможности Ethernet, мы решили, что самым простым способом было бы захватить электронную почту через Python.

Как этого добиться?

Обновление:

На данный момент мы можем отправить электронное письмо из Python, мы можем прочитать последовательный порт Arduino в Python, но у нас просто есть проблема, соединяющая все это вместе.

Вот так выглядит наш код на Python, в то время как 1: где происходит путаница:

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 = "usr@gmail.com"
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("usr2@gmail.com",
   "Alarm Alert!",
   "Both Motion Sensor A & B have been active for over # seconds",
   "stor_fight.jpg")

Любые советы приветствуются.

Ответы [ 5 ]

1 голос
/ 01 августа 2012
ser.readline()

   if ser.readline() = "motion" 

Этот код читает строку из последовательного порта дважды и отбрасывает первый.

Вам также нужно двойное равенство для сравнения, и в конце строки (я предполагаю ...) будут символы возврата каретки.

Возможно, вы захотите попробовать что-то вроде

if ser.readline().starts_with("motion")
1 голос
/ 15 марта 2009

Я не уверен точно, с какой частью этого процесса у вас возникают проблемы, но вот набросок решения:

Вы можете использовать библиотеку pyserial для связи с Arduino из python, когда Arduino подключен к компьютеру через USB.

На стороне Python ваш код будет выглядеть так:

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

На стороне Arduino вы бы просто сделали что-то вроде этого:

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

Имеет смысл?

0 голосов
/ 15 марта 2009

Из вопроса, я думаю, вы уже знаете, как читать с последовательного порта.

Так что я бы предложил что-то вроде этого

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

Надеюсь, это поможет

0 голосов
/ 15 марта 2009

Вам нужно использовать последовательную библиотеку в вашем скриншоте Arduino. Смотрите раздел Communication/Serial на этой странице:

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

В папке 4.Communication среды Arduino есть примеры для последовательной библиотеки.

На вашем хост-компьютере используйте модуль pySerial, как предлагает jder.

Вы также можете найти эту страницу на игровой площадке Arduino полезной отправной точкой:

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

0 голосов
/ 15 марта 2009

Из того, что я могу сказать, плата имеет стандартный порт RS-232. Вы можете создать слушающий Python-скрипт, который будет принимать сигнал с доски при возникновении события, а затем запустить метод, отправляющий электронное письмо. Если вы хотите красиво оформленную часть, загляните в Twisted, в котором есть пакеты для последовательного порта, комм и почты. В противном случае проверьте:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...