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

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

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

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Raspberry Pi

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

Python

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

Q&A

解決済

2回答

1155閲覧

変数が意図せず書き換えられてしまうのを防ぎたい

yusuke__

総合スコア2

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Raspberry Pi

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

Python

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

0グッド

1クリップ

投稿2021/07/10 15:03

編集2021/07/10 15:04

前提・実現したいこと

Raspberry PiとNFCリーダー、NFCタグを6面に貼ったキューブを使って、NFCのキューブの下にある面が変わった瞬間にGoogle Calendarに自分の行動(何時から何時まで勉強等)を記録するデバイスを作りたいと考えています。(IFTTTと連携)
一面だけの場合はできたのですが、6面になると前の方にあるコードが後ろ側のコードの変数を書き換えてしまうのでうまく作動しません。

該当のソースコード

python3

1 2#import 3import requests 4import datetime 5import pytz 6import binascii 7import nfc 8import os 9import time 10 11#set up 12before_idm = b'0000000' 13before = 0 14before_time = 0 15title = 0 16Status = 0 17time1 = 0 18time2 = 0 19 20#nfc-cubeが動いたときを感知してIFTTTに連携 21 22#問題箇所 23 24def cube(number,title_value): 25 global before 26 global Status 27 global before_time 28 global time1 29 global time2 30 global title 31 32 if before != number and Status == number: 33 print("【 Touched 】") 34 title = title_value 35 print(title) 36 print ("IFTTT連携開始") 37 before_time = time1 38 time1 = datetime.datetime.now(pytz.timezone('Asia/Tokyo')) 39#↑---この変数が他の関数cubeによって書き換えられてしまう 40 41 if before == number and Status != number: 42 time2 = datetime.datetime.now(pytz.timezone('Asia/Tokyo')) 43 payload = {"value1": time1, "value2": time2, "value3": title } 44 url = "〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇" 45 response = requests.post(url, data=payload) 46 print ("IFTTT連携終了") 47 48#nfcの読み取り 49 50class MyCardReader(object): 51 52 def on_connect(self, tag): 53 54 global Status 55 global before_idm 56 #IDmのみ取得して表示 57 self.idm = binascii.hexlify(tag._nfcid) 58 #print("IDm : " + str(self.idm)) 59 60 #特定のIDmだった場合のアクション 61 if before_idm != b'ec99c54f' and self.idm == b'ec99c54f': 62 Status = 1 63 64 if before_idm != b'9c2cc44f' and self.idm == b'9c2cc44f': 65 Status = 2 66 67 if before_idm != b'acf1c54f' and self.idm == b'acf1c54f': 68 Status = 3 69 70 if before_idm != b'6cf1c54f' and self.idm == b'6cf1c54f': 71 Status = 4 72 73 if before_idm != b'2c9ac54f' and self.idm == b'2c9ac54f': 74 Status = 5 75 76 if before_idm != b'dc2cc44f' and self.idm == b'dc2cc44f': 77 Status = 6 78 79 before_idm = self.idm 80 81 82 return True 83 84 def read_id(self): 85 clf = nfc.ContactlessFrontend('usb') 86 try: 87 clf.connect(rdwr={'on-connect': self.on_connect}) 88 finally: 89 clf.close() 90 91if __name__ == '__main__': 92 cr = MyCardReader() 93 while True: 94 #最初に表示 95 print("Please Touch") 96 97 #タッチ待ち 98 cr.read_id() 99 100 cube(1,'仕事') 101 102 cube(2,'休憩') 103 104 cube(3,'読書') 105 106 cube(4,'勉強') 107 108 cube(5,'料理') 109 110 cube(6,'余白') 111 112 113 before = Status

試したこと

time の部分を関数cubeの引数にしたりもしたのですがうまくいきませんでした。

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

プログラミング自体が超初心者なのでコードが汚いですが、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

自己解決

python3

1class MyCardReader(object): 2IDM1 = b'ec99c54f' 3IDM2 = b'9c2cc44f' 4IDM3 = b'acf1c54f' 5IDM4 = b'6cf1c54f' 6IDM5 = b'2c9ac54f' 7IDM6 = b'dc2cc44f' 8 9# 初期化処理 10def __init__(self): 11self.idm = b'0000000' 12self.last_changed = datetime.datetime.now(pytz.timezone('Asia/Tokyo')) 13 14def on_cube_changed(self, number, title): 15print("【 Touched 】") 16print(title) 17print ("IFTTT連携開始") 18time = datetime.datetime.now(pytz.timezone('Asia/Tokyo')) 19 20payload = {"value1": self.last_changed, "value2": time, "value3": title } 21url = "〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇" 22response = requests.post(url, data=payload) 23 24print ("IFTTT連携終了") 25self.last_changed = time 26 27def on_connect(self, tag): 28idm = binascii.hexlify(tag._nfcid) 29 30if idm != self.idm: 31if idm == self.IDM1: 32self.on_cube_changed(1,'仕事') 33if idm == self.IDM2: 34self.on_cube_changed(2,'休憩') 35if idm == self.IDM3: 36self.on_cube_changed(3,'読書') 37if idm == self.IDM4: 38self.on_cube_changed(4,'勉強') 39if idm == self.IDM5: 40self.on_cube_changed(5,'料理') 41if idm == self.IDM6: 42self.on_cube_changed(6,'余白') 43 44self.idm = idm 45 46return True 47 48def read_id(self): 49clf = nfc.ContactlessFrontend('usb') 50try: 51clf.connect(rdwr={'on-connect': self.on_connect}) 52finally: 53clf.close() 54 55if __name__ == '__main__': 56cr = MyCardReader() 57while True: 58#最初に表示 59print("Please Touch") 60 61#タッチ待ち 62cr.read_id() 63

とすることでやりたい機能が実現できました。

投稿2021/09/19 07:21

yusuke__

総合スコア2

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

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

0

python

1if __name__ == '__main__': 2 cr = MyCardReader() 3 4 time1 = datetime.datetime.now(pytz.timezone('Asia/Tokyo')) 5

time1はプログラム上ずっと一緒の値なのであれば、__main__関数で定義した後、__cube__関数では追記しないという手段があると思います。

投稿2021/07/10 17:47

toshikawa

総合スコア388

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問