大家好,我是新来的,也是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的采样。 请记住,我对编程很新,我没有提出上面的代码,我只是将其复制并更改。
答案 0 :(得分:0)
使用select()只能读取main()循环中的就绪套接字。 Select()是经过时间验证的标准库函数,可在Linux和Windows上正常运行。 http://docs.python.org/2/library/select.html