2017-11-14 9 views
-2
#!/usr/bin/python 



# Import der Python libraries 

import RPi.GPIO as GPIO 

import time 

import datetime 

import subprocess 



# Verwendung des Board Mode, Angabe der PIN Nummern anstelle der GPIO BCM Nummer 

GPIO.setmode(GPIO.BOARD) 



# GPIO definieren, bei mir ist es PIN 8 

GPIO_PIR = 8 



#  GPIO als "Input" festlegen 

GPIO.setup(GPIO_PIR,GPIO.IN) 



Current_State  = 0 

Previous_State = 0 



try: 



# erst mal schlafen bis der bootvorgang abgeschlossen ist 

time.sleep(60) 



# Warten bis Sensor sich meldet 

while GPIO.input(GPIO_PIR)==1: 

  Current_State  = 0 



subprocess.Popen('echo initilized PIR | wall', shell=True) 



# Schleife bis CTRL+C 

while True : 



  #Status von Sensor auslesen 

  Current_State = GPIO.input(GPIO_PIR) 



  if Current_State==1 and Previous_State==0: 



    # Kommando zum anschalten, Frambuffer erneuern 

    subprocess.Popen('echo Monitor on | wall', shell=True) 

    subprocess.Popen('/opt/vc/bin/tvservice -p', shell=True) 

    subprocess.Popen('fbset -depth 8', shell=True) 

    subprocess.Popen('fbset -depth 16', shell=True) 

    subprocess.Popen('sudo /bin/chvt 6 && sudo /bin/chvt 7', shell=True) 

    Previous_State=1 



  elif Current_State==0 and Previous_State==1: 



    # Ausschalten des Monitors 

    subprocess.Popen('echo Monitor off | wall', shell=True) 

    subprocess.Popen('/opt/vc/bin/tvservice -o', shell=True) 

    Previous_State=0 



  # 5 Sek Warten 

  time.sleep(5) 



except KeyboardInterrupt: 

print " Exit" 

GPIO.cleanup() 

こんにちは、 私は取得しています:「IndentationError:インデントブロックが必要です」というメッセージが表示されるのはなぜですか?

File "PIR.py", line 30 
    time.sleep(60) 
    ^
IndentationError: expected an indented block 

あなたは私を助けることができますか? "time.sleep"の前にタブを設定すると、 "GPIO.input(GPIO_PIR)== 1:"の行に構文エラーが表示されます。 私はこのスクリプトを使用してMagicミラーのPIRセンサーを管理しますが、動作しません。だから、私は "python PIR.py"という端末に書きました。その後、私はエラーを認識し、それはPIRセンサーが動作しないという論理です。しかし、私はPythonのノブですので、私はあなたの助けをしたいと思います。

+1

'try'は新しいブロックを「開く」。次の 'time.sleep(60)'とそれに続くほとんどのものは、 'try..except'の"内側 "になるよう正しく字下げされません。小さなメソッドを使用するとインデント(および一般的にはコード)が順応しやすくなり、適切なPython固有のエディタを使用してコードを編集しながらこれらの問題を強調表示することもできます。 – user2864740

+0

大丈夫、速い答えに感謝します。どのように私はそれを高速に修正することができますか?どのように正しく見える? – XXXL

+0

"即時修正"は、有効な構文であるためにインデントを追加することです。 ['try..except'(字下げを表示する)](https://docs.python.org/2/tutorial/errors.html#handling-exceptions)を使用する方法です。私は 'try..'の中のすべてを' try..except'が実際に働いている問題とは無関係の定型文であるので、別のメソッドに入れることをお勧めします。この変更によってインデントがより明確になる場合もあります。 – user2864740

答えて

0

ブロックは、プログラムまたはスクリプト内の文のグループです。通常は、プログラミング言語またはスクリプト言語に応じて、少なくとも1つのステートメントとブロックの宣言で構成されます。ブロックでグループ化できる言語は、ブロック構造化言語と呼ばれます。 Pythonはそのような言語です。その理由を説明する多くのドキュメントやチュートリアルがあります。 https://www.python-course.eu/python3_blocks.php

try:else:などのように、これらのブロック構造を使用する必要がある場合、コードでこれらのブロック構造の一部が欠落しています。あなたがこれを見る他の例はwhile True:とif - else文です。

#!/usr/bin/python 
# Import der Python libraries 
import RPi.GPIO as GPIO 
import time 
import datetime 
import subprocess 

# Verwendung des Board Mode, Angabe der PIN Nummern anstelle der GPIO BCM Nummer 
GPIO.setmode(GPIO.BOARD) 
# GPIO definieren, bei mir ist es PIN 8 
GPIO_PIR = 8 
# GPIO als "Input" festlegen 
GPIO.setup(GPIO_PIR,GPIO.IN) 
Current_State = 0 
Previous_State = 0 
try: 
    # erst mal schlafen bis der bootvorgang abgeschlossen ist 
    time.sleep(60) 
    # Warten bis Sensor sich meldet 
    while GPIO.input(GPIO_PIR)==1: 
    Current_State = 0 
    subprocess.Popen('echo initilized PIR | wall', shell=True) 
    # Schleife bis CTRL+C 
    while True : 
    #Status von Sensor auslesen 
    Current_State = GPIO.input(GPIO_PIR) 
    if Current_State==1 and Previous_State==0: 
     # Kommando zum anschalten, Frambuffer erneuern 
     subprocess.Popen('echo Monitor on | wall', shell=True) 
     subprocess.Popen('/opt/vc/bin/tvservice -p', shell=True) 
     subprocess.Popen('fbset -depth 8', shell=True) 
     subprocess.Popen('fbset -depth 16', shell=True) 
     subprocess.Popen('sudo /bin/chvt 6 && sudo /bin/chvt 7', shell=True) 
     Previous_State=1 
    elif Current_State==0 and Previous_State==1: 
     # Ausschalten des Monitors 
     subprocess.Popen('echo Monitor off | wall', shell=True) 
     subprocess.Popen('/opt/vc/bin/tvservice -o', shell=True) 
     Previous_State=0 
    # 5 Sek Warten 
    time.sleep(5) 
except KeyboardInterrupt: 
    print " Exit" 
    GPIO.cleanup() 
+0

本当にありがとう!できます。しかし、今私は新しい問題を抱えています。 RPi3でこのpythonファイルをcronjobで開始したいのですが。しかし私は別のウェブサイトで、彼らがcrontab -eで書いているのを見ています。 @reboot /home/pi/PIR.shだから私はPIR.shファイルが必要です。私の最初のアプローチは #!/ usr/bin/python sudo python PIR.pyしかしこれはうまくいきません。手伝って頂けますか ? – XXXL

+0

素晴らしい!この答えを受け入れることで、上記の問題を解決しました。あなたのフォローアップに関しては、cronjobはコマンドを実行するスケジューラーです。最初のステートメント@rebootは、RPi3がリブートしたときにこれを実行するように指示します。このファイルはPythonファイル(.py)なので、 '@reboot python/home/pi/PIR.py'と言うと、/ home/pi /は、ファイル – Magnus

+0

の実際のパスに置き換えてください。ありがとうございました。私は新しい質問があります。 PIRは動作しますが、長い時間が経過してもPIRが動きを検出しない場合、ディスプレイは点灯しません。私はSSHを見ると、PIRが動きを検出するが、ディスプレイには画像が表示されないことがわかります。私に何ができる? – XXXL

関連する問題