Использование триггеров на GPIO.RaspberryPi3 для отправки электронных писем - PullRequest
0 голосов
/ 01 февраля 2019

Я новичок в 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): в большую общую функцию?

Надеюсь, я был достаточно ясен .. Спасибо!

1 Ответ

0 голосов
/ 04 февраля 2019

Я нашел решение для тех, кого это может заинтересовать:

import smtplib
import RPi.GPIO as GPIO
from time import gmtime, strftime, sleep
import datetime as dt


GPIO_Hold=21
GPIO_Abort=20

GPIO.setmode(GPIO.BCM)  

GPIO.setup(GPIO_Hold, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_Abort, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def email_logbook(channel):

    if channel == GPIO_Hold:
        alert = " Hold"
        print("Send mail "+alert)
        #Function for Logbook file for sent infos
        print("Logbook "+alert)

    elif channel== GPIO_Abort:
        alert = " Aborted"
        print("Send mail "+alert)
        #Function for Logbook file for sent infos
        print("Logbook "+alert)

GPIO.add_event_detect(GPIO_Hold, GPIO.FALLING, callback=email_logbook, bouncetime=1000)     
GPIO.add_event_detect(GPIO_Abort, GPIO.FALLING, callback=email_logbook, bouncetime=1000)    

count=0
try:
    while True: 
        count=count+1

except KeyboardInterrupt:  
    GPIO.cleanup()       # clean up GPIO on CTRL+C exit

GPIO.cleanup()           # clean up GPIO

Вы должны выполнять свои дела в функции обратного вызова с помощью if & elif, где вы проверяете GPIO-Pins длясобытие

...