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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

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

Q&A

解決済

2回答

637閲覧

測定画面表示時のみセンサーの反応を受け取れるプログラムを作りたい

tomo1998

総合スコア34

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

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

0グッド

1クリップ

投稿2018/11/04 14:32

前提・実現したいこと

Raspberry Piで
メニュー画面と測定画面を表示できるプログラムファイルに、
センサーから反応を受け取るプログラムファイルをモジュールとして使い
測定画面を表示している間は、センサーからの反応を受け取ることが可能で、逆にメニュー画面を表示されている間はセンサーからの反応を受け取らない というプログラムを作成しています

発生している問題・エラーメッセージ

以下のプログラムでは、上で書いたような仕様は実現できるのですが、しかしどういうわけか、2回目に測定画面に来たら、センサーが反応したときのセリフが2回出力、3回目に来たら3回表示、6回目なら6回表示、、と、見た感じセンサーに関するメソッドが多重に呼び出されているのかも・・・

該当のソースコード

画面担当プログラム

python3

1import tkinter as tk 2import ModuleTest as M1 3#メニュー画面 4def menu_gui(): 5 def callMeasur_gui(): 6 print("pressed01") 7 root.destroy() 8 measuring01_gui() 9 10 root=tk.Tk() 11 12 Button001=tk.Button(root,text="Measure",command=callMeasur_gui) 13 Button001.grid(column=0,row=2) 14 15 root.mainloop() 16#測定画面 17def measuring01_gui(): 18 def callMenu_gui(): 19 root.destroy() 20 menu_gui() 21 22 M1.cleanup() 23 24 M1.SetUp() 25 root=tk.Tk() 26 Button004=tk.Button(root,text="Back to Menu",width=15,command=callMenu_gui) 27 Button004.pack(side="left") 28 29 root.mainloop() 30 31menu_gui() 32

センサー担当プログラム

python3

1import RPi.GPIO as GPIO 2 3def SetUp(): 4 GPIO.setmode(GPIO.BCM) 5 GPIO.setup(4, GPIO.IN) 6 GPIO.add_event_detect(4,GPIO.BOTH,callback=Button) 7 8def Button(channel): 9 status=GPIO.input(4) 10 if status==1: 11 print("Button is pressed") 12 13def cleanup(): 14 print("clean up") 15 GPIO.cleanup()

分かりにくく難しいかもしれませんが、手伝ってくださいー!お願いしまっす!

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

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

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

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

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

guest

回答2

0

自己解決

ちょっと色々コードを書き換えた結果、コードの見た目が少し変わっちゃいましたが・・・
GPIO.cleanup()を実行する前に、GPIO.remove_event_detect(4) を書くことで指定されたPINの処理を解除できるので、これで重複問題を解決できました。

モジュール側のコードは以下の様になります

、、、
import RPi.GPIO as GPIO

def SetUp():
GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN)
GPIO.add_event_detect(4,GPIO.BOTH,callback=Button)

def Button(channel):
status=GPIO.input(4)
if status==1:
print("Button is pressed")

def cleanup():
print("clean up")
GPIO.remove_event_detect(4)
GPIO.cleanup()
、、、

投稿2018/11/12 17:54

tomo1998

総合スコア34

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

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

0

SetUpが呼ばれるたびに、GPIO.add_event_detectが呼び出され、コールバック関数が繰り返し登録されてしまいますね

投稿2018/11/04 14:43

y_waiwai

総合スコア87749

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

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

tomo1998

2018/11/06 21:50

しかし、GPIO.add_event_detectは毎回呼び出されないといけない故、実行する必要がありますし、callbackに関数を登録しないとセンサーが反応したときに処理関数が呼び出されなくなります・・・どうすればいいんでしょうか?
y_waiwai

2018/11/06 22:08

GPIOのオープン、コールバック登録は最初に一回だけにしておいて、コールバックの方で他画面表示のときは実行しないようにコードを組めばどうでしょう
tomo1998

2018/11/12 17:51

callbackを一度しか登録しないようにして、自分なりに色々試したのですが、うまく行きませんでした それで、自分で色々さらに調べたところ、GPIO.remove_event_detect(4)を使う事でこの問題を解消できることがわかりました。 回答の投稿はありがたかったのですが、申し訳ないです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問