2016-12-29 108 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() 

也使用有意义的名称

相关问题