【问题标题】:Python and Raspbery Pi: How to perform an action only once in a while loopPython 和 Raspberry Pi:如何在 while 循环中只执行一次操作
【发布时间】:2015-02-12 12:31:02
【问题描述】:

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

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

我需要的是,当不断按下并按下控制杆时,我想发送一封电子邮件。然后释放控制杆时,我希望程序“重新启动”,以便在将来某个时间再次按住控制杆时,会发送另一封邮件。

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

会发生什么:

  1. sudo python pellets.py启动程序
  2. 按住控制杆,1 封邮件发送成功,但程序每 3 秒打印一次“SENT 1 MAIL”,直到我松开控制杆 (?)。
  3. 第二次按住控制杆时,不会发送邮件 (?), 但程序会一直打印“SENT 1 MAIL”,直到我发布 杠杆。

为了让程序再次发送邮件,我需要CTRL+C并中断程序并手动重新启动程序。

我错过了什么?

  • 为什么当我松开,重新按住时程序不发送第二封邮件 杠杆?
  • 为什么当我保留 杠杆按下?当我设置 send_mail=1 时,循环现在不应该结束吗?

我试图清除 if 循环内的 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)

【问题讨论】:

  • 你能在pellets_sendmail中显示代码吗?

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


【解决方案1】:

你的问题其实是两个问题。

首先,它会连续打印“SENT 1 MAIL”,因为 else 子句将重置您的 mail_sent,无论杠杆是否向上 mail_sent 不为 0。您可能需要指定在mail_sent 可以重置之前杠杆应该向上:

    if input_state == 0 and mail_sent == 0:
        ...
    elif input_state == 1: # Whatever your "up" state is
        mail_sent = 0

其次,你只能导入另一个 python 模块一次。我假设pellets_sendmail.py 发送您的邮件消息。第一次导入时,文件正常运行,但之后不再执行文件。我建议在pellets_sendmail.py 中创建一个发送消息的函数,而不是让您的脚本直接发送消息

import pellets_sendmail    # put this at the top of your script
...
     if input_state == 0 and mail_sent == 0:
        pellets_sendmail.sendmail()
     ...

Here's a tutorial on writing functions 如果您不确定如何操作。只需将您现在用来发送邮件的任何代码移动到它自己的离散函数中(在我的示例中我称之为sendmail(),但您可以随意调用它)。

【讨论】:

    猜你喜欢
    • 2021-01-10
    • 2023-04-02
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多