質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1077閲覧

Pythonとラズパイで簡単な防犯システムを作っているが、うまく動かない。

shuh_fjk

総合スコア0

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/16 10:17

Pythonとラズベリーパイで、防犯システムを作っているんですが、赤外線センサで感知すると、ラズパイに信号が送られ、一回感知すると音声1が流れ、二回感知すると音声2が流れ、三回感知すると音声3が流れ、四回感知すると音声4が流れ、音声4が流れると、次反応した時、音声1から流れるというシステムです。

なのになぜか、一回センサが反応すると、一気に音声2,3,4が流れてしまいます。何もセンサにかざしてないのに、勝手に音声が流れます。どこかプログラムがおかしいでしょうか。見てください!お願いします!

Python

1try: 2 while True: 3 flag = GPIO.input(PIN_IN) == GPIO.HIGH //信号を受け取る部分 4 if (flag == True) and (sensor_count==0): //一回感知した場合 5 Play_warning_voice1() 6 sensor_count = sensor_count + 1 7 8 elif (flag == True) and (sensor_count==1): //二回感知した場合 9 Play_warning_voice2() 10 sensor_count = sensor_count + 1 11 12 elif (flag == True) and (sensor_count==2)://三回感知した場合 13 Play_warning_voice3() 14 sensor_count = sensor_count + 1 15 16 elif (flag == True) and (sensor_count>=3): //四回感知した場合 17 Play_warning_voice4() 18 sensor_count = 0 19 20 else: 21 pass 22 23except KeyboardInterrupt: 24 exit() 25 26finally: 27 GPIO.cleanup()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

イメージ説明

別の回答の質問を見ていて、ちょっと絵を描いてみました。

一番上が、赤外線センサーが検知したことを表わします。

flagの値はそのときflag = GPIO.input(PIN_IN) == GPIO.HIGHで得られる値です。
whileループがぐるぐる回ると、一番下の点々のタイミングでチェックしてしまうので、何度もTrueになり、その度に音声が流れてしまうのです。

どうすればいいのかというと、 何を検知したいのかを考えればよいのです。
検知したいのは、「遮った」ことですよね。 それは、Trueであるかどうかではなく、flag False から Trueになったこと = flagの立ち上がりを検出すればいいということになります。

flagがFalseからTrueになったことをチェックするのですがら、「前のフラグの状態」を持つ変数previous_flagを設けて、flagの「変化」をチェックできるようにします。

そこだけ抽出すると、

python

1 previous_flag = False 2 while True: 3 flag = GPIO.input(PIN_IN) == GPIO.HIGH //信号を受け取る部分 4 5 if previous_flag == False and flag == True: 6 Play_warning_voice1() 7 8 previous_flag = flag

こんな感じです。
これなら、遮ったときに1回だけ鳴るようになります。

投稿2021/07/16 13:28

TakaiY

総合スコア13687

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

flag = GPIO.input(PIN_IN) == GPIO.HIGH

そりゃー信号がHighの間はぐるぐる回るからそうなって当然ですなー
一回検出したら、Lowになるのを待つようにすればいいかと

投稿2021/07/16 10:27

y_waiwai

総合スコア88024

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shuh_fjk

2021/07/16 10:33

どこにtime.sleepをいれればいいですかね。。。
y_waiwai

2021/07/16 10:38

Sleep入れる、というのではダメです。 赤外線センサがそのSleepの時間以上ONになったら破綻しますがな
shuh_fjk

2021/07/16 10:40

sleep以外に方法はありますか。。 おねがいします!
y_waiwai

2021/07/16 10:42

だから回答にかいてありますがな
shuh_fjk

2021/07/16 10:50

ifやelifのそれぞれの最後の行にflag=Falseを追加するっていうことですか・・? 一回検出したら、Lowになるのを待つ方法がわかりません。。。
y_waiwai

2021/07/16 10:52

GPIO.input(PIN_IN)がLowになるまでループしてればいいんです #実際の製品とするなら、そんなぬるいことではダメですが
shuh_fjk

2021/07/16 11:08

while (flag == True): print("Preparering for next step") if flag == False: break みたいなのをそれぞれのifやelifの最後に追加す感じですかね。。?
y_waiwai

2021/07/16 11:10

赤外線センサがLowになるまで待ちましょうな。 flagは勝手にLowにはならんでしょう #なんでこっちが書いてることを無視するんだか。
shuh_fjk

2021/07/16 11:15

ごめんなさい。。。 僕のセンサの理解があまりなくて、、どのようなコードを追加すればいいか、教えていただけませんか。。 お願いします!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問