Python和Raspberry Pi:如何在while循环中只执行一次动作

时间:2015-02-12 12:31:02

标签: python email while-loop raspberry-pi gpio

第一次来到这里。我不是程序员,我试图用我的RPi创建一个简单的监控系统,但遇到了一些问题。希望有人可以帮助我吗?

我几乎有这里显示的确切设置(除了按钮是杠杆/开关):http://razzpisampler.oreilly.com/ch07.html#SEC11.1 并遵循GPIO清理方面的一些建议: https://www.youtube.com/watch?v=Bqk6M_XdIC0

我需要的是,当按下杠杆并且按下按下时,我想发送一封电子邮件。当杠杆释放后,我希望程序能够重新启动"因此,当将来再次按住杠杆时,会发送另一封邮件。

我已经让单独的导入邮件脚本工作,硬件设置似乎正在运行。

会发生什么:

  1. 使用sudo python pellets.py
  2. 启动程序
  3. 按住操纵杆,成功发送1封邮件,但程序会继续打印" SENT 1 MAIL"每3秒钟,直到我松开杠杆 (?)。
  4. 按下控制杆并再次按住时,不发送任何邮件(?), 但该计划继续印刷" SENT 1 MAIL"直到我发布 杆
  5. 对于程序再次发送邮件,我需要按CTRL + C并中断程序并手动重启程序。

    我错过了什么?

    • 当我发布时,为什么程序不发送第二封邮件,重新按住 杠杆?
    • 为什么程序会在我保留时保持打印短信 杠杆按下?当我设置sent_mail = 1?
    • 时,现在循环是否已经结束了

    我试图清理if-loop中的GPIO通道,但这并没有像我想的那样工作。然后,即使在我释放杠杆之后,文本仍继续打印。但是不再发送邮件。

    这是我的代码:

    import RPi.GPIO as GPIO
    import time
    
    GPIO.setmode(GPIO.BOARD)
    
    GPIO.setup(GPIO.IN, pull_up_down=GPIO.PUD_UP)
    
    mail_sent = 0
    
    try:
        while True:
            input_state = GPIO.input(12)
            if input_state == 0 and mail_sent == 0:
                import pellets_sendmail
                print ('SENT 1 MAIL')
                mail_sent = 1
                time.sleep(3)
            else:
                mail_sent = 0
    except KeyboardInterrupt:
        GPIO.cleanup(12)
    

1 个答案:

答案 0 :(得分:2)

你的问题实际上是两个问题。

首先,它打印" SENT 1 MAIL"连续因为else子句将重置你的mail_sent杠杆是否已启动 mail_sent不是0.您可能需要指定杠杆应该在{{}}之前{1}}可以重置:

mail_sent

其次,你只能导入一次另一个python模块。我假设 if input_state == 0 and mail_sent == 0: ... elif input_state == 1: # Whatever your "up" state is mail_sent = 0 发送了您的邮件消息。第一次导入它时,文件正常运行,但之后它不会再次执行该文件。我建议在pellets_sendmail.py内部发送一个发送消息的函数,而不是让你的脚本直接发送消息

pellets_sendmail.py

Here's a tutorial on writing functions如果您不确定如何操作。只需移动你现在使用的任何代码将邮件发送到它自己的离散函数(我在我的例子中称之为import pellets_sendmail # put this at the top of your script ... if input_state == 0 and mail_sent == 0: pellets_sendmail.sendmail() ... ,但你可以随意调用它。)