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

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

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

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

Q&A

1回答

1418閲覧

Python if文の動作がワンテンポ遅れる

hiro0927

総合スコア3

Python

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

0グッド

0クリップ

投稿2022/01/10 06:16

編集2022/01/10 12:54

pythonについてです。
無線モジュールtwiliteとmonstickを用いた制御をしています。 今現在、twiliteを子機、monostickを親機として親機で子機1 子機2から温度情報を得ています。子機1の論理デバイスの値は0x01子機2の論理デバイスは0x05
そしてどちらからの温度が25度を超え、かつ子機1の方が子機2より温度高い場合、デューティー0のpwm信号を子機1.2の2つに送る。
25度を超え子機2の方が1より高い場合はデューティー100のpwm信号を子機1.2の2つに送ることをしてLEDを光らせています。
ここで問題が発生しました。
それは子機1.2が同時に点灯消灯することなく、子機1が点灯したあとワンテンポ遅れた次の温度情報を得るタイミングで子機2も点灯し、結果的に1.2が両方が点灯するというものです。
なぜ、同時に点灯消灯しないかわかりません。これを同時に動作させたいのですがどうすればよいでしょうか?
ちなみに全ての子機を表す0x78では同時でした
今手元にないので確認できないのですがflush使えばなんとかなりますかね?

python

