Я новичок в python, и у меня возникли некоторые проблемы с использованием GPIO RPi3 для начала выполнения частей Python-скрипта.
Чтобы сделать это проще, у меня есть машина, которая может выдавать цифровой триггер (аналогично механическому переключателю) всякий раз, когда он находится в режиме удержания или когда программа прерывается и т. Д. Я хочу, чтобы Raspberryотправлять электронную почту всякий раз, когда данный GPIO запускается.
Например:
- когда он удерживается, машина запускает ПИН 21
- когда он прерывается, машинаактивирует Пин 20
Я написал следующий код:
import smtplib
import RPi.GPIO as GPIO
import os
import os.path
from time import gmtime, strftime, sleep
import datetime as dt
GPIO.setmode(GPIO.BCM)
#Input GPIO for trigger
GPIO_Hold=21
GPIO_Abort=20
#Setup Pins
GPIO.setup(GPIO_Hold, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_Abort, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#Get get time for when the programm was started
t = dt.datetime.now()
#Function for Email
def send_mail(alert):
HOST = "smtp.gmail.com"
PORT = 587
SUBJECT = "[UPDATE] Machine"
TO = "EMAIL@EMAIL.COM"
FROM = "RPI@EMAIL.COM"
PWD = "RPi"
text = alert
BODY = string.join(("from: %s" %FROM, "to: %s" %TO,"Subject: %s" %SUBJECT, " ", text), "\r\n")
s = smtplib.SMTP(HOST,PORT)
s.set_debuglevel(1)
s.ehlo()
s.starttls()
s.login(FROM, PWD)
s.sendmail(FROM,[TO],BODY)
s.quit
#Function for Logbook file for sent infos
def log_book(alert):
time_stamp = strftime("%Y-%m-%d_%H:%M:%S", gmtime())
f= open("logbook12K.txt",'a+')
f.write(time_stamp + " // " + alert + "\n")
f.close()
# Begin Loop
try:
while True:
print("Waiting for Trigger...")
#If Test on Hold
if GPIO.wait_for_edge(GPIO_Hold, GPIO.FALLING):
alert = "Test on Hold"
log_book(alert)
send_mail(alert)
sleep (1)
#If test aborted
elif GPIO.wait_for_edge(GPIO_Abort, GPIO.FALLING):
alert = "Test Aborted"
log_book(alert)
send_mail(alert)
sleep (1)
except KeyboardInterrupt: # trap a CTRL+C keyboard interrupt
GPIO.cleanup() # resets all GPIO ports used by this program
Я знаю, что GPIO.wait_for_edge(GPIO_Abort, GPIO.FALLING)
не лучшее решение, но использование GPIO.event_detected(channel)
также не будет работать.В режиме ожидания моя машина будет постоянно активировать контакт 21, и я не хочу, чтобы RPi3 постоянно отправлял миллиарды писем, поэтому я не могу просто использовать if GPIO.input(GPIO_Hold)
.
GPIO.event_detected(channel)
обнаруживает толькоизменения, поэтому он также отправит обновление «Machine on Hold», когда машина снова запустится и триггер вернется в нормальное состояние.Кроме того, я не знаю, может ли GPIO.add_event_detect(channel, GPIO.FALLING, callback=my_callback)
быть полезным, поскольку я не могу выбросить переменную в функцию обратного вызова.
Может быть, поместив def send_mail(alert):
и def log_book(alert):
в большую общую функцию?
Надеюсь, я был достаточно ясен .. Спасибо!