5

私たちは学校向けのプロジェクトに取り組んでおり、2 つのPIRモーション センサーを Arduino マイクロコントローラーで実行しています。Arduio 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
ser.readline()

   if ser.readline() = "motion" 

このコードは、シリアル ポートから行を 2 回読み取り、最初の行を破棄します。

また、比較のために double-equals が必要です。行の最後には (私が推測するに...) 改行文字が含まれます。

次のようなものを試してみたいかもしれません

if ser.readline().starts_with("motion")
于 2012-08-01T14:27:35.387 に答える
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 に答える
0

Arduino スケッチでシリアル ライブラリを使用する必要があります。Communication/Serialこのページのセクションを参照してください。

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

4.CommunicationArduino環境のフォルダにシリアルライブラリのサンプルがあります。

jder で提案されているように、ホスト マシンで pySerial モジュールを使用します。

また、Arduino Playground の次のページが出発点として役立つかもしれません。

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

于 2009-03-15T16:57:20.387 に答える
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 に答える
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 に答える