0

こんにちは皆さん、私はここが初めてで、Python も初めてです。Raspberry Pi でジャグジーの温度を制御しながら、手動およびリモート (UDP を使用) で「決定」をオーバーライドできるようにしようとしています。基本的に、3 つの AD コンバーターが、GPIO を介してソーラー ヒーターの温度、太陽光の量、およびスパ ポンプを自動的に制御するスパの温度のデータを RPi に送信します。互いに独立して正常に動作する 2 つのコードがあります。

次のコードを使用して、30 秒ごとに ADC を読み取ることができます (read_bottom_sensor と read_top_sensor は、SPI ビットバンギングの一部としてコードの前半で定義されています)。

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)」ステートメントが表示された時点で停止します。

複数の割り込みのある種のバージョンが必要ですか? また、UDP を個別に受信しながら、ADC サンプリングを 30 秒ごとに継続するにはどうすればよいですか? 私はそれが次のように単純であるべきだと思った:

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 のタイミングは重要ではありません。ADC のサンプリングを中断しない限り、受信した UDP メッセージを実行するために 30 秒待機してもかまいません。私はプログラミングに非常に慣れていないことに注意してください。上記のコードは思いつきませんでした。単にコピーして変更しました。

4

1 に答える 1

0

main() ループで準備ができているソケットからのみ読み取るには、select() を使用します。Select() は実績のある標準ライブラリ関数であり、Linux と Windows の両方で適切に動作します。http://docs.python.org/2/library/select.html

于 2013-05-18T01:19:58.053 に答える