在从3个ADC读取数据时接收Python中的UDP消息

时间:2013-05-18 00:59:18

标签: python loops udp

大家好,我是新来的,也是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的采样。 请记住,我对编程很新,我没有提出上面的代码,我只是将其复制并更改。

1 个答案:

答案 0 :(得分:0)

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