Случайный ввод GPIO, Разница между скриптами? - PullRequest
0 голосов
/ 10 октября 2018

Так что я сейчас работаю над проектом Raspberry Pi.Мой Raspi подключен к моему почтовому ящику, поэтому каждый раз, когда кто-то открывает его, нажимается кнопка.Когда кнопка нажата, скрипт должен обнаружить это и отправить мне сообщение по электронной почте, а также записать текущие время и дату в текстовом файле.

Мой сценарий, который я сделал немного самостоятельно и с помощью Интернета, работает, но он случайным образом обнаруживает вход GPIO каждые 10-20 минут (провода, подключенные к кнопке, оченьдолго, и мой Raspi связан в комнате, которая полна кабелей, это может быть проблемой).Но я попытался сделать это с помощью сценария, который я только что нашел в Интернете.Просто скопируйте его (ну, по крайней мере, часть GPIO).Так что этот скрипт работает, но мой обнаруживает случайный ввод.

Другая проблема (вы увидите это в скрипте), которая была у меня со старым скриптом, заключалась в том, что я использовал цикл while, и он использовал 97% моего процессора.Поэтому я сделал еще один сценарий, который будет работать по-другому.Он не использует 97% моего процессора, но обнаруживает случайные входы.В сценарии, который я скопировал из интернета, также используется цикл while, но он не требует столько ресурсов процессора.Но почему?Я тоже не понимаю.

Это мой скрипт, который обнаруживает случайные входные данные:

import RPi.GPIO as GPIO
import smtplib
import pytz
from pytz import timezone
import datetime
from time import sleep
GPIO.setmode(GPIO.BCM)
GPIO.setup(7,GPIO.IN,)

def writeanemail(): 

    smtpUser = ''
    smtpPass = ''
    toAdd = ''
    fromAdd = smtpUser
    subject = 'Du hast etwas in deinem Postfach'
    header = 'To:  ' + toAdd + '\n' + 'From:  ' + fromAdd + '\n' + 'Subject:  ' + subject
    print ("\n" + header)
    s = smtplib.SMTP('smtp.gmail.com',587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login(smtpUser, smtpPass)
    s.sendmail(fromAdd, toAdd, header)
    s.quit()

def timelog():
    now = datetime.datetime.now(timezone('Europe/Berlin'))
    file = open("/home/pi/ps/gpio.log","a")
    file.write("\n" + now.strftime("%Y-%m-%d--%a  %H:%M:%S"))
    file.close()
    print ("\n" + now.strftime("%Y-%m-%d--%a  %H:%M") + "\n" + "\n" + "Log wurde geschrieben")

def main():
    GPIO.wait_for_edge(7, GPIO.FALLING, bouncetime = 150)
    print ("Knopf wurde gedrueckt, E-Mail wird geschickt.")
    sleep(1)
    writeanemail()
    timelog()
    sleep(10)
    main()

main()

А это скопированный, который отлично работает:

import RPi.GPIO as GPIO
from pytz import timezone
import datetime

# SET GPIO Button-Pin
gpio = 7

def writeanemail():
    smtpUser = ''
    smtpPass = ''

    toAdd = ''
    fromAdd = smtpUser

    subject = 'Du hast etwas in deinem Postfach'
    header = 'To:  ' + toAdd + '\n' + 'From:  ' + fromAdd + '\n' + 'Subject:  ' + subject


    print ("\n" + header)

    s = smtplib.SMTP('smtp.gmail.com',587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login(smtpUser, smtpPass)
    s.sendmail(fromAdd, toAdd, header)
    s.quit()



 # Main Function
def main():
    value = 0

    while True:
        if not GPIO.input(gpio):
        value += 0.01
        if value > 0:
            if GPIO.input(gpio):
                print "gedrueckt"
                now = datetime.datetime.now(timezone('Europe/Berlin'))
                file = open("/home/pi/ps/gpio.log","a")
                file.write("\n" + now.strftime("%Y-%m-%d--%a  %H:%M:%S"))
                file.close()
                writeanemail()
                main()

        time.sleep(0.03)

  return 0

if __name__ == '__main__':
  GPIO.setmode(GPIO.BCM)
  GPIO.setup(gpio, GPIO.IN)
  main()

Здесь я скопировал только основную функцию, часть электронной почты такая же.Я благодарен за любую помощь и совет.

...