I have been working on a self-watering plant and I want it to send me emails when the water tank is empty and when it is full. Everything works but, I need to be able to set a condition that triggers the email function only ONCE when the condition is met. Instead, it goes infinitely and sends emails every second as long as the condition is met.
For ex: Water tank is full according to sensor, send email "Water tank full"
Water tank is empty according to sensor, send email "Water tank empty"
That should only happen once unless the water level changes.
And do not do anything until a different condition is met. So the loop goes on forever without triggering any condition as long as there is water.
Once there is no more water, then the condition will trigger. The same when there is no water and then I refill it
Here is the code:
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()
while(True)loop