我们正在为学校开展一个项目,我们有2个PIR运动传感器在Arduino微控制器上运行。我们可以在Ardunio IDE和Python IDLE中查看串口的输出。
我们接下来要做的是,在检测到大约30秒的动作后,发出电子邮件警报,看到我们此时没有以太网功能,我们认为最简单的方法是抓住电子邮件通过Python。
如何实现这一目标?
此时我们可以发送一封来自Python的电子邮件,我们可以在Python中阅读Arduino串口,但我们只是把它放在一起就有问题了。
这就是我们的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")
任何提示都会非常感激。
答案 0 :(得分: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");
}
有意义吗?
答案 1 :(得分:1)
ser.readline()
if ser.readline() = "motion"
此代码从串口读取一行两次并丢弃第一行。
你还需要一个双等于比较,并且该行(我假设...)在它的末尾有回车字符。
您可能想尝试类似
的内容if ser.readline().starts_with("motion")
答案 2 :(得分:0)
据我所知,主板有一个标准的RS-232端口。您可以创建一个侦听器Python脚本,在事件发生时接受来自板的信号,然后触发发送电子邮件的方法。如果你想要一个设计精美的片段,请看Twisted,它包含用于串口通信和邮件的包。否则请检查:
http://docs.python.org/library/email
http://www.varesano.net/blog/fabio/serial+rs232+connections+python
答案 3 :(得分:0)
您需要在Arduino草图中使用串行库。请参阅此页面上的Communication/Serial
部分:
http://arduino.cc/en/Reference/HomePage
Arduino环境的文件夹4.Communication
中有串行库的示例。
在主机上,按照jder的建议使用pySerial模块。
您可能还会在Arduino Playground中找到此页面作为一个有用的起点:
答案 4 :(得分: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
我希望有帮助