2016-12-29 7 views
0

私は自給式の工場で作業していましたが、水タンクが空いているときと満杯のときにメールを送信したいと思います。すべてが機能しますが、条件が満たされたときにのみメール機能をトリガーする条件を設定する必要があります。代わりに、無限に進み、条件が満たされる限り、毎秒電子メールを送信します。一度だけ起こるはずの水タンクは、電子メールを送信し、センサによれば、フルである「水タンク満杯」Pythonで特定の条件が満たされたときに関数をトリガーする方法

水タンクがセンサによれば空で、「空の水タンク」電子メールを送信

:元については

水位が変化しない限り。

違う条件が満たされるまで何もしないでください。だから、ループは水がある限りどんな条件も引き起こさずに永遠に続く。

水がなくなると、条件が発生します。同じそこには水がありませんし、私はここ

がコードである詰め替えとき:

import RPi.GPIO as GPIO, feedparser 
from time import sleep 
import smtplib, os, sys 
from email.mime.text import MIMEText 
from email.MIMEMultipart import MIMEMultipart 

GPIO.setwarnings(False) 
GPIO.setmode(GPIO.BCM) 

#Set up GPIO Inputs 
# Yellow Input 
GPIO.setup(2, GPIO.IN) 

def send_email(msg): 
    USERNAME = "[email protected]" 
    PASSWORD = "my_email_password" 
    MAILTO "recipient email" 

    msg['From'] = USERNAME 
    msg['To'] = MAILTO 

    server = smtplib.SMTP('smtp.gmail.com:587') 
    server.ehlo_or_helo_if_needed() 
    server.starttls() 
    server.ehlo_or_helo_if_needed() 
    server.login(USERNAME, PASSWORD) 
    server.sendmail(USERNAME, MAILTO, msg.as_string()) 
    server.quit() 

    print "Email sent to: "+ MAILTO 
    return 

def Send_nowater_email(): 
    print"No water" 
    msg = MIMEMultipart() 
    msg.attach(MIMEText('Water tank empty')) 
    msg['Subject'] = 'Plant notification' 
    send_email(msg) 
    return 

def Send_watered_email(): 
    msg = MIMEMultipart() 
    msg.attach(MIMEText('Water tank full')) 
    msg['Subject'] = 'Plant notification' 
    send_email(msg) 
    return 

while True: 
    Input_yellow = GPIO.input(2) 
    print Input_yellow 

    if Input_yellow == False: 
    Send_watered_email() 

    if Input_yellow == True: 
    Send_nowater_email() 
+0

あなたは電子メールは/送信する必要がありましたかどうかを示す状態のいくつかの種類を追跡しない場合は、メール()関数は 'しばらく(真)'ループ – martianwars

+0

の内側にあるbecuaseにですあなたが絶えず機能を呼び出しているので、明らかに送信を続けます。電子メールを送信するかどうかを決定するために何らかのフラグを追加し、それをクリアしていつ電子メールを再度送信できるかを決定する必要があります。あなたがこれを行うことを選ぶことができる多くの方法があるので、質問は少し広範であるため、あなたはおそらく異なるアイデアを得るでしょうが、実際にあなたの状況に最も効果的なものについて考えるべきです。 – Jmills

答えて

2

Input_yellowを連続して見るのではなく、Input_yellowで変更を調べてみてください。このような何かお手伝いをします、

current = False 
while True: 
    Input_yellow = GPIO.input(2) 
    print Input_yellow 

    if Input_yellow == False and current == True: 
    Send_watered_email() 
    current = False 

    if Input_yellow == True and current == False: 
    Send_nowater_email() 
    current = True 
+0

パーフェクト!どうもありがとうございます!私は、基本的なLEDをオフにして、フォトレジスタを読み取ることで、このようなことをしました。私はスクリプトにそのようなコードを組み込む方法を知らなかった。ありがとうございました! – SuppahHacka

2

だけでも、その異なる

current_state = None 
while True: 
    is_empty = GPIO.input(2) 
    if current_state != is_empty: 
     current_state = is_empty 
     if is_empty == False: 
     Send_watered_email() 
     if is_empty == True: 
     Send_nowater_email() 

場合は、最後の見た状態だけの行為にそれをロック意味のある名前を使用する

関連する問題