こちらのサイトのソースコードを参考に、複数のLEDを光らせる間に一定以上の音が鳴った場合音が鳴った回数を記録するというプログラムを組もうとしました。
しかし、複数のLEDを2秒ごとに切り替えるのですが、切り替えのプログラムをwhile構文で書いているため、一定以上の音が鳴った回数の記録とLEDの切り替えが同時に行えません。これを、一定以上の音が鳴った回数の記録を常時行いながらLEDを切り替えたいです。
動作環境はRaspberry Pi3 TypeBです。
ソースコードが現在手元に無いため機能を別のものに差し替えたコードで説明します。
python
1import time 2import random 3 4cnt = 0 5i =0 6rdm = 0 7score = 0 8while True: 9 rdm = random.randint(0, 15) 10 while i < 5: 11 print("LED_Change") 12 time.sleep(0.5) 13 i += 1 14 15 if rdm > 9: 16 score += 1 17 print("score=" + str(score)) 18 print(rdm) 19 20 #cnt += 1 21 #if cnt > 10: 22 # break 23
今、**randomint()**で常時整数を生成します。これが上記で言う録音とします。
そして、以下のコードが一定以上の音量が鳴った回数の記録としています。
python
1if rdm > 9: 2 score += 1 3 print("score=" + str(score)) 4
**print("LED_Change")**がLEDの切り替えで、5回行います。
この時結果が
LED_Change LED_Change LED_Change LED_Change LED_Change 8 5 8 score 1 13 3 score 2 13 8 score 3 11 2 score 4 12 score 5 11
このようになり、LEDの切り替えを先に行ってしまいます。
なのLED_Changeの0.5秒の待ち時間中にもランダム数字の生成を行うようにするにはどうすればいいでしょうか。
実際のコードがなく、分かりづらい説明になってしまいましたがどうか回答お願いいたします。
追記
ソースコードがある状況なので、こちらのコードを参照ください。全体の動作に関しては上記のものと変わりません
threadingを用いてマルチスレッドで動かすことにしました。
こちらを参考に上記の機能を関数化して以下のコードで実効しました。
python
1import threading 2import elcFunc as ef 3import judgeFunction as jf 4 5ef.initAll() 6 7if __name__ == "__main__": 8 thread1 = threading.Thread(target = jf.judgeFunc()) 9 thread2 = threading.Thread(target = ef.noteStart()) 10 11 thread1.start() 12 thread2.start() 13 14 jf.judgeEnd()
jf.judgeFunc()一定以上の音量が鳴った回数を保存する、ef.noteStart()がLEDを起動して切り替える関数となっています
このコードの実行結果は、並行に関数を実行せずにただただ一定以上の音を監視する関数が続いてしまいました。原因がわかりません...
judgeFunc()
python
1def judgeFunc(): 2 while True: 3 global score 4 data = stream.read(CHUNK) 5 x = np.frombuffer(data, dtype="int16") / 32768.0 6 if x.max() > threshold: 7 score += 1 8 print(score) 9
noteStart()
python
1def noteStart(): 2 global a,i 3 4 while a == True: 5 print("Start") 6 wiringpi.digitalWrite(GPIO26, LOW) 7 wiringpi.digitalWrite(GPIO21, LOW) 8 9 lf.noteLeft(random.randint(0, 15)) 10 suc = rf.noteRight(random.randint(0, 15)) 11 time.sleep(2) 12 13 while i < 28: 14 lf.noteLeft(suc) 15 suc = rf.noteRight(random.randint(0, 15)) 16 time.sleep(2) 17 i = i+1 18 19 wiringpi.digitalWrite(GPIO21, HIGH) 20 rf.endRight() 21 22 lf.noteLeft(suc) 23 time.sleep(2) 24 25 wiringpi.digitalWrite(GPIO26, HIGH) 26 lf.endLeft() 27 28 a = False
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/10 02:27
2018/07/10 02:59
2018/07/11 04:39