Так что я сейчас работаю над проектом 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()
Здесь я скопировал только основную функцию, часть электронной почты такая же.Я благодарен за любую помощь и совет.