5

我们正在为学校开展一个项目,我们有 2 个PIR运动传感器运行 Arduino 微控制器。我们可以在 Ardunio IDE 和 Python IDLE中查看串口的输出。

我们接下来要做的是,在检测到大约 30 秒的运动后,发送电子邮件警报,看到此时我们没有以太网功能,我们认为最简单的方法是通过 Python 获取电子邮件。

如何做到这一点?

更新:

此时我们可以从 Python 发送一封电子邮件,我们可以在 Python 中读取 Arduino 串行端口,但我们只是在将它们放在一起时遇到了问题。

这就是我们的 Python 代码的样子,在 while 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")

任何提示将不胜感激。

4

5 回答 5

1

我不确定你在这个过程的哪一部分遇到了问题,但这里有一个解决方案的草图:

当 Arduino 通过 USB 插入计算机时,您可以使用pyserial库从 python 与 Arduino 进行通信。

在 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");
}

说得通?

于 2009-03-14T23:56:53.223 回答
1
ser.readline()

   if ser.readline() = "motion" 

此代码从串行端口读取一行两次并丢弃第一个。

您还需要一个双等号进行比较,并且该行将(我假设...)在其末尾有回车符。

您可能想尝试类似的东西

if ser.readline().starts_with("motion")
于 2012-08-01T14:27:35.387 回答
0

您需要在 Arduino 草图中使用串行库。请参阅Communication/Serial此页面上的部分:

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

4.Communication在 Arduino 环境的文件夹中有串行库的示例。

在您的主机上,按照 jder 的建议使用 pySerial 模块。

您可能还会发现 Arduino Playground 中的此页面是一个有用的起点:

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

于 2009-03-15T16:57:20.387 回答
0

从这个问题来看,我想你已经知道如何从串口读取数据了。

所以我建议这样的事情

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

我希望这会有所帮助

于 2009-03-15T17:26:07.540 回答
0

据我所知,该板有一个标准的 RS-232 端口。您可以创建一个侦听器 Python 脚本,该脚本在事件发生时接受来自板的信号,然后触发发送电子邮件的方法。如果您想要一个设计精美的作品,请查看 Twisted,它包含用于串行端口通信和邮件的软件包。否则检查:

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

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

于 2009-03-15T00:00:18.770 回答