0

大家好,我是新来的,也是 Python 的新手。我试图让我的 Raspberry Pi 控制按摩浴缸的温度,同时能够手动和远程(使用 UDP)覆盖它的“决定”。基本上,我有 3 个 AD 转换器通过 GPIO 向我的 RPi 发送太阳能加热器温度、太阳光量和水疗温度的数据,这将自动控制水疗泵。我有 2 段代码彼此独立工作正常:

我可以使用以下代码每 30 秒读取一次 ADC:(read_bottom_sensor 和 read_top_sensor 在代码前面定义为 SPI bit-banging 的一部分)

while True:
        bottom_sensor = read_bottom_sensor(bottom_sensor_adc, SPICLK, SPIMOSI, SPIMISO, SPICS)
        current_spa_temp = bottom_sensor
        if DEBUG:
                print "Spa Temp = ", current_spa_temp



        top_sensor = read_top_sensor(top_sensor_adc, SPICLK, SPIMOSI, SPIMISO, SPICS)
        current_solar_heater_temp = top_sensor
        if DEBUG:
                print "Solar Heater Temp = ", current_solar_heater_temp



        if bottom_sensor + 10 < top_sensor:
                GPIO.output(PUMPRLY, True)
                print "The Pump is ON"
        else:
                GPIO.output(PUMPRLY, False)
                print "The Pump is OFF"
        time.sleep(30)

我还可以使用以下代码通过我的手机通过 UDP 打开/关闭连接到 GPIO 引脚 #7 的泵继电器 (PUMPRLY):

while True:
    data, addr = sock.recvfrom(64)

    if data == b'7H':
        GPIO.output(7, True)

    elif data == b'7L':
        GPIO.output(7, False)

到目前为止,一切都很好。问题是当我将 2 组合在一起时,ADC 的采样会停止并等待接收任何 UDP,然后它才会继续执行代码。即我的代码在它看到“data, addr = sock.recvfrom(64)”语句时停止。

我是否需要某种版本的多个中断,我将如何做到这一点才能让 ADC 采样每 30 秒继续一次,同时仍然能够独立接收 UDP。我认为它应该像这样简单:

while True:
        bottom_sensor = read_bottom_sensor(bottom_sensor_adc, SPICLK, SPIMOSI, SPIMISO, SPICS)
        current_spa_temp = bottom_sensor
        if DEBUG:
                print "Spa Temp = ", current_spa_temp



        top_sensor = read_top_sensor(top_sensor_adc, SPICLK, SPIMOSI, SPIMISO, SPICS)
        current_solar_heater_temp = top_sensor
        if DEBUG:
                print "Solar Heater Temp = ", current_solar_heater_temp



        if bottom_sensor < top_sensor + 10:
                GPIO.output(PUMPRLY, True)
                print "The Pump is ON"
        else:
                GPIO.output(PUMPRLY, False)
                print "The Pump is OFF"


        data, addr = sock.recvfrom(64)

            if data == b'7H':
                GPIO.output(7, True)

            elif data == b'7L':
                GPIO.output(7, False)
        time.sleep(30)

但它没有用。仅供参考 UDP 的时间并不重要。我不介意它是否等待 30 秒以执行接收到的 UDP 消息,只要它不中断 ADC 的采样。请记住,我对编程很陌生,我没有想出上面的代码,我只是复制并更改了它。

4

1 回答 1

0

使用 select() 以便仅从 main() 循环中的就绪套接字读取。Select() 是经过时间验证的标准库函数,可在 Linux 和 Windows 上正常工作。http://docs.python.org/2/library/select.html

于 2013-05-18T01:19:58.053 回答