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

Это becuase вашей электронной почты() функции находятся внутри 'в то время как (True) 'цикл – 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

Отлично! Спасибо огромное! Я сделал что-то подобное, когда основной светодиод выключен, читая фоторезистор. Я не знал, как включить такой код в мой скрипт. Спасибо! – 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() 

также используйте значащие имена