2016-12-29 191 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

如果不追蹤某種狀態,表示如果電子郵件已/應發,由於您不斷地調用該函數,它顯然會繼續發送。您需要添加某種標誌來確定是否應該發送電子郵件,然後決定何時以及是否要清除它,以便可以再次發送電子郵件。這個問題有點寬泛,因爲有很多方法可以選擇這樣做,所以你可能會得到不同的想法,但是你應該考慮一下最適合你的情況。 – 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() 

也使用有意義的名稱

相關問題