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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Raspberry Pi

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

Q&A

解決済

1回答

437閲覧

GPIOからの入力をwxPythonで表示させたい

myamagami

総合スコア15

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Raspberry Pi

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

0グッド

0クリップ

投稿2019/01/30 05:16

前提・実現したいこと

raspberry PiにICカードリーダを接続し、iDmを読み取って個人を特定、その人の体重を測定してデータベースに登録する、というシステムを考えています。

カードがおかれていない場合、「カードをカードリーダに置いてください」と表示、
未登録のカードの場合は「未登録のカードです」と表示、
登録済みのカードの場合は、日も付けられたユーザ名を表示し、体重計に乗るように指示、
カードを取り除くと「カードをカードリーダに置いてください」と表示
ここまでは完成しています。(ソースコード1、main.py)

また、赤外線でデータを発する体重計のデータをGPIOから読み取り、コンソールに出力することも
https://qiita.com/kidapu/items/4ca6528d69130ecd34b4
を参考にして完成しています。(ソースコード2、scale.py)

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

「登録済みのユーザの体重を量って記録する」という処理をしたいので、上記プログラムリスト1のdef show_card_event(self, event):の末尾にソースコード3を挿入したのですが、プログラムの挙動は、未登録のカードの場合は「未登録のカードです」と表示(想定どおり)されるものの、登録済みのカードの場合は画面に変化がなく、画面の指示がないまま体重計に乗ると、測定値が確定した段階で画面の表示が切り替わり、体重計に乗るように指示する表示になります。

体重計に乗る指示を表示した後で体重計に乗り、変化する値をリアルタイムで画面に表示させるというのが目標です。

測定値をデータベースに登録する部分はまだ作っていません。

プログラムを終了させた後、コンソールに下記のWarningが表示されます。

ご教示、よろしくお願いいたします。

(python:2455): GLib-GObject-WARNING **: /build/glib2.0-tTvduh/glib2.0-2.42.1/./gobject/gsignal.c: 2579: instance '0xfb1548' has no handler with id '131' (python:2455): GLib-GObject-WARNING **: /build/glib2.0-tTvduh/glib2.0-2.42.1/./gobject/gsignal.c: 2579: instance '0x109a280' has no handler with id '200' (python:2455): GLib-GObject-WARNING **: /build/glib2.0-tTvduh/glib2.0-2.42.1/./gobject/gsignal.c: 2579: instance '0x10c7000' has no handler with id '269' (python:2455): GLib-GObject-WARNING **: /build/glib2.0-tTvduh/glib2.0-2.42.1/./gobject/gsignal.c: 2579: instance '0x10c7500' has no handler with id '338' (python:2455): GLib-GObject-WARNING **: /build/glib2.0-tTvduh/glib2.0-2.42.1/./gobject/gsignal.c: 2579: instance '0xfb1048' has no handler with id '55'

該当のソースコード

python

