2

これは私の最初の投稿であり、Python での最初のプロジェクトです。さまざまな条件でハードウェア センサーを制御しようとしています。

  1. センサーが動きを感知したらメールを送ってスリープ
  2. elif 時間範囲が就業時間内でない場合は、午前 9 時までスリープします
  3. そうでなければ0.5秒間スリープしてセンサーを待つ

これまでのところ、最初の条件と最後の条件が機能しています。つまり、動きがない場合は、センサーがアクティブになるまで sleep(0.5) を繰り返します。

問題:時間が 9 時から 5 時の間ではない中間部分に問題があります。コードを 9 時前または 5 時以降に実行すると、意図したとおり午前 9 時に到着するまでスリープしますが、コードがすでに 9 時から 5 時の間に実行されている場合 (移動を待機している場合)、中間条件はトリガーされません。スリープ(0.5)でスタックします。

私はそれほど経験がありませんが、2 番目のプロセスが時間を追跡するのに役立つはずだという漠然とした考えがあります。助言がありますか?これがコードです。

def pir_init():
    while True:
        m = datetime.datetime.now().time().minute   #loop through for current time
        h = datetime.datetime.now().time().hour     
        if h < 9:                                           
            print("Sleeping...")
            time_sleep = (9 - h) * 3600
            time.sleep(time_sleep)
        elif h > 16:
            print("Sleeping...")
            time_sleep = ((24 - h) + 9) * 3600
            time.sleep(time_sleep)
        elif io.input(pir_pin):
            print("PIR ALARM")
            send_gmail()   
            time.sleep(10)      #cooldown to prevent email spew
        else:
            print "Waiting..."
            time.sleep(0.5)     #sleep and wait for movement
            print m
    print "Loop End"


# main
if time_elements[0] > '0' and time_elements[0] < '6':  #Weekdays
    if get_hour > 8 and get_hour < 17:             #Hour Range
        pir_init()
    elif get_hour > 16:
        print("Initialization at 9am...")
        time_sleep = ((24 - get_hour) + 9) * 3600
        time.sleep(time_sleep)
        pir_init()              #initiate sensor
    elif get_hour < 9:
        print("Initialization at 9am...")
        time_sleep = (9 - get_hour) * 3600
        time.sleep(time_sleep)
        pir_init()
else:
    #to be completed
    print time_elements[0]
    print "bad weekday"
4

1 に答える 1

1

プログラムが条件で現在の時刻を使用して午前 9 時までスリープするかどうかをテストするように、while ループ内の time_elements を更新する必要があります。それ以外の場合、その while ループ内の time_elements を更新しないと、プログラムが最初にその条件に入らなかった場合、決して入ることはありません。

それはあなたが気づいている行動を説明しています。実際、あなたの time_elements の定義はここには示されていません...

于 2013-04-17T21:57:14.790 に答える