GPIO随机输入,脚本之间的区别?

时间:2018-10-10 19:00:47

标签: python raspberry-pi gpio

因此,我目前正在从事Raspberry Pi项目。 我的Raspi已连接到我的信箱,因此每次有人打开它时,都会按下一个按钮。按下按钮后,脚本应该检测到该情况并向我发送电子邮件,然后将当前时间和日期写入.txt文件中。

我自己编写的脚本在互联网的帮助下可以运行,但是每10-20分钟随机检测一次GPIO输入(连接到按钮的电线很长, Raspi连接在充满电缆的房间中,这可能是问题所在)。但是,我尝试使用我刚刚在互联网上找到的脚本来执行此操作。只需复制它(至少是GPIO部分)。因此该脚本有效,但是我的脚本检测到随机输入。

我用旧脚本遇到的另一个问题(您会在脚本中看到它)是,我使用了while循环,它占用了我97%的CPU。因此,我做了另一个工作方式不同的脚本。它不使用我的CPU的97%,但是它检测到随机输入。在我从Internet复制的脚本中,还使用了while循环,但是它并不需要那么多的CPU。但为什么?我也不明白。

这是我的脚本,可以检测随机输入:

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()

在这里,我仅复制了main函数,Email部分是相同的。 感谢您的帮助和建议。

0 个答案:

没有答案