1

私は Raspberry Pi で python スクリプトを実行しています。4 つの gpio ピンを使用しています。3 つを出力として、1 つを入力として使用しています。入力が低く設定されると、出力がすべて異なる時間にオン/オフされ、pygame.mixer を使用して効果音が再生されるという手順がアクティブになります。入力によって手順がアクティブにならなくなるという問題が発生し始めました。さらに調べてみると、120回しか機能しないことがわかり、入力によって手順がアクティブ化されなくなり、エラーメッセージが表示されなくなりました。私はPythonでのコーディングの専門家ではないので、私のコードはおそらく面倒です。これがコードです。

    import RPi.GPIO as GPIO
    import sys
    import time
    import pygame
    import os
    from array import *

    print "loading program"
    GPIO.setmode(GPIO.BCM)
    GpioPinsOut=[4,17,27]
    for a in range (0, len(GpioPinsOut)):
        GPIO.setup(GpioPinsOut[a], GPIO.OUT)
    GpioPinsIn=[7,]
    for y in range (0, len(GpioPinsIn)):
        GPIO.setup(GpioPinsIn[y], GPIO.IN)
    start=0
    prevTriggered=0
    triggered=0
    elapsed=0
    vars=[0,]
    inVars=[0]
    prevInVars=[5,5]
    sceneNames=["Night"]
    onoffVar=  [1, 0]
    onoffVar2= ["On", "Off"]
    outputNamesFinal=['output1','output2','output3']
    outputNames= [[['output1','output2','output3'],['output1','output2','output3','reset']]]
    outputs=     [[[4        ,17       ,27       ],[4        ,17       ,27       ,'reset']]]
    times=       [[[0.0      ,0.0      ,0.0      ],[11.7     ,18.0     ,18.0     ,18.0   ]]]
    printGpioVar=[[[0        ,0        ,0        ],[0        ,0        ,0        ,0      ]]]
    outputsAlwaysOn=[[]]
    for va in range (0, len(GpioPinsOut)):
        GPIO.output(GpioPinsOut[va], False)
    for za in range (0, len(outputsAlwaysOn[0])):
        GPIO.output(outputsAlwaysOn[0][za], True)               
    effects=[[],[]]
    effectslocations=[['/root/audio/soundeffect.wav']]
    pygame.mixer.init(44100, -16, 2, 2048)
    for ba in range (0, len(effectslocations)):
        for bb in range (0, len(effectslocations[ba])):
            effectsVar = pygame.mixer.Sound(effectslocations[ba][bb])
            effects[ba].append(effectsVar)
    effectsNumbers=[[0  ]]
    effectsTimes=  [[0.0]]
    sfxVAR = 0
    numberOfTimes=0
    print "program ready"
    try:
        while True:
            for z in range (0, len(GpioPinsIn)):
                if GPIO.input(GpioPinsIn[z]) == False:
                    inVars[z]=0
                else:
                    inVars[z]=1
            if inVars[0] == 0:
                triggered = 1

            if triggered == 1:
                if prevTriggered != triggered:
                    print "Trigger Activated"
                    if start == 0:
                        print "Start Time Activated"
                        numberOfTimes+=1
                        print numberOfTimes
                        start = time.clock()
                elapsed = time.clock() - start
                for g in range(0, len(effectsTimes[0])):
                    if elapsed >= effectsTimes[0][g]:
                        if sfxVAR == 0:
                            effects[0][effectsNumbers[0][g]].play()
                            sfxVAR = 1

                for c in range (0, len(times[0])):
                    for d in range (0, len(times[0][c])):
                        if elapsed >= times[0][c][d]:
                            if outputs[0][c][d] == "reset":
                                print "done with %s procedures"%sceneNames[0]
                                for e in range (0, len(printGpioVar[0])):
                                    for f in range (0, len(printGpioVar[0][e])):
                                        printGpioVar[0][e][f]=0 
                                start=0
                                prevTriggered=0
                                sfxVAR=0
                                triggered=0

                            else:
                                if printGpioVar[0][c][d]==0:
                                    GPIO.output(outputs[0][c][d], onoffVar[c])
                                    print "Turned %s %s"%(onoffVar2[c], outputNames[0][c][d])
                                    printGpioVar[0][c][d]=1

                prevTriggered = triggered
            for g in range (0, len(inVars)):
                prevInVars[g]=inVars[g]
    except KeyboardInterrupt:
        GPIO.cleanup()
        sys.exit()
4

1 に答える 1