何回か前の nt 富山で ble advertise を使った環境情報(e.g. 温度湿度照度など)観測の試作を出したんだけど当時は nRF51 に欠陥があることを知らなかったので会場では使いものにならなかった。 今回の nt 金沢では nRF52 で汚名を雪ぐ。
あと、前回は通信 soft の画面そのものを見せていたけれどもう少し実用というか体裁を整えよう、と画策した結果 tkinter に落ち着いた。
その画面がこれ。
こんな感じで電流(など)が表示される。
通信 soft の window が 2 つ出てるのは どちらの code も別 thread を使っており これをひとつにまとめて書く術が時間内に分からなかったため。
逃げ策として ble scan 側で udp socket に書き出し、udp 受け側で tkinter を使っている。 後者の python コードがこれ。
import threading
import socket
import tkinter
root = tkinter.Tk()
root.title("BLE Advertised UDP ClampMeter") # 適宜適合されたし
root.geometry("386x133")
root.configure(bg='#d8c8b8')
root.resizable(False, False)
root.attributes("-alpha",0.75)
host = '127.0.0.1' # 適宜適合されたし
port = 32032
def udp_recv(): # スレッドの中身
while True: # 待ち - 読み の繰り返し
try :
print('Waiting message')
message, cli_addr = sock.recvfrom(512)
message = message.decode()
print(f'Received message is [{message}]')
target = ','
ix = message.find(target)
op1 = int(message[:ix])/100 # camma より前を切り出し
op2 = message[ix+1:] # camma 1 以降を切り出し
letter = str(op1) + ' [A]'
disp["text"] = letter
except KeyboardInterrupt:
sock.close()
break
#
global udp_recv_thread # 受信用スレッドの handle
ip_addr = (host, port)
sock = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM) # お馴染み udp socket 生成
sock.bind(ip_addr)
print('create socket')
disp = tkinter.Label( # label 部分の宣言というか生成
background='#d8c8b8', # label 部分の背景色
foreground='#803208', # 文字色
# relief = tkinter.SOLID,
# borderwidth = 1, # label 部分を見たいときに deremark
font = ('Times', 36) ,
anchor = tkinter.E, # 枠の中で右詰め
padx = 10,
pady = 4 )
disp.pack(anchor = tkinter.E, padx = 64, pady = 32) # 枠そのものの右詰め
udp_recv_thread = threading.Thread(target=udp_recv, daemon=True)
udp_recv_thread.start()
root.mainloop()
sock.close()
# eof
電力線の電流を読むための回路を付けて nt 金沢 @2024 に出展し、動作は問題なかったが ble scan に時間が掛かるので電流を逐次見るには間隔が開きすぎて不適切な応用、かもという印象。 まあ無線 ct は nRF52|sam d51 ではなく nxp でやるつもりなのでこれ以上は突っ込まない。
環境情報なら分単位かそれ以上だから幕間に sleep できるので最適かと思う。