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

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

ただいまの
回答率

90.35%

  • Python 2.7

    1509questions

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

  • Raspberry Pi

    1145questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 245

myamagami

score 9

前提・実現したいこと

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'

該当のソースコード

#ソースコード1(main.py)
#!/usr/bin/env python
# -*- coding: utf8 -*-
import wx
import wx.lib.newevent
import nfc
import threading
from binascii import hexlify
import  MySQLdb
import datetime
import scale

ShowCardEvent, SHOW_CARD_EVENT = wx.lib.newevent.NewEvent()
GoneCardEvent, GONE_CARD_EVENT = wx.lib.newevent.NewEvent()

class TagReader(threading.Thread):
    def __init__(self, wx_frame):
        super(TagReader, self).__init__(name="TagReader")
        self.terminate = False
        self.wx_frame = wx_frame

    def run(self):
        clf = nfc.ContactlessFrontend('usb')
        rdwr_options = {
            'on-connect': self.on_tag_connect,
            'on-release': self.on_tag_release
        }
        while not self.terminate:
            clf.connect(rdwr=rdwr_options, terminate=lambda: self.terminate)

    def on_tag_connect(self, tag):
        wx.PostEvent(self.wx_frame, ShowCardEvent(tag=tag))
        return True

    def on_tag_release(self, tag):
        wx.PostEvent(self.wx_frame, GoneCardEvent())

class Frame(wx.Frame):
    def __init__(self, title):
        w = 600
        h = 300
        super(Frame, self).__init__(None, title=title, size=(w, h))
        self.SetBackgroundColour('skyblue')
        self.Centre()
        self.CreateStatusBar()
        self.SetStatusText('株式会社○○商事')
        icon = wx.Icon('favicon.ico',wx.BITMAP_TYPE_ICO)
        self.SetIcon(icon)
        self.userId = wx.Panel(self,wx.ID_ANY,pos=(50,50),size=(550,50))
        self.userId.SetBackgroundColour('skyblue')
        self.message = wx.Panel(self,wx.ID_ANY,pos=(50,100),size=(550,50))
        self.message.SetBackgroundColour('skyblue')
        self.data = wx.Panel(self,wx.ID_ANY,pos=(50,150),size=(300,120))
        self.data.SetBackgroundColour('skyblue')
        font = wx.Font(20,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_NORMAL)
        self.userId = wx.StaticText(self.userId ,wx.ID_ANY ,'' ,style=wx.TE_RIGHT)
        self.userId.SetFont(font)
        self.message = wx.StaticText(self.message,wx.ID_ANY,'',style=wx.TE_CENTER)
        self.message.SetFont(font)
        font = wx.Font(64,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_NORMAL)
        self.data = wx.StaticText(self.data,wx.ID_ANY,'',style=wx.ALIGN_CENTER)
        self.data.SetFont(font)
        self.Bind(SHOW_CARD_EVENT, self.show_card_event)
        self.Bind(GONE_CARD_EVENT, self.gone_card_event)
        self.Bind(wx.EVT_CLOSE, self.close_window_event)
        wx.PostEvent(self, GoneCardEvent())
        self.Show()

    def close_window_event(self, event):
        self.Destroy()

    def show_card_event(self, event):
        global _salute;
        self.userId.SetLabel("Card ID: {}".format(hexlify(event.tag.identifier)))
        connector = MySQLdb.connect(host="localhost",db="db_name",user="root",passwd="********",charset="utf8")
        cursor = connector.cursor()
        sql_1 = "select * from idm where idm= '%s'" %(hexlify(event.tag.identifier))
        result_1 = cursor.execute(sql_1)
        if result_1 == 0:
            self.userId.SetLabel("")
            self.message.SetForegroundColour("red")
            self.message.SetLabel("登録されていないカードです")            
            self.data.SetLabel("")
            self.Refresh()
        else:
            record_1 = cursor.fetchone()
            idm = record_1[0]
            userId = record_1[1]
            self.userId.SetLabel(userId)
            sql_2 = "select * from db_table where login_id= '%s'" %(userId)
            result_2 = cursor.execute(sql_2)
            record_2 = cursor.fetchone()
            handle = record_2[1] + u"さん"
            self.userId.SetLabel(handle)
            self.message.SetLabel("静かに体重計に乗ってください")
            self.data.SetLabel("0.0 kg")
       #ここに体重測定の部分(ソースコード3)を入れる

    def gone_card_event(self, event):
        self.userId.SetLabel("")
        self.message.SetForegroundColour("black")
        self.message.SetLabel("カードをカードリーダーに乗せてください")
        self.data.SetLabel("")

app = wx.App()
reader = TagReader(Frame('体重測定'))
reader.start()
app.MainLoop()
reader.terminate = True  # tell the reader to terminate
reader.join()  # and wait for the reader thread to finish

#ソースコード2(scale.py)
#!/usr/bin/python
# coding: UTF-8

import sys
import time
import RPi.GPIO as GPIO

INPUT_PIN = 14
BIT_LEN = 39

class SaluteConnector:
  def __init__(self):
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(INPUT_PIN, GPIO.IN)
    return

  def getStatus(self):
    bits,count = self.readBits()
    status = 0
    weight = 0
    if count == BIT_LEN:
      status = (bits >> 26) & 0b11
      weight = (bits >> 8) & 0b1111111111111111
    # status 0:最初 / 1:途中 / 3:決定
    return status,weight

  def readBits(self):
    count = 0
    bits = 0
    while True:
      pulse = self.pulseIn(INPUT_PIN, GPIO.HIGH, 0.07)
      if pulse == 0:
        break
      # 0: 1000ms / 1: 500ms 
      bit = 0 if 0.00075 < pulse else 1
      pos = 0 if BIT_LEN < count else (BIT_LEN - count)
      bits = bits | (bit << pos)
      count+=1
    return bits,count

  def pulseIn(self, PIN, value=GPIO.HIGH, timeout=1000000):
    if value==GPIO.HIGH:
      inv_value = GPIO.LOW
    elif value==GPIO.LOW:
      inv_value = GPIO.HIGH
    t_start = time.time()
    t_end1 = t_start
    t_end2 = t_start
    while GPIO.input(PIN) == inv_value:
      t_end1 = time.time()
    if timeout < time.time() - t_start:
      return 0
    while GPIO.input(PIN) == value:
      t_end2 = time.time()
    if timeout < time.time() - t_start:
      return 0
    return t_end2 - t_end1 

#ソースコード3
            _salute = scale.SaluteConnector()
            status=0
            weight=0
            weight = 800
            while status < 3:
                status,weight = _salute.getStatus()
                w=str(weight/10.0) + 'kg'
                self.data.SetLabel(w)
            self.data.SetLabel(w)

試したこと

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

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

raspberry Pi 3
raspbian 8.0
python 2.7.9
wxPython 2.8.12.1

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/30 16:36

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

    キャンセル

  • 2019/02/03 10:41

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

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 2.7

    1509questions

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

  • Raspberry Pi

    1145questions

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