0

私はコーディングなどにかなり慣れていません。HX711 ブレークアウト ボードを使用してデジタル重量計に取り組んでおり、4 桁の 7 セグメント ディスプレイから値を出力しています。

ループはweighing()ディスプレイの多重化時間よりも遅い速度で値を読み取るため、値が読み取られるまでコードは続行されず、ディスプレイが地獄のように点滅します。weighing()ということで、ループとdisplaying()ループを同時に実行してみましたconcurrent.futures。しかし、コードは 1 回だけ実行され、その後ループにweighing()陥ってしまい、同時に実行されないのでしょうか?display()

私のコードに何か問題があるに違いありません。明確にして他の方法の提案を残してください。

import time
import RPi.GPIO as GPIO
import concurrent.futures


GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

segments = [2, 3, 4, 5, 6, 7, 8, 9]
digits = [12, 13, 18, 19]


GPIO.setup(segments, GPIO.OUT)
GPIO.output(segments, GPIO.HIGH)
GPIO.setup(digits, GPIO.OUT)
GPIO.output(digits, GPIO.LOW)

nums ={
    0:(1,1,1,1,1,1,0),
    1:(0,1,1,0,0,0,0),
    2:(1,1,0,1,1,0,1),
    3:(1,1,1,1,0,0,1),
    4:(0,1,1,0,0,1,1),
    5:(1,0,1,1,0,1,1),
    6:(1,0,1,1,1,1,1),
    7:(1,1,1,0,0,0,0),
    8:(1,1,1,1,1,1,1),
    9:(1,1,1,1,0,1,1)}
switchpolarity = {1: 0,
                  0:1}

def display(value):
    while 1:
        s = [int(d) for d in str(value)]        
        for digit in range(0,len(s)):
            for segment in range(0,7):
                GPIO.output(segments[segment], switchpolarity[nums[s[digit]][segment]])
            GPIO.output(digits[digit], 1)
            time.sleep(0.01)
            GPIO.output(digits[digit], 0)


EMULATE_HX711=False

if not EMULATE_HX711:
    from hx711 import HX711
else:
    from emulated_hx711 import HX711

def weighing():
    while 1:
        val = round(abs(hx.get_weight(1)))
        print(val)
        hx.power_down()
        hx.power_up()
        return(val)

hx = HX711(9, 10)
hx.set_reading_format("MSB", "MSB")
hx.set_reference_unit(754)
hx.reset()
hx.tare()

print("Tare done! Add weight now...")


try:

        with concurrent.futures.ProcessPoolExecutor() as executor:
            weighing = executor.submit(weighing)
            displaying = executor.submit(display, (t1.result()))


except(KeyboardInterrupt):
    GPIO.cleanup()

テストせずにプロセス名を変更して投稿していたので、コードのタイプミスについては非常に申し訳ありません。これは私が言うことができる私の新しいコードであり、愚かな間違いはありません:

import time
import RPi.GPIO as GPIO
import concurrent.futures


GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

segments = [2, 3, 4, 5, 6, 7, 8, 9]
digits = [12, 13, 18, 19]


GPIO.setup(segments, GPIO.OUT)
GPIO.output(segments, GPIO.HIGH)
GPIO.setup(digits, GPIO.OUT)
GPIO.output(digits, GPIO.LOW)

nums ={
    0:(1,1,1,1,1,1,0),
    1:(0,1,1,0,0,0,0),
    2:(1,1,0,1,1,0,1),
    3:(1,1,1,1,0,0,1),
    4:(0,1,1,0,0,1,1),
    5:(1,0,1,1,0,1,1),
    6:(1,0,1,1,1,1,1),
    7:(1,1,1,0,0,0,0),
    8:(1,1,1,1,1,1,1),
    9:(1,1,1,1,0,1,1)}
switchpolarity = {1: 0,
                  0:1}

def display(value):
    while 1:
        s = [int(d) for d in str(value)]        
        for digit in range(0,len(s)):
            for segment in range(0,7):
                GPIO.output(segments[segment], switchpolarity[nums[s[digit]][segment]])
            GPIO.output(digits[digit], 1)
            time.sleep(0.01)
            GPIO.output(digits[digit], 0)


EMULATE_HX711=False

if not EMULATE_HX711:
    from hx711 import HX711
else:
    from emulated_hx711 import HX711

def weighing():
    while 1:
        val = round(abs(hx.get_weight(1)))
        print(val)
        hx.power_down()
        hx.power_up()
        return(val)

hx = HX711(9, 10)
hx.set_reading_format("MSB", "MSB")
hx.set_reference_unit(754)
hx.reset()
hx.tare()

print("Tare done! Add weight now...")


try:

        with concurrent.futures.ProcessPoolExecutor() as executor:
            weighing1 = executor.submit(weighing)

            displaying1 = executor.submit(display, (weighing1.result()))


except(KeyboardInterrupt):
    GPIO.cleanup()
4

1 に答える 1

0

これは、「計量」スレッドの主な機能です。

def weighing():
    while 1:
        val = round(abs(hx.get_weight(1)))
        ...
        return(val)

このreturn(val)ステートメントにより、関数はループの最初の繰り返しの最後に戻ります。関数が戻ると、スレッドは終了します。二度と実行されることはありません。

スレッドを開始する方法は次のとおりです。

weighing = executor.submit(weighing)
displaying = executor.submit(display, (t1.result()))

私が正しく理解していれば、*executor.submit(weighing)呼び出しはfutureを返し、t1.result()**は future の完了を待ってから、関数によって返された値を返しますweighing

つまり、値が返されるexecutor.submit(display, ...)まで発生しないt1.result()ということです。これは、最初のスレッドが終了するまで、2 番目のスレッドを開始することさえできないことを意味します。


IMO;

  • 関数weighing()はグローバル変数を更新し、値を返す代わりに永遠にループし続ける必要があります。

  • 関数display()は、グローバル変数からコピーして表示する値を取得する必要があります。

  • によって返される先物は無視できますProcessPoolExecutor。エグゼキュータ サービスとして実際に使用しているわけではありません。2 つのスレッドを作成する方法として使用しているだけです。


* 私は実際には Python の第一人者ではありません。

** 私はそれt1.result()がコピー/貼り付けエラーであり、あなたが言うつもりだったと仮定していますweighing.result().

于 2020-03-25T11:09:04.330 に答える