1#ソースコード1(main.py) 2#!/usr/bin/env python 3# -*- coding: utf8 -*- 4import wx 5import wx.lib.newevent 6import nfc 7import threading 8from binascii import hexlify 9import MySQLdb 10import datetime 11import scale 12 13ShowCardEvent, SHOW_CARD_EVENT = wx.lib.newevent.NewEvent() 14GoneCardEvent, GONE_CARD_EVENT = wx.lib.newevent.NewEvent() 15 16class TagReader(threading.Thread): 17 def __init__(self, wx_frame): 18 super(TagReader, self).__init__(name="TagReader") 19 self.terminate = False 20 self.wx_frame = wx_frame 21 22 def run(self): 23 clf = nfc.ContactlessFrontend('usb') 24 rdwr_options = { 25 'on-connect': self.on_tag_connect, 26 'on-release': self.on_tag_release 27 } 28 while not self.terminate: 29 clf.connect(rdwr=rdwr_options, terminate=lambda: self.terminate) 30 31 def on_tag_connect(self, tag): 32 wx.PostEvent(self.wx_frame, ShowCardEvent(tag=tag)) 33 return True 34 35 def on_tag_release(self, tag): 36 wx.PostEvent(self.wx_frame, GoneCardEvent()) 37 38class Frame(wx.Frame): 39 def __init__(self, title): 40 w = 600 41 h = 300 42 super(Frame, self).__init__(None, title=title, size=(w, h)) 43 self.SetBackgroundColour('skyblue') 44 self.Centre() 45 self.CreateStatusBar() 46 self.SetStatusText('株式会社○○商事') 47 icon = wx.Icon('favicon.ico',wx.BITMAP_TYPE_ICO) 48 self.SetIcon(icon) 49 self.userId = wx.Panel(self,wx.ID_ANY,pos=(50,50),size=(550,50)) 50 self.userId.SetBackgroundColour('skyblue') 51 self.message = wx.Panel(self,wx.ID_ANY,pos=(50,100),size=(550,50)) 52 self.message.SetBackgroundColour('skyblue') 53 self.data = wx.Panel(self,wx.ID_ANY,pos=(50,150),size=(300,120)) 54 self.data.SetBackgroundColour('skyblue') 55 font = wx.Font(20,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_NORMAL) 56 self.userId = wx.StaticText(self.userId ,wx.ID_ANY ,'' ,style=wx.TE_RIGHT) 57 self.userId.SetFont(font) 58 self.message = wx.StaticText(self.message,wx.ID_ANY,'',style=wx.TE_CENTER) 59 self.message.SetFont(font) 60 font = wx.Font(64,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_NORMAL) 61 self.data = wx.StaticText(self.data,wx.ID_ANY,'',style=wx.ALIGN_CENTER) 62 self.data.SetFont(font) 63 self.Bind(SHOW_CARD_EVENT, self.show_card_event) 64 self.Bind(GONE_CARD_EVENT, self.gone_card_event) 65 self.Bind(wx.EVT_CLOSE, self.close_window_event) 66 wx.PostEvent(self, GoneCardEvent()) 67 self.Show() 68 69 def close_window_event(self, event): 70 self.Destroy() 71 72 def show_card_event(self, event): 73 global _salute; 74 self.userId.SetLabel("Card ID: {}".format(hexlify(event.tag.identifier))) 75 connector = MySQLdb.connect(host="localhost",db="db_name",user="root",passwd="********",charset="utf8") 76 cursor = connector.cursor() 77 sql_1 = "select * from idm where idm= '%s'" %(hexlify(event.tag.identifier)) 78 result_1 = cursor.execute(sql_1) 79 if result_1 == 0: 80 self.userId.SetLabel("") 81 self.message.SetForegroundColour("red") 82 self.message.SetLabel("登録されていないカードです") 83 self.data.SetLabel("") 84 self.Refresh() 85 else: 86 record_1 = cursor.fetchone() 87 idm = record_1[0] 88 userId = record_1[1] 89 self.userId.SetLabel(userId) 90 sql_2 = "select * from db_table where login_id= '%s'" %(userId) 91 result_2 = cursor.execute(sql_2) 92 record_2 = cursor.fetchone() 93 handle = record_2[1] + u"さん" 94 self.userId.SetLabel(handle) 95 self.message.SetLabel("静かに体重計に乗ってください") 96 self.data.SetLabel("0.0 kg") 97       #ここに体重測定の部分(ソースコード3)を入れる 98 99 def gone_card_event(self, event): 100 self.userId.SetLabel("") 101 self.message.SetForegroundColour("black") 102 self.message.SetLabel("カードをカードリーダーに乗せてください") 103 self.data.SetLabel("") 104 105app = wx.App() 106reader = TagReader(Frame('体重測定')) 107reader.start() 108app.MainLoop() 109reader.terminate = True # tell the reader to terminate 110reader.join() # and wait for the reader thread to finish 111 112#ソースコード2(scale.py) 113#!/usr/bin/python 114# coding: UTF-8 115 116import sys 117import time 118import RPi.GPIO as GPIO 119 120INPUT_PIN = 14 121BIT_LEN = 39 122 123class SaluteConnector: 124 def __init__(self): 125 GPIO.setmode(GPIO.BCM) 126 GPIO.setup(INPUT_PIN, GPIO.IN) 127 return 128 129 def getStatus(self): 130 bits,count = self.readBits() 131 status = 0 132 weight = 0 133 if count == BIT_LEN: 134 status = (bits >> 26) & 0b11 135 weight = (bits >> 8) & 0b1111111111111111 136 # status 0:最初 / 1:途中 / 3:決定 137 return status,weight 138 139 def readBits(self): 140 count = 0 141 bits = 0 142 while True: 143 pulse = self.pulseIn(INPUT_PIN, GPIO.HIGH, 0.07) 144 if pulse == 0: 145 break 146 # 0: 1000ms / 1: 500ms 147 bit = 0 if 0.00075 < pulse else 1 148 pos = 0 if BIT_LEN < count else (BIT_LEN - count) 149 bits = bits | (bit << pos) 150 count+=1 151 return bits,count 152 153 def pulseIn(self, PIN, value=GPIO.HIGH, timeout=1000000): 154 if value==GPIO.HIGH: 155 inv_value = GPIO.LOW 156 elif value==GPIO.LOW: 157 inv_value = GPIO.HIGH 158 t_start = time.time() 159 t_end1 = t_start 160 t_end2 = t_start 161 while GPIO.input(PIN) == inv_value: 162 t_end1 = time.time() 163 if timeout < time.time() - t_start: 164 return 0 165 while GPIO.input(PIN) == value: 166 t_end2 = time.time() 167 if timeout < time.time() - t_start: 168 return 0 169 return t_end2 - t_end1 170 171#ソースコード3 172 _salute = scale.SaluteConnector() 173 status=0 174 weight=0 175 weight = 800 176 while status < 3: 177 status,weight = _salute.getStatus() 178 w=str(weight/10.0) + 'kg' 179 self.data.SetLabel(w) 180 self.data.SetLabel(w) 181

試したこと

各行をコメントアウトしながら実行。問題点を見つけるにはいたりませんでした。

補足情報(FW/ツールのバージョンなど)

raspberry Pi 3
raspbian 8.0
python 2.7.9
wxPython 2.8.12.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

ソースコード3では、体重計の体重取得するまで処理を戻さないようになってしまっているので、提示されている動作になってるものと思われます。

体重データを取得できないうちは即処理を戻すようにすればいいというはなしになりますが、赤外線通信の都合でそれがうまくいくかは不明ですが。

投稿2019/01/30 05:32

y_waiwai

総合スコア87747

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

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

myamagami

2019/01/30 07:36

回答、ありがとうございます。 その直前の「体重計に乗ってください」の表示がされないのはなぜでしょうか? その表示をした後で体重計の信号を読みに行くようにしているつもりです。追加部分の直前に表示のリフレッシュなども入れてみましたがうまくいきません。
myamagami

2019/02/03 01:41

アドバイスの意味をようやく理解しました。 結果を逐一返すように修正して思い通りの動きとなりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問