1import struct, binascii, serial 2import time 3 4# コマンド0x80を送信する関数 5def sendTWELite(s, sendto = 0x78, 6 digital = [-1, -1, -1, -1], 7 analog = [-1, -1, -1, -1]): 8 # 先頭3バイト 9 data = [sendto, 0x80, 0x01] 10 11 # デジタル出力 12 do = 0 13 domask = 0 14 for index, value in enumerate(digital): 15 if value >= 0: 16 domask |= 1 << index 17 do |= (value & 1) << index 18 data.append(do) 19 data.append(domask) 20 21 # アナログ出力 22 for index, value in enumerate(analog): 23 if value >= 0 and value <= 100: 24 v = int(1024 * value / 100) 25 data.append(v >> 8) 26 data.append(v & 0xff) 27 else: 28 data.append(0xff) 29 data.append(0xff) 30 31 # チェックサムを計算する 32 chksum = 0 33 for val in data: 34 chksum = (chksum + val) & 0xff 35 data.append((0x100 - chksum) & 0xff) 36 37 # 16進数文字列に変換する 38 ss = struct.Struct("14B") 39 outstring = str(binascii.hexlify(ss.pack(*data)), 'utf-8').upper() 40 41 # TWE-Liteに送信する 42 s.write(bytes(":" + outstring + "\r\n", 'utf-8')) 43 return 44 45 46# I2Cを制御する関数 47def accessI2C(s, sendto = 0x01, reqno = 0x00, command = 0x01, 48 i2caddress = 0x00, i2ccommand = 0x00, 49 data = [], readbyte = -1): 50 51 # データを作成する 52 if readbyte == -1: 53 # dataを書き込む 54 sendbytes = [sendto, 0x88, reqno, command, i2caddress, i2ccommand, len(data)] 55 # dataを加える 56 sendbytes.extend(data) 57 else: 58 # readbyteだけ読み取る(dataは利用しない) 59 sendbytes = [sendto, 0x88, reqno, command, i2caddress, i2ccommand, readbyte] 60 61 # チェックサムを計算する 62 chksum = 0 63 for val in sendbytes: 64 chksum = (chksum + val) & 0xff 65 sendbytes.append((0x100 - chksum) & 0xff) 66 67 # 16進数文字列に変換する 68 bytelen = len(sendbytes) 69 ss = struct.Struct(str(bytelen) + "B") 70 outstring = str(binascii.hexlify(ss.pack(*sendbytes)), 'utf-8').upper() 71 72 # TWE-Liteに送信する 73 s.write(bytes(":" + outstring + "\r\n", 'utf-8')) 74 75 # 結果を待つ 76 # 10回繰り返す 77 for i in range(10): 78 status = str(s.readline(), 'utf-8') 79 if status[0:9] == ":" + outstring[0:2] + "89" + outstring[4:8]: 80 # 該当の応答結果である 81 # 行頭の「:」と行末の改行を取り除く 82 status = status[1:].rstrip() 83 # バイトデータに変換する 84 ss = struct.Struct(">BBBBBB") 85 parsed = ss.unpack(binascii.unhexlify(status[0:12])) 86 if status[4]: 87 # I2Cへのアクセスに成功 88 # 得たバイトを戻り値として返す 89 ss = struct.Struct(str(parsed[5]) + "B") 90 result = ss.unpack(binascii.unhexlify(status[12:len(status) - 2])) 91 return result 92 else: 93 # 失敗 94 return False 95 break 96 return False 97 98 99 100def accessI2C2(s, sendto = 0x05, reqno = 0x00, command = 0x01, 101 i2caddress = 0x00, i2ccommand = 0x00, 102 data = [], readbyte = -1): 103 104 # データを作成する 105 if readbyte == -1: 106 # dataを書き込む 107 sendbytes = [sendto, 0x88, reqno, command, i2caddress, i2ccommand, len(data)] 108 # dataを加える 109 sendbytes.extend(data) 110 else: 111 # readbyteだけ読み取る(dataは利用しない) 112 sendbytes = [sendto, 0x88, reqno, command, i2caddress, i2ccommand, readbyte] 113 114 # チェックサムを計算する 115 chksum = 0 116 for val in sendbytes: 117 chksum = (chksum + val) & 0xff 118 sendbytes.append((0x100 - chksum) & 0xff) 119 120 # 16進数文字列に変換する 121 bytelen = len(sendbytes) 122 ss = struct.Struct(str(bytelen) + "B") 123 outstring = str(binascii.hexlify(ss.pack(*sendbytes)), 'utf-8').upper() 124 125 # TWE-Liteに送信する 126 s.write(bytes(":" + outstring + "\r\n", 'utf-8')) 127 128 # 結果を待つ 129 # 10回繰り返す 130 for i in range(10): 131 status = str(s.readline(), 'utf-8') 132 if status[0:9] == ":" + outstring[0:2] + "89" + outstring[4:8]: 133 # 該当の応答結果である 134 # 行頭の「:」と行末の改行を取り除く 135 status = status[1:].rstrip() 136 # バイトデータに変換する 137 ss = struct.Struct(">BBBBBB") 138 parsed = ss.unpack(binascii.unhexlify(status[0:12])) 139 if status[4]: 140 # I2Cへのアクセスに成功 141 # 得たバイトを戻り値として返す 142 ss = struct.Struct(str(parsed[5]) + "B") 143 result = ss.unpack(binascii.unhexlify(status[12:len(status) - 2])) 144 return result 145 else: 146 # 失敗 147 return False 148 break 149 return False 150 151 152# COM3を開く 153s = serial.Serial(4, 115200) 154#すべてのLEDを消灯 155v = 0 156sendTWELite(s, sendto = 0x78,analog =[v, -1, -1, -1]) 157 158while 1: 159 time.sleep(10) 160 while 1: 161 # コンフィグレーションレジスタを設定して初期化する 162 # 16ビット、ワンショットモード 163 accessI2C(s, command = 0x01, i2caddress = 0x48, i2ccommand = 0x03, data=[0x80], sendto = 0x01) 164 # 温度の値を読み取る 165 result = accessI2C(s, command = 0x04, i2caddress = 0x48, i2ccommand = 0x00, readbyte = 2) 166 if result: 167 # 16ビットの値に変換 168 val = result[0] * 256 + result[1] 169 # 温度に変換 170 if val & 0x8000 : 171 # 負の温度 172 t = (val - 32768) / 128.0 173 else: 174 # 正の温度 175 t = val / 128.0 176 print("子機1温度=" + str(t)) 177 break 178 179 180 while 1: 181 # コンフィグレーションレジスタを設定して初期化する 182 # 16ビット、ワンショットモード 183 accessI2C2(s, command = 0x01, i2caddress = 0x48, i2ccommand = 0x03, data=[0x80], sendto = 0x05) 184 # 温度の値を読み取る 185 result2 = accessI2C2(s, command = 0x04, i2caddress = 0x48, i2ccommand = 0x00, readbyte = 2) 186 if result2: 187 #16ビットの値に変換 188 val2 = result2[0] * 256 + result2[1] 189 #温度に変換 190 if val2 & 0x8000 : 191 # 負の温度 192 t2 = (val - 32768) / 128.0 193 else: 194 # 正の温度 195 t2 = val2 / 128.0 196 print("子機2温度=" + str(t2)) 197 break 198 199 200 while 1: 201 #一番高い温度を表示 202 tmax = t 203 if t2>tmax: 204 tmax = t2 205 print("最高温度=" + str(tmax)) 206 break 207 208 if(tmax>25 and t>t2): 209 w = 0 210 x = 0 211 sendTWELite(s, sendto = 0x01,analog =[w, -1, -1, -1]) 212 sendTWELite(s, sendto = 0x05,analog =[x, -1, -1, -1]) 213 if(tmax>25 and t<t2): 214 w = 100 215 sendTWELite(s, sendto = 0x01,analog =[w, -1, -1, -1]) 216 x = 100 217 sendTWELite(s, sendto = 0x05,analog =[x, -1, -1, -1]) 218 #if(tmax<25 and t>t2): 219 #w = 100 220 #x = 100 221 #sendTWELite(s, sendto = 0x01,analog =[w, -1, -1, -1]) 222 #sendTWELite(s, sendto = 0x05,analog =[x, -1, -1, -1]) 223 #if(tmax<25 and t<t2): 224 #w = 0 225 #sendTWELite(s, sendto = 0x01,analog =[w, -1, -1, -1]) 226 #x = 0 227 #sendTWELite(s, sendto = 0x05,analog =[x, -1, -1, -1]) 228 229# COMを閉じる 230s.close()

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

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

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

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

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

y_waiwai

2022/01/10 08:48

子機1とか子機2とかは何でしょうか。 そこらへんの説明をしましょう。
guest

回答1

0

for文で関数を引き出しの回数を増やすことで強引に見かけ上は同時に光らせることにしました

投稿2022/01/11 04:10

hiro0927

